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