WebRTC 源码阅读笔记之传输层反馈 TransportPacketsFeedback

Table of Contents

TransportPacketsFeedback

发送方将自己保存的包信息结合接收方反馈的接收消息

struct TransportPacketsFeedback {
  TransportPacketsFeedback();
  TransportPacketsFeedback(const TransportPacketsFeedback& other);
  ~TransportPacketsFeedback();
  //反馈的时间
  Timestamp feedback_time = Timestamp::PlusInfinity();
  //第一个没有响应的包的发送时间
  Timestamp first_unacked_send_time = Timestamp::PlusInfinity();
  //发送过的数据包大小
  DataSize data_in_flight = DataSize::Zero();
  //先前发送过的数据包大小
  DataSize prior_in_flight = DataSize::Zero();
  //反馈的数据包接收结果
  std::vector<PacketResult> packet_feedbacks;

  // Arrival times for messages without send time information.
  std::vector<Timestamp> sendless_arrival_times;
  //将上述的反馈结果进行分类
  std::vector<PacketResult> ReceivedWithSendInfo() const;
  std::vector<PacketResult> LostWithSendInfo() const;
  std::vector<PacketResult> PacketsWithFeedback() const;
  std::vector<PacketResult> SortedByReceiveTime() const;
};

PacketResult

struct PacketResult {
  class ReceiveTimeOrder {
   public:
    bool operator()(const PacketResult& lhs, const PacketResult& rhs);
  };

  PacketResult();
  PacketResult(const PacketResult&);
  ~PacketResult();

  inline bool IsReceived() const { return !receive_time.IsPlusInfinity(); }
  //发送的包
  SentPacket sent_packet;
  //接收的时间
  Timestamp receive_time = Timestamp::PlusInfinity();
};

SendPacket


struct SentPacket {
  Timestamp send_time = Timestamp::PlusInfinity();
  // Size of packet with overhead up to IP layer.
  // 数据包大小,不包括 IP 包头
  DataSize size = DataSize::Zero();
  // Size of preceeding packets that are not part of feedback.
  // 不在反馈消息内的先前未响应的包的大小
  DataSize prior_unacked_data = DataSize::Zero();
  // Probe cluster id and parameters including bitrate, number of packets and
  // number of bytes.
  // 探测集群 id 和参数,包括比特率, 包的个数和字节数
  PacedPacketInfo pacing_info;
  // True if the packet is an audio packet, false for video, padding, RTX etc.
  // 是否是一个音频包
  bool audio = false;
  // Transport independent sequence number, any tracked packet should have a
  // sequence number that is unique over the whole call and increasing by 1 for
  // each packet.
  // 传输层的序号, 在这个传输通道上的包单调增长
  int64_t sequence_number;
  // 跟踪的发送过的包大小, 不包括未确认(未收到)的包
  // Tracked data in flight when the packet was sent, excluding unacked data.
  DataSize data_in_flight = DataSize::Zero();
};

PacedPacketInfo

步进包信息


struct PacedPacketInfo {
  PacedPacketInfo();
  PacedPacketInfo(int probe_cluster_id,
                  int probe_cluster_min_probes,
                  int probe_cluster_min_bytes);

  bool operator==(const PacedPacketInfo& rhs) const;

  // TODO(srte): Move probing info to a separate, optional struct.
  //如果不是探测包,probe_cluster_id = -1
  static constexpr int kNotAProbe = -1;
  //发送的比特率
  int send_bitrate_bps = -1;
  //探测包群号
  int probe_cluster_id = kNotAProbe;
  //探测包群最小的探测个数
  int probe_cluster_min_probes = -1;
  //探测包群最小的字节数
  int probe_cluster_min_bytes = -1;
  //探测包群已发送的的探测字节数
  int probe_cluster_bytes_sent = 0;
};

Comments |0|

Legend *) Required fields are marked
**) You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Category: Uncategorized