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

查看: 66|回复: 0

ip分片tcp分段(tcpip几层)

[复制链接]

2万

主题

0

回帖

8万

积分

论坛元老

Rank: 8Rank: 8

积分
88256
发表于 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-11-11 20:38 , Processed in 0.277770 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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