在学习资料中,经常会用到TCP段的图片,该段位于一个IP数据报内,而该IP数据报又位于一个链路层帧内。
总是这样吗?
是否可以保证 TCP 段是原子的并且包含在一个 IP 数据报中?
数据报和帧也同样适用吗?
我的意思是:
1.
TCP |Segment 1| Segment 2 | Segment 3 |
IP |Datagram 1 | Datagram 2 | Datagram 3 |
因此,基本上 IP 将来自传输层的输入简单地视为字节(就像传输层处理应用层数据一样)
2. 或者可能的情况是,当 IP 和 TCP 边界匹配但更多 TCP 段位于一个 IP 数据报内时,这些 IP 数据报以同一主机为目标,但所包含的 TCP 段是不同 TCP 连接的一部分。
TCP |Segment 1 | Segment 2 | Segment 3| Segment 4| Segment 5 | Segment 6|
IP |Datagram 1 |Datagram 2|Datagram 3 |
答案1
最简洁的答案是不。
IP 堆栈的各层应该与其他层无关。IP 层可以在以太网、802.11 或任何其他协议上运行数据链路层协议。这些层可以自由地以任何它们需要的方式对数据进行分段,以使协议正常工作。理论上,它们可以查看更高级别协议的标头并调整其分段以匹配,但没有要求这样做。
答案2
我假设你问的是是否会出现如下数据流:
TCP: | SEGMENT 1 | SEGMENT 2 | ...
IP: | FRAGMENT 1 | FRAGMENT 2 | FRAGMENT 3 | ...
...也就是说,IP 片段 1 包含 TCP 段 1 的第一部分;IP 片段 2 包含 TCP 段 1 的最后一部分和 TCP 段 2 的第一部分;等等。
你能接收吗?是的。是什么阻碍了它?如果你正在构建接收实现,你必须为世界可能给你带来的任何情况做好准备。
有效吗?同样有效。IP 数据包可能被分段在途中而 TCP 分段应该只发生在端点。我认为单个传输操作系统不太可能传输既分段又碎片的数据,但如果 TCP 实现分段数据根本并通过 IP 网络传输,则 IP 数据在传输过程中可能会被碎片化,并会出现上述行为。
更多信息请参阅 RFC 791,https://www.ietf.org/rfc/rfc791.txt请参阅“碎片”部分。
关于数据包和帧,存在类似的考虑,尽管我没有材料可以引用。IP 实现不应该关心它如何接收 IP 数据包,只要它可以重新建立数据包边界即可,而它可以并且应该在没有来自链路层的边界信息的情况下做到这一点。
在许多情况下,确保数据有效载荷适合单个传输块是有好处的。如果您知道您和目的地之间的 MTU(最大传输单元),那么您可以通过将数据调整到 MTU 来最大化数据吞吐量与协议开销的比率。但这是最好的情况,而不是一般情况。