网络层TCP数据包的分片

时间:2016-12-04 17:53:37

标签: networking tcp fragmentation

假设TCP消息包含900个字节的数据和20个 TCP头的字节数。现在如果我们有一个可以支持512字节的最大帧大小的链接,我们将在传输层有2个TCP数据包,这些数据包足够小,可以通过此链接发送。或者它们会在数据链路层进一步分散吗?

将发生以下哪种情况:

ScalaCheckExamplesSpec.scala:11: not found: type ScalaCheck
[error] class ScalaCheckExamplesSpec extends Specification with ScalaCheck {

OR

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

1 个答案:

答案 0 :(得分:1)

碎片是IPv4的DNA的一部分,它发生在IPv4的第3层。 IPv6已经消除了碎片,发送主机只能发送正确大小的数据包(预分片数据)。

路由器在第3层(网络层)运行,并且在IPv4的路由器中发生分段。如果IPv6数据包对于下一跳来说太大,则路由器会毫不客气地丢弃它们,并将ICMPv6消息发送回源主机。

RFC 791, INTERNET PROTOCOL

  

互联网协议还提供碎片和重组   如果需要,可以通过“小数据”传输长数据报   包“网络。

  

互联网协议实现了两个基本功能:寻址和   碎片。

  

在将消息从一个互联网模块路由到另一个互联网模块时,   数据报可能需要遍历最大数据包大小为的网络   小于数据报的大小。要克服这个困难,   互联网协议中提供了碎片机制。

碎片化过程的描述:

  

碎片

     

互联网数据报的碎片化是必要的   在允许大数据包大小并且必须遍历a的本地网络中   本地网络将数据包限制为较小的大小以达到其目的   目的地。

     

互联网数据报可以标记为“不要碎片”。任何互联网   如此标记的数据报不会被互联网支离破碎   情况。如果互联网数据报标记不碎片不能   传送到目的地而不会破坏它,它就是   丢弃了。

     

通过本地网络进行分段,传输和重组   互联网协议模块不可见的内容称为内联网   碎片化,可以使用[6]。

     

互联网碎片和重组程序需要能够   将数据报分成几乎任意数量的碎片   稍后重新组装。片段的接收者使用   识别字段,以确保不同数据报的片段   没有混合。片段偏移字段告诉接收器   片段在原始数据报中的位置。片段偏移   和长度确定所涵盖的原始数据报的部分   这个片段。更多片段标志指示(通过重置)   最后一个片段这些字段提供了足够的信息   重新组装数据报。

     

标识字段用于区分一个片段   来自另一个人的数据报。一个起源协议模块   互联网数据报将标识字段设置为必须的值   对于当时的源 - 目的地对和协议是唯一的   数据报将在互联网系统中处于活动状态。起源   完整数据报的协议模块将更多片段标志设置为   零,片段偏移为零。

     

片段化长互联网数据报,互联网协议模块(for   例如,在网关中),创建两个新的互联网数据报和副本   从长数据报到互联网头字段的内容   两个新的互联网标题。长数据报的数据是分开的   在8个八位位组(64位)边界上的两个部分(第二部分   可能不是8个八位字节的整数倍,但第一个必须是)。   在第一部分NFB中调用8个八位字节块的数量(对于数字   片段块)。数据的第一部分放在   第一个新的互联网数据报,并将总长度字段设置为   第一个数据报的长度。更多片段标志设置为1。   第二部分数据放在第二个新的互联网中   数据报,并将总长度字段设置为长度   第二个数据报。更多片段标志带有相同的值   长数据报。第二个新的片段偏移字段   互联网数据报设置为long中该字段的值   数据报加上NFB。

     

此过程可以推广为n路分割,而不是   双向分裂描述。

     

汇集互联网数据报的片段,互联网   协议模块(例如在目的地主机)组合互联网   数据报对于四个字段都具有相同的值:   识别,来源,目的地和协议。组合是   通过将每个片段的数据部分放在相对片段中来完成   由该片段的互联网中的片段偏移指示的位置   头。第一个片段的片段偏移为零,和   最后一个片段将更多片段标志重置为零。