TCP到了IP层的时候,到底IP对不对他分片?

时间:2022-12-24 17:59:02
查到一个网友的回答:
tcp是根據路徑最大mtu值在進行分片,對於tcp來說,他不願看到tcp包被ip層分片的情況出現,這樣會影響效率,因為比如一個tcp包被ip層分成三片,接收方如果收到兩片掉了一片,那麼收到的兩片也得要丟掉.這是ip層的做法,但是tcp顯然是受不了這樣的情況的,所以tcp本身就根據mtu進行了分片,這樣就算丟,重傳的消費也不大.

我的问题是:TCP段本身就会对数据分成很多块在交给IP,就是不知道IP层会不会在对他进行分片,如果不会,送出去后,经过的路由还会给他分片吗?

5 个解决方案

#1


还有个问题就是TCP本身就会对数据分成很多块,当TCP发送一个段出去,他是一直要等待收到确认后,在继续发呢,还是怎么样的?

#2


他的回答不是全对!

   1.首先纠正一个概念,在tcp层不是“分片”,在tcp层称为“分段”;
   2.tcp是不会按照“路径最大mtu”来分段的,是按照下边的过程来确定如何分段的;
        1)tcp在连接建立时会进行3路握手;在这个过程中,每一方都会将自己期望接收的MSS(最大分段长度,由本地网卡mtu-40得到)发送给对方,如果对方接受这个mss,对方就会按照发过来的mss来进行分段;如果对方不接受,对方会默认设置自己的mss为536;
        2)一般常见的mss为1460(1460+20tcp头部+20ip头部 == 1500),1500正好等于 以太网对于“数据桢”的限制,大于1500的ip数据报,ip层是会对他进行分片的。
        3)另外一个常见的mss为536(536+20tcp头部+20ip头部 == 576),这是因为tcp/ip规定
任何ipv4实现都必须支持最小的数据包大小,对于ipv4,是576;设置mss=536是为了避免产生大于
“最小ip数据包大小”,导致ip分片;(不过总体上来说这种情况很少!)


你的问题
    经过双方协商后,tcp设置后mss后,经过tcp分段后,传递给本地ip层,本地ip层是不会发生ip分片的。但是在中间路由器上可能发生ip分片!因为路由器的网卡的mtu可能小于需要转发的ip数据报的大小。
    这个时候再路由器上发生两种情况
    1.如果源发送端设置了这个ip数据包可以分片(默认设置),路由器将ip数据报分片后转发
    2.如果源发送端设置了这个ip数据报不可以分片,路由器将ip数据报丢弃,并产生icmp 分片错误消息给源发送端

#3


默认情况下是不等待一个分段的确认到达,继续发送下一个分段。因为确认不一定是同步的。

但是在打开Nagle算法选项后,在发出当前分段后,发送下一个分段之前,是会等待一定的时间的,如果时间到了,当前分段的确认还没有来,就会接着发送下一个分段

#4


看书上说有的系统会有一种办法,他可以知道重源地址到目的地址经过的最小MTU,这样TCP交给IP层报文段,IP不会对他分片而且经过的路由等都会不对他分片。是这样的吗?

#5


目前好想没有这样的tcp/ip实现,而且也不是tcp/ip标准的要求

要得到路径最大mtu,通常是应用层进程 为了最后的程序优化,避免端到端的任何一个节点上出现ip分片,才会得到路径最大mtu,这并不是tcp/ip协议实现的功能

要得到路径最大mtu书上有讲

#1


还有个问题就是TCP本身就会对数据分成很多块,当TCP发送一个段出去,他是一直要等待收到确认后,在继续发呢,还是怎么样的?

#2


他的回答不是全对!

   1.首先纠正一个概念,在tcp层不是“分片”,在tcp层称为“分段”;
   2.tcp是不会按照“路径最大mtu”来分段的,是按照下边的过程来确定如何分段的;
        1)tcp在连接建立时会进行3路握手;在这个过程中,每一方都会将自己期望接收的MSS(最大分段长度,由本地网卡mtu-40得到)发送给对方,如果对方接受这个mss,对方就会按照发过来的mss来进行分段;如果对方不接受,对方会默认设置自己的mss为536;
        2)一般常见的mss为1460(1460+20tcp头部+20ip头部 == 1500),1500正好等于 以太网对于“数据桢”的限制,大于1500的ip数据报,ip层是会对他进行分片的。
        3)另外一个常见的mss为536(536+20tcp头部+20ip头部 == 576),这是因为tcp/ip规定
任何ipv4实现都必须支持最小的数据包大小,对于ipv4,是576;设置mss=536是为了避免产生大于
“最小ip数据包大小”,导致ip分片;(不过总体上来说这种情况很少!)


你的问题
    经过双方协商后,tcp设置后mss后,经过tcp分段后,传递给本地ip层,本地ip层是不会发生ip分片的。但是在中间路由器上可能发生ip分片!因为路由器的网卡的mtu可能小于需要转发的ip数据报的大小。
    这个时候再路由器上发生两种情况
    1.如果源发送端设置了这个ip数据包可以分片(默认设置),路由器将ip数据报分片后转发
    2.如果源发送端设置了这个ip数据报不可以分片,路由器将ip数据报丢弃,并产生icmp 分片错误消息给源发送端

#3


默认情况下是不等待一个分段的确认到达,继续发送下一个分段。因为确认不一定是同步的。

但是在打开Nagle算法选项后,在发出当前分段后,发送下一个分段之前,是会等待一定的时间的,如果时间到了,当前分段的确认还没有来,就会接着发送下一个分段

#4


看书上说有的系统会有一种办法,他可以知道重源地址到目的地址经过的最小MTU,这样TCP交给IP层报文段,IP不会对他分片而且经过的路由等都会不对他分片。是这样的吗?

#5


目前好想没有这样的tcp/ip实现,而且也不是tcp/ip标准的要求

要得到路径最大mtu,通常是应用层进程 为了最后的程序优化,避免端到端的任何一个节点上出现ip分片,才会得到路径最大mtu,这并不是tcp/ip协议实现的功能

要得到路径最大mtu书上有讲