【发布时间】:2017-10-14 04:36:36
【问题描述】:
下一个数据包的序列号是否得到ack nr加上长度?
或
下一个数据包的序列号是否得到seq nr加上前一个数据包的长度
与
数据包可以随机排列吗?如果是这样,为什么以及如何知道数据包丢失了?
【问题讨论】:
标签: networking wireshark packets
下一个数据包的序列号是否得到ack nr加上长度?
或
下一个数据包的序列号是否得到seq nr加上前一个数据包的长度
与
数据包可以随机排列吗?如果是这样,为什么以及如何知道数据包丢失了?
【问题讨论】:
标签: networking wireshark packets
首先,有两组序列号和确认号对,对话双方各一组。序列号是发送者的当前编号,确认号是接收者对发送者的“下一个预期序列号”的想法。一般来说,它们是这样工作的……
假设: HostA 的初始序列号是 100,HostB 的初始序列号是 200(这些数字是随机的,它们的起始值根本不重要,但它们是在 TCP 3 次握手期间建立的。)
场景:HostA 向 HostB 发送 1000 字节的 TCP 负载:
Seq # Ack # TCP Payload (bytes) Next Seq #
----- ----- ------------------- ----------
100 200 1000 1100
这里,假设 HostA 的初始序列号为 100,因为我们假设它正在发送 1000 字节的 TCP 有效负载,我们计算下一个预期的序列号为 100 + 1000 = 1100。这就是我们的 ACK # '正在从 HostB 中查找,这将向 HostA 指示 HostB 接收到所有 1000 字节的有效负载,并期望来自 HostA 的下一个 TCP 段的序列号为 1100。
HostB 确认从 HostA 接收到上述 TCP 段:
Seq # Ack # TCP Payload (bytes) Next Seq #
----- ----- ------------------- ----------
200 1100 0 200
这是 HostB 的一组序列号和确认号。请注意,该集合完全独立于 HostA 的集合。在这里,HostB 通过向 HostA 发送 1100 的 ACK #(初始序列号为 100 加上额外的 1000 字节有效负载),向 HostA 确认接收到发送方在前一个数据包中发送的所有 1000 字节数据。 HostB 自己的序列号 200 在此数据传输中没有任何作用,除了向 HostA 指示 HostB 没有反向发送回 HostA 的数据。
如果 HostB 确实没有从 HostA 接收到该段,则 ACK HostB 最终将发送回 HostA 将携带只有 100 的 ACK #,因此 HostA 会知道 HostB 没有收到该段携带 1000 字节的有效载荷,因此应该重新传输它。
希望对你有帮助?
欲了解更多信息和更多详情,请参阅RFC 793。
【讨论】: