TCP 段不是 TCP 数据包的一部分吗?
以下是我读到的内容:
段是一段由 TCP 切割成可传输大小的应用程序数据,并用 TCP 报头包装
TCP 报头本身不是由段组成的吗?
答案1
我们说TCP segment
是协议数据单元,它由 TCP 报头和来自(上层)应用层的应用数据片段(数据包)组成。传输层数据通常命名为segment
,网络层数据单元命名为datagram
但是当我们使用 UDP 作为传输层协议时,我们不说UDP segment
,而是说UDP datagram
。我认为这是因为我们没有对 UDP 数据单元进行分段(当我们使用 TCP 时,在传输层进行分段)。
答案2
原始 TCP RFC 对于术语“段”的使用方式有些模糊。
在某些情况下,“段”一词仅指正在传输的应用程序数据流的当前部分,不包括 TCP 报头。例如,TCP“最大段大小”(MSS) 是此消息中应用程序数据块的最大大小,不包括 TCP 报头。
但在其他情况下,“段”一词包括整个 TCP 消息,包括 TCP 标头。事实上,至少在一种情况下,规范提到了没有应用数据的 TCP 段(例如纯 Acks)。
单个完整的 IP 消息即为一个“数据报”。
原始 IP RFC 将链路层消息称为“数据包”。IP 数据报可以分解为“片段”,以适应小数据包网络上的数据包大小限制。
IEEE 802.3 / 以太网链路层将单个连续的物理层传输称为“数据包”。数据包的 MAC 数据链路部分称为“帧”。帧以目标 MAC 地址开始,以帧校验序列结束。帧中可能包含 IP 数据报(或其片段)的部分称为“MAC 客户端数据字段”。
因此,从技术上讲,不存在“TCP 数据包”或“IP 数据包”之类的东西。数据包是 IP 下层的术语。TCP 有“段”,而 IP 有“数据报”。
答案3
TCP 报头(也称为“段报头”)和有效负载、数据或“段数据”组成了大小各异的 TCP 段。
答案4
tcp 段只是一个概念,它与 ip 碎片整理不同
当你发送大于 IP MTU 的数据时,它将被放入一个 IP 数据包中,但 IP 层发现 IP 数据包太长而无法传输,因此它会将大数据包拆分成几块,每块都有相同的标识符,但偏移量和数据长度不同。接收方负责收集所有碎片,收到所有碎片后,它会将所有碎片重新组装成一个完整的 IP 数据包并将其推送到上层协议层。
但是tcp层有不同的行为。当你发送一个足够大的数据时,tcp层不会将数据放入一个tcp数据包中然后将它们分成几部分(但ip会这样做),它会检索一部分原始数据放入一个tcp数据包中,然后将tcp数据包推送到ip层,tcp数据包的长度由mss决定,稍后它将检索剩余数据的另一部分放入另一个tcp数据包中,并重复该过程,直到所有数据都被传输。
如果 tcp 不使用 mss,那就太可怕了。假设你发送一个大于 mss 的数据,它将被放入一个 tcp 数据包中(由于未使用 mss,数据不会被拆分成小块),tcp 数据包大于 ip mtu,因此 ip 会将 tcp 数据包拆分成碎片。如果任何一个碎片丢失,tcp 数据包将重新传输,浪费时间和带宽
附言:tcp_mss = ip_mtu - tcp_header