网络层对数据进行切片后会出现粘包问题吗?

IP 层会对大包进行切片,是不是也有粘包问题?

先说结论,不会。首先前文提到了,粘包其实是由于使用者无法正确区分消息边界导致的一个问题。

先看看 IP 层的切片分包是怎么回事。

图片

P分包与重组

  • 如果消息过长,IP层会按 MTU 长度把消息分成 N 个切片,每个切片带有自身在包里的位置(offset)同样的IP头信息

  • 各个切片在网络中进行传输。每个数据包切片可以在不同的路由中流转,然后在最后的终点汇合后再组装

  • 在接收端收到第一个切片包时会申请一块新内存,创建IP包的数据结构,等待其他切片分包数据到位。

  • 等消息全部到位后就把整个消息包给到上层(传输层)进行处理。

可以看出整个过程,IP 层从按长度切片到把切片组装成一个数据包的过程中,都只管运输,都不需要在意消息的边界和内容,都不在意消息内容了,那就不会有粘包一说了。

粘包这个问题的根因是由于开发人员没有正确理解 TCP 面向字节流的数据传输方式,本身并不是 TCP 的问题,是开发者的问题。

  • TCP 不管发送端要发什么,都基于字节流把数据发到接收端。这个字节流里可能包含上一次想要发的数据的部分信息。接收端根据需要在消息里加上识别消息边界的信息。不加就可能出现粘包问题。

  • TCP 粘包跟Nagle算法有关系,但关闭 Nagle 算法并不解决粘包问题。

  • UDP 是基于数据报的传输协议,不会有粘包问题。

  • IP 层也切片,但是因为不关心消息里有啥,因此有不会有粘包问题。

  • TCP 发送端可以发 10 次字节流数据,接收端可以分 100 次去取;UDP 发送端发了 10 次数据报,那接收端就要在 10 次收完。

猜你喜欢

转载自blog.csdn.net/ThinPikachu/article/details/120616372