粘包现象

粘包

粘包:主要是指多个包粘在一起,发生此现象的原因,是由于客户端设置的最大接收字节不够。

粘包的底层原理

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'))



原文地址:https://www.cnblogs.com/Mryang123/p/8711818.html