粘包
粘包:主要是指多个包粘在一起,发生此现象的原因,是由于客户端设置的最大接收字节不够。
粘包的底层原理
1.运行一个软件跟那几个硬件有关
cpu 硬盘 内存
2.启动程序的过程
- 由硬盘把程序数据加载到内存
- CPU调用内存中的数据,进行执行
- 启动一个软件就占一个内存空间,操作系统就得到一个内存空间
- 操作系统的内存空间 与 软件的内存空间是 互相隔离
3.send recv 底层原理
- send操作应用程序的的数据,存放到自己的内存空间里
- 数据copy给操作系统的内存,操作系统去调用网卡发数据 (速度快)
- 操作系统会照着tcp协议去发数据
- recv 通知操作系统,去调网卡收数据 (速度慢)
站在应用程序角度上:
- send: 数据发给本地的操作系统 (速度快)
- recv: 通知操作系统接收数据,内存数据copy到应用程序内存中(速度慢)
4.recv和send的对比
4.1: 不管是recv还是send都不是直接接收对方的数据,而是操作自己的操作系统内存--->不是一个send对应一个recv
一个send可以对应多个recv,一个recv可以对应多个send
4.2: recv:
wait data 耗时非常长(原因:传输的过程,网络延迟;客户端没有产生数据)
copy data 耗时短
send:
copy data 耗时短
4.3:数据量小,间隔短 使用Nagle算法合并成一个包
服务端
import socket,time ''' 解决粘包的方法 接收之前明白接收的字节是多少 ''' server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('127.0.0.1',9000)) server.listen(5) conn,addr=server.accept() # 第一次接收 res1=conn.recv(5) print('第一次',res1) time.sleep(6) # 第二次接收 res1=conn.recv(5) print('第二次',res1)
'''
第一次 b'hello'
第二次 b'world'
'''
客户端
import socket import time client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) client.connect(('127.0.0.1',9000)) client.send('hello'.encode('utf-8')) time.sleep(3) client.send('world'.encode('utf-8'))