【什么是拆包和粘包?】
什么是拆包和粘包?
- 一、粘包
- 二、拆包
- 三、示例
-
- 拆包(Unboxing)示例
- 粘包(Packet Sticking)示例及解决
-
- 使用分隔符解决粘包
- 使用长度字段解决粘包
一、粘包
粘包(Packet Sticky)是指在TCP协议下,由于TCP是面向流的协议,发送方发送的两个数据包可能会被合并成一个数据包发送给接收方。
也就是说,原本两个独立的数据包在接收端被粘合成了一个数据包。
原因:
-
TCP协议本身的特点:TCP是面向流的,它并不关心消息边界,只是将数据看作一连串的字节流进行传输。
-
Nagle算法:为了减少网络中分格较小的包的数量,TCP协议默认使用了Nagle算法,该算法会将较小的数据包合并起来发送。
解决方法:
-
使用定长包:每个数据包的大小固定,接收方按这个大小来读取数据。
-
使用分隔符:在每个数据包的末尾添加特殊的分隔符,接收方通过识别分隔符来区分数据包。
-
使用长度字段:在每个数据包的头部添加一个长度字段,表示该数据包的总长度,接收方根据这个长度来读