小白网-奉贤部落-奉贤免费信息发布平台

查看: 23|回复: 0
打印 上一主题 下一主题

ip分片tcp分段(tcpip几层)

[复制链接]

2万

主题

2万

帖子

7万

积分

论坛元老

Rank: 8Rank: 8

积分
78182
跳转到指定楼层
楼主
发表于 2025-7-26 13:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从个人微信官方账号出发:戈朗小白的成长
原文地址:动图插画!既然IP层会碎片化,TCP层为什么要碎片化?
什么是TCP分段和IP分片?我们知道网络就像一根管子,管子会有厚度。
一个数据包想通过这个管道从管道的一端传到另一端。(废话)
但是,数据包的量有大有小。如果你考虑管道,数据包不能大于管道的厚度。
问题来了。数据包太大怎么办?
答案很简单。会把包切成小块。这样,数据就可以从大到小顺利转移。
回头看看网络分层协议,数据先经过传输层,再到网络层。
这种行为可能发生在传输层和网络层。
在传输层(TCP协议),它被称为分段。
在网络层(IP层),称为碎片化。(注意,下面提到的IP是指IPV4,除非另有说明)
那么不管是分片还是分段,都要按照一定的长度分段。
在TCP中,这个长度是MSS。
在IP层,这个长度是MTU。
MSS和MTU是什么关系?这在之前的文章中简单提到过。一个人出去。
什么是MSS MSS?MSS:最大分段大小。TCP向IP层提交的最大段大小,不包括TCP头和TCP选项,只包含TCP净荷,MSS是TCP限制应用层发送的最大字节数。假设MTU= 1500字节,MSS = 1500-20 (IP头)-20 (TCP头)= 1460字节。如果应用层有2000字节的传输,需要两个切片才能完成传输,第一个TCP切片= 1460,第二个TCP切片= 540。
如何查看MSS?我们都知道TCP三次握手,MSS会在三次握手的过程中发送给对方,用来通知对方本地最大可接受的TCP报文数据大小(不包括TCP和IP报文头)。
比如上图中,B向A发送其MSS,建议A在向B发送数据时使用MSS=1420进行分段,而当B向A发送数据时,也会带来MSS=1372。两者比较后,取较小的值(1372)作为通信的MSS值。这个过程称为MSS协商。
另外,一般情况下,MSS+20(TCP头)+20(IP头)= MTU,上图抓包图对应的MTU分别为1372+40和1420+40。在同一条路径上,MTU不一定是对称的,也就是说,A到B and B到A,两条路径上的MTU可以不同,对应的ms也可以不同。
三次握手协商MSS后不会改变吗?当然,每次执行TCP发送消息的功能时,都会重新计算MSS,然后进行分段。
如果对端不传输MSS会怎么样?我们来看看TCP的报头。
实际上,MSS是作为一个选项引入的,但一般来说,MSS将被传输。但是,如果有任何机器在实现中调皮捣蛋,MSS将不会作为选项传输。对面呢?
如果没有收到对方TCP的MSS,本地TCP默认为MSS = 536字节。
为什么是536?
Br536(数据)+20(tcp报头)+20(ip报头)= 576字节
如前所述,IP将被切片,然后切片并重组,而这个576正好是IP最小重组缓冲区的大小。
MTU MTU是什么?MTU:最大传输单位,最大传输单位。实际上,这是由数据链路层提供的,以便告诉上层IP层它的传输容量是多少。IP层会据此拆分数据包。通用MTU=1500字节。假设IP层有:需要发送的1500字节数据,需要分片才能完成发送。分片后的IP头ID是一样的。同时,为了在接收端组装分片后的分片,需要在分片后的IP包中加入各种信息。例如该片段在原始IP分组中的偏移。
如何检查MTU?在mac控制台中输入ifconfig命令,您可以看到MTU值是多少。
br $ ipconfigbrlo 0:flags = 8049 MTU 16384 br...bren0: flags=8863 mtu 1500br...brp2p0: flags=8843 mtu 2304br...
你可以看到上面有几个MTU。可以简单理解为每个网卡的处理能力不同,所以对应的MTU也不同。当然这个值是可以修改的,但不在今天讨论的范围内,不展开。
在一台机器的应用层到这台机器网卡的这条链路上,基本上可以保证MSS
为什么MTU一般是1500,其实是传输效率决定的。首先,虽然我们平时用的网络感觉挺稳定的,但其实这是因为TCP在幕后做各种重传,保证传输的可靠性。其实在幕后,线路是容易丢包的,数据包越大,丢包的概率越大。
包不是越小越好吗?也不
但是如果你选择一个相对较小的长度,假设你选择300Byte的MTU,TCP净荷= 300-IP头-TCP头= 300-20-20 = 260字节。有效传输效率= 260/300 = 86%
而如果以太网长度为1500,有效传输效率= 1460/1500 = 96%,显然远高于86%。
所以包越小越不容易丢包,包越大传输效率越高。所以选择1500作为取舍。
为什么IP层是碎片化的,TCP也要碎片化?因为IP层本身会做碎片化。即使TCP不分段,到达IP层时,数据包也会被分段,数据也能正常传输。
既然网络层会碎片化,TCP为什么要碎片化?不是没必要吗?
假设有一大块数据,在TCP层没有分段。如果这个数据在发送的过程中发生丢包,TCP会重传,那么重传的就是这一大段数据(虽然IP层会把数据分成N个MTU长度的包,但是TCP重传的单位就是那一大段数据)。
如果TCP把这个数据分割成n个小于等于MSS长度的包,到达IP层后加上IP头和TCP头,还是小于MTU,那么IP层就不会再分包了。此时传输路上发生丢包,TCP只重传一小部分MSS段。效率会比TCP不分段时高。
同样的,除了TCP,传输层也有UDP协议,但是UDP本身是无法分段的,所以当数据量很大的时候,只能通过IP层分段,然后传输到底层进行传输。
也就是说,一般情况下,在一台机器的传输层到网络层的链路上,如果传输层对数据进行了分段,IP层就不会再分段了。如果传输层不分段,IP层可能会分段。
说白了就是在TCP中对数据进行分段,这样就不需要在IP层进行分段,重传的时候只重传少量的分段数据。
如上所述,在发送端,经过TCP分段后,IP层不会被分段。
但是,在整个传输链路中可能存在其他网络层设备,这些设备的MTU可能小于发送方的MTU。尽管数据包在发送方已经被分段,但它将在IP层再次被分段。
如果链路上有其它MTU更小的设备,它们将再次被分段,最后所有的分段将在接收端被组装。
因此,即使经过TCP分段,链路上其他节点的IP层也可能再次被分段,即使数据第一次被IP分段,也可能第二次、第三次、第四次被其他机器的IP层分段。
IP层怎么才能不碎片化?在上面提到的IP层的传输过程中,由于节点之间的MTU可能不同,数据可能会被分段多次。而且,各种信息都要加到每个片段上,方便接收端的片段重组。那么IP层能不碎片化吗?
如果有办法知道整个链路上最小的MTU是多少,以最小的MTU长度发送数据,那么无论数据到哪个节点,都不会出现碎片。
整个链路中最小的MTU称为PMTU(路径MTU)。
有一种方法可以得到这个PMTU,叫做Path MTU Discovery。
br $ cat/proc/sys/net/IP v4/IP _ no _ pmtu _ disc br 0
默认值为0,表示开启PMTU发现功能。一般现在机器是开着的。
原理比较简单。首先,我们回过头来看看IP数据头。
有一个红旗位DF(不分片),当它置1时,表示这个IP报文没有分片。
当链路上的路由器收到这个报文,当IP报文长度大于路由器的MTU时,路由器会查看这个IP报文的DF。
  • 如果为0(允许分片),则进行分片,并将分片后的数据传输到下一个路由器。
  • 如果它是1,数据将被丢弃,一个ICMP包将被返回给发送者,它将被告知“baa!”数据不可达,所以需要碎片化,用当前机器的MTU。了解了上面的原理之后,我们再来看看PMTU发现是如何实现的。
  • 使用TCP正常发送消息。TCP在传输层分段后,在网络层添加IP头,设置DF为1,然后将消息发送到下层。
  • 这时候链路上有一个路由器因为各种原因MTU变小了。
  • IP消息到达此路由器。路由器发现报文长度大于自己的MTU,报文有自己的DF,防止了分片。把信息扔了吧。同时向发送方返回一个ICMP错误,并自带MTU。
  • 当发送方收到此ICMP消息时,它将更新其MTU并将其记录在PMTU表中。
  • 因为TCP的可靠性,它会尝试重传这个消息,同时用这个新的MTU值计算MSS进行分段。这时,新的IP包可以被刚才的路由器成功转发。
  • 如果路径上有MTU更小的路由器,上面发生的情况还会发生。摘要数据在TCP中是分段的,所以在IP层不需要分段。同时,重传时只重传少量分段数据。
  • 使用MSS进行TCP分段,使用MTU进行IP分段。
  • MSS由MTU计算,可能会在三次握手和发送消息时发生变化。
  • IP碎片化是不得已而为之。尽量不要在IP层分片,尤其是链路上中间设备的IP分片。所以在IPv6中,禁止中间节点设备对IP报文进行分片,只能在链路的始端和末端进行分片。
  • 连接建立后,当路径上节点的MTU值发生变化时,可以通过PMTU发现并更新发送方的MTU值。在这种情况下,PMTU通过浪费N个发射机找到将被交换的PMTU。TCP因为重传可以保证可靠性,相当于UDP中直接丢失消息。最后,画一幅动人的画太难了。。。看完请赞一下。下一次,画面会更猛。
    欢迎加入我,看着对方的朋友圈砍一刀,哈哈。
    如果文章对你有帮助,看看文章右下角,做点积极的事情(点两下)支持一下。(疯狂提示,拜托拜托,这对我真的很重要!)
    我是小白。下次再见。
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|小白网-奉贤部落-奉贤免费信息发布平台  

    GMT+8, 2025-8-21 23:51 , Processed in 0.056096 second(s), 21 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表