【问题标题】:Fragmentation of TCP packet at network layer网络层 TCP 数据包的分片
【发布时间】:2017-04-19 02:32:29
【问题描述】:
假设一条 TCP 消息包含 900 个字节的数据和 20 个
TCP 标头的字节数。现在,如果我们有一个可以支持最大帧大小为 512 字节的链路,我们是否会在传输层有 2 个大小足够小的 TCP 数据包,以便它们可以通过该链路发送。还是会在数据链路层进一步碎片化?
以下哪种情况会发生:
Transport layer: h1 data
Network layer: h2 h1 data
data link layer: frame 1 - h3 h2 h1 data-part1
frame 2 - h3 h2 h1 data-part2
或
data link layer: frame 1 - h3 h2 h1 data-part1
frame 2 - h3 data-part2
【问题讨论】:
标签:
networking
tcp
fragmentation
【解决方案1】:
分片是 IPv4 DNA 的一部分,它发生在 IPv4 的第 3 层。 IPv6 已经消除了分片,由发送主机决定只发送正确大小的数据包(预先对数据进行分片)。
路由器在第 3 层(网络层)运行,并且在 IPv4 的路由器中发生分段。如果 IPv6 数据包对于下一跳来说太大,它们会被路由器毫不客气地丢弃,并向源主机发送 ICMPv6 消息。
RFC 791, INTERNET PROTOCOL:
互联网协议还提供分段和重组
长数据报,如有必要,通过“小
分组”网络。
和
互联网协议实现了两个基本功能:寻址和
碎片化。
和
在从一个互联网模块到另一个互联网模块的消息路由中,
数据报可能需要遍历最大数据包大小为
小于数据报的大小。为了克服这个困难,一个
互联网协议中提供了分片机制。
分片过程说明:
碎片化
互联网数据报在产生时需要分段
在允许大数据包大小的本地网络中,并且必须遍历
本地网络,将数据包限制为较小的大小以到达其
目的地。
可以将 Internet 数据报标记为“不分段”。任何互联网
如此标记的数据报不会在任何
情况。如果 Internet 数据报标记为不分段,则不能
在不将其分割的情况下交付到目的地,它将被
而是丢弃。
跨本地网络的分段、传输和重组
对 Internet 协议模块不可见的称为 Intranet
碎片化,可以使用[6]。
互联网碎片和重组程序需要能够
将一个数据报分成几乎任意数量的片段,这些片段可以
稍后重新组装。片段的接收者使用
标识字段,确保不同数据报的分片
不混合。片段偏移字段告诉接收器
片段在原始数据报中的位置。片段偏移
和长度确定原始数据报覆盖的部分
这个片段。 more-fragments 标志指示(通过被重置)
最后一个片段。这些字段提供了足够的信息
重组数据报。
标识字段是用来区分一个片段的
来自另一个人的数据报。始发协议模块
互联网数据报将标识字段设置为必须
对于该源-目标对和协议来说是唯一的
数据报将在互联网系统中处于活动状态。原产地
完整数据报的协议模块将 more-fragments 标志设置为
零和片段偏移量为零。
为了分割一个长的互联网数据报,一个互联网协议模块(对于
例如,在网关中),创建两个新的互联网数据报和副本
将长数据报中的 Internet 标头字段的内容放入
两个新的互联网标题。长数据报的数据被划分
分成 8 个八位字节(64 位)边界上的两个部分(第二部分
可能不是 8 个八位字节的整数倍,但第一个必须是)。
在第一部分 NFB 中调用 8 个八位字节块的数量(对于 Number
片段块)。数据的第一部分放在
第一个新的互联网数据报,总长度字段设置为
第一个数据报的长度。 more-fragments 标志设置为 1。
第二部分数据放在第二个新互联网
数据报,总长度字段设置为
第二个数据报。 more-fragments 标志的值与
长数据报。第二个新的片段偏移量字段
互联网数据报设置为该字段的值在长
数据报加NFB。
这个过程可以推广到 n 路拆分,而不是
描述了双向拆分。
为了组装互联网数据报的片段,互联网
协议模块(例如在目标主机上)结合了互联网
四个字段都具有相同值的数据报:
标识、来源、目的地和协议。组合是
通过将每个片段的数据部分放在相对
由该片段互联网中的片段偏移量指示的位置
标题。第一个片段的片段偏移量为零,并且
最后一个片段的更多片段标志将重置为零。