如果一个 TCP 数据包被分段,那么对于所有分段的数据包,标头的标识字段是否会保持不变,还是会增加 1 以便接收者知道接下来是什么数据包?
假设一个数据包没有分段,然后直接发送另一个未分段的数据包,它们的标识字段会相差 1 还是完全不同?
如果一个 TCP 数据包被分段,那么对于所有分段的数据包,标头的标识字段是否会保持不变,还是会增加 1 以便接收者知道接下来是什么数据包?
假设一个数据包没有分段,然后直接发送另一个未分段的数据包,它们的标识字段会相差 1 还是完全不同?
... 在TCP数据包中 ...
我假设您说的是 IPv4 标头中的“标识”字段,而不是一些特定于 TCP 的字段。
...或者它会增加1 ...
这个问题可以用三种不同的方式来理解:
1)如果你想知道同一个分片IPv4数据包的不同分片是否有不同的“标识”值:
没有。RFC 791 (IPv4)说属于同一 IPv4 数据包的不同片段通过具有“相同”“标识”值来标识。
2)如果您想知道路由器是否允许在第一次分片时更改尚未分片的数据包的“标识”值:
RFC 791 没有明确说明不允许路由器更改此字段。但它表示第 4 层协议可能会评估“标识”值。这意味着“标识”字段必须原封不动地通过路由器。
3)如果您想知道 TCP/IPv4 实现是否会为每个数据包将此字段增加 1:
RFC 791 说第 4 层协议负责选择“唯一”“标识”值,并且这些值的计算方式由第 4 层决定(例如,递增 1)。
RFC 793 (TCP)没有指定如何计算这些值。这表示 ...
假设一个数据包没有分段,然后直接发送另一个未分段的数据包,它们的标识字段会相差 1 还是完全不同?
...每个 TCP 实现都可以自由计算这些值。
为了节省计算时间,小端计算机上的 TCP 实现可能会将值增加 1,但不交换值的字节。这将导致以下序列:
0, 0x100, 0x200 ... 0xFF00, 1, 0x101, 0x201 ... 0xFF01, 2, 0x102 ...
因为 TCP 实现完全可以自由地计算这些值,所以接收计算机必须假定两个 TCP 数据包的“标识”值“完全不同”(正如您所说的那样)。
在 TCP 的情况下,TCP 标头具有附加字段 - “序列号”和“确认号” - 用于检查某个数据包属于 TCP 连接的哪个位置。
因为这两个字段也可以用来检测重复的数据包,我怀疑 TCP 甚至会评估接收到的数据包的“标识”值。
但是,如果我正确理解 RFC 791,某些第 4 层协议可能会使用“标识”值来检查数据包是否丢失。在这种情况下,该第 4 层协议的规范可能会指定“标识”字段必须为每个数据包增加 1。
如果 TCP 数据包被分段,那么对于所有分段数据包,标头的标识字段是否会保持不变
如图所示,TCP 只处理序列号。终端设备(例如台式计算机)将使用这些序列号来确定发送数据的顺序。它们还与确认一起使用,以确保交付整个有效负载。
但是,标识字段特定于 IP 标头。它们不应该在两个通信设备之间重复,为终端设备提供一种唯一识别来自发送者的数据包并防止重复处理的方法。
说了这么多,
假设一个数据包没有分段,然后直接发送另一个未分段的数据包,它们的标识字段会相差 1 还是完全不同?
IP 标识字段在增量方面不遵循任何普遍规律(如本线程中的其他答案所示)。如果必须交付有效负载,设备将确定增加 ID 字段的最佳方式。
资料来源:为了清楚地了解碎片和分段,请点击此链接: 第 2 层数据将如何碎片化?
为了清楚地了解 IPv4 标识字段,请点击以下链接: IPv4 标头中的标识字段 https://www.rfc-editor.org/rfc/rfc6864
数据包是第 3 层数据报,它们在第 3 层被分段和重组。TCP 是第 4 层协议,使用在第 3 层数据包中携带的段。第 3 层数据包被分段并透明地重组到第 4 层。
IPv4 将分段(如有必要)和重组数据包,并将完全重组数据包的有效负载传递到第 4 层(在这种情况下为 TCP)。TCP 永远不会知道数据包被分段和重组。