tcp粘包现象
粘包现象
-
为什么TCP会粘包UDP不会
- UDP传输会有网络最大宽带限制,一般情况不用于传输大文件(除非对限制进行设置)消息之间有边界
- TCP传输是通过拆包进行网络传输的,可以传输大文件,但是也导致多条消息之间没有边界发生粘包
-
为什么会出现粘包现象
- 粘包现象只发生在TCP协议中,TCP协议多条消息之间没有边界,并且还有一大堆优化的算法
- 发送端:两条消失都很短,发送的间隔时间短
- 接受端:多条消息由于没有及时接受,而在缓存端推在一起导致粘包
-
struct模块:可以将2G的数字转换成四个字节,在转换回来
- struct.pack 转换成四个字节
- struct.unpack 转换回原来数字
-
粘包现象怎么解决
-
发送方:计算将要发送数据的长度,发送方通过struct.pack模块把长度转换成固定的4个字节,发送四个字节的长度。
-
接收方:接受四个字节在使用struct.unpack把4个字节转换成数字,这个数字就是我们要接受数据的长度,接受完长度后再根据长度接受数据
-
服务端
# 服务端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',1321)) sk.listen() conn,addr=sk.accept() mag1=input('>>>') mag2=input('>>>') conn.send(struct.pack('i',len(mag1))) conn.send(struct.pack('i',len(mag2))) conn.send(mag1.encode('utf-8')) conn.send(mag2.encode('utf-8')) conn.close() sk.close()
-
客户端
#客户段 import socket import time import struct sk=socket.socket() sk.connect(('127.0.0.1',1321)) time.sleep(0.1) m1=struct.unpack('i',sk.recv(4))[0] m2=struct.unpack('i',sk.recv(4))[0] mag1=sk.recv(m1).decode('utf-8') mag2=sk.recv(m2).decode('utf-8') print(m1) print(m2) print(mag1) print(mag2) sk.close()
-