TCP两种黏包现象及其成因
第一种
1 import socket 2 3 sk = socket.socket() 4 sk.bind(("127.0.0.1", 8080)) 5 sk.listen() 6 conn, addr = sk.accept() 7 ret1 = conn.recv(2) 8 ret2 = conn.recv(8) 9 print(ret1) 10 print(ret2) 11 conn.close() 12 sk.close()
1 import socket 2 3 sk = socket.socket() 4 sk.connect(("127.0.0.1", 8080)) 5 sk.send(b"hello") 6 sk.send(b"world") 7 sk.close()
1 b'he' 2 b'lloworld'
原因
当一个数据发送超过接收的大小时,剩余的数据会进入系统的缓冲区内,下一次再接收时会把上一次没传完的数据继续接收这也就造成了第二次发送的数据和第一次发送的数据混在一起的现象
这种现象被称作黏包
第二种
1 import socket 2 3 sk = socket.socket() 4 sk.bind(("127.0.0.1", 8080)) 5 sk.listen() 6 conn, addr = sk.accept() 7 ret1 = conn.recv(12) 8 print(ret1) 9 conn.close() 10 sk.close()
1 import socket 2 3 sk = socket.socket() 4 sk.connect(("127.0.0.1", 8080)) 5 sk.send(b"hello") 6 sk.send(b"world") 7 sk.close()
1 b'helloworld'
原因
这种现象的原因是TCP协议本身的优化算法造成的
优化算法的功能是:连续两次send如果时间间隔小且两个数据包的大小都很小,则把这两个数据包合并成一个数据包来发送