粘包【封包-拆包】pack函数
文章目录
【注意】最后更新于 October 25, 2022,文中内容可能已过时,请谨慎使用。
粘包【封包-拆包】pack函数
多个数据包粘在一起,无法确定数据的边界
tcp在调用 send/fwrite/stream_socket_sendto
在接收时:
- 第一个数据包未接收完全,剩下部分与其他数据包粘在一起了
- 第一个数据包粘住了剩下的一部分,多余了一部分
- 一次读取到了多个数据包
- 要多次才能读取到完整的数据包
- 正常接受每个包的数据
Nagle算法(默认开启)
先不发送,先把小块数据缓存起来组成大块数据,在一定的时机下发送,不会造成网络拥塞,数据丢失,但是会延迟。
关闭时:
早期带宽很小,每次发送数据都要经过每一层【传输层,网络层,数据链路层】的封装,很容易造成网络拥塞,甚至造成数据包丢失“丢包”
现在网络带宽越来越好了,可以关闭这个算法,从而让消息急时的可以发送出去。
如果使用了Nagle算法,发送端就会把小块数据组合成大块数据所谓的“封包”,进行发送,接收端是不知道数据的边界【字节流是没有数据边界的,你得自己确定数据的边界,这个过程叫做“拆包”】
pack函数
https://www.php.net/manual/zh/function.pack.php
pakc(format,$args)
将args通过format方式打包成二进制
字节序
只有超过一个字节才存在字节序【顺序】
大端字节序:网络字节序,在传输时,值的高位放在字节流的开始出,低位放在字节流的末尾上
小端字节序:主机字节序,在传输时,值的低位放在字节流的开始出,高位放在字节流的末尾上
主机字节序【一般在本地存储】在网络传输时会转成网络字节序