深入学习swoole之TCP/IP协议结构(TCP粘包处理)

什么是网络协议?

网络协议为计算机网络中进行数据交换而建立的规则,标准或约定的集合;

协议分层: tcp/ip协议族是一个四层协议系统,自底而上分别是数据链路层,网络层,传输层,每一层完成不同的功能上层协议使用下层协议提供的服务;

TCP和UDP对比介绍

1.TCP是面向连接的(如打电话要先拨号建立连接); UDP是无连接,即发送数据之前不需要建立连接

2.TCP提供可靠的服务,也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达 ; UDP尽最大努力交付,即不保证可靠交付;

3.TCP通过校验和重传控制,序号标识,滑动窗口,确认应答实现可靠传输,如丢包时的重发控制,还可以对次序乱掉的分包进行重新排序;

4.UDP具有较好的实效性,工作效率比TCP高,适用于对高速传输和实时性有将高的通信或广播通信;

5.TCP对系统资源要求较多,UDP对系统资源要求较少;

MyAnswer博客


TCP粘包处理

TCP通信的特点:

1.TCP是流式协议没有消息边界,客户端向服务器端发送一次数据,可能会被服务器端分成多次收到,客户端向服务器端发送多条数据,服务器端可能一次全部收到

2.保证传输的可靠性,顺序

3.TCP拥有拥塞控制,所有数据包可能会延后发送;

没有消息边界 : 可以理解为水在一个水管的流动,我们不知道那段数据是我们需要的完整数据;

收发有缓存区 : 比如当水从一端流到了另一端,我们在收数据的时候,不可能每来一滴水就处理一次,这个缓冲区就相当于有了一个水桶,再接了一定的水之后内核再将数据提交到用户空间,这样可以大大提升性能;

什么是粘包:

TCP粘包是指发送方发送的若干包数据到接收方,接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾;

出现粘包的原因:

发送方:发送方需要等缓冲区慢才发送出去,造成粘包;

接收方:接收方不及时接收缓冲区的包,造成多个包接收;

MyAnswer博客


swoole处理粘包的方法:

EOF结束协议:通过约定结束符,来确定包数据是否发送完毕

开启open_eof_check=true,并用package_eof来设置一个完整数据结尾符,同时设置自动拆分open_eof_split

MyAnswer博客

注意: 要保证业务数据里不能出现package_eof设置的字符,否则将导致数据发送错误;


固定包头+包体协议

这种方式也非常常见,原理是通过约定数据流的前几个字节来表示一个完整的数据有多长,从第一个数据到达之后,先通过读取固定的几个字节,解出包体的长度,然后按这个长度继续取出后面的数据,依次循环;

MyAnswer博客


MyAnswer博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论