网络通信 粘包和 缓冲器

Posted liurenli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络通信 粘包和 缓冲器相关的知识,希望对你有一定的参考价值。

tcp:

  属于长连接,与一个客户端进行连接了以后,其他的客户端要等待,要连接另外一个,必须优雅的断开前面这个客户端的连接.

允许地址重用:在bind IP地址和端口之前加上,# server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 允许(IP地址和端口)地址重用


缓冲区
  输入缓冲区 #recv
  输出缓冲区 #send

粘包(tcp的两种粘包现象)
  1 连续发送小的数据,并且每次发送之间的时间间隔很短(输出缓冲区:两个消息在缓冲区黏在一起了)
原因是TCP为了传输效率,做了一个优化算法(Nagle),减少连续的小包发送(因为每个消息被包裹以后,都会有两个过程:1 组包 2拆包)

  2 第一次服务端发送的数据比我客户端设置的一次接收消息的大小要大,那么接收不完,第二次再接收的时候,就会将第一次剩余的消息接收到

粘包的根本原因是因为:双方不知道对方发送消息的大小

解决方案一:
  发送消息之前,先计算要发送消息的长度,然后先将消息长度发送过去,对方给你回一个确认收到长度的信息,然后根据接收到的消息长度来修改自己一次接收消息的大小
这个过程多了一次交互




















以上是关于网络通信 粘包和 缓冲器的主要内容,如果未能解决你的问题,请参考以下文章

解决粘包和拆包问题

粘包和拆包

socket编程 粘包和半包 问题的及处理

TCP粘包和拆包问题

python 网络编程 缓冲和粘包

网络I/o编程模型21 netty的粘包和拆包问题的解决方案