在 TCP 这种字节流协议上作应用层分包
是网络编程的基本需求。分包指的是在发生一个消息(message)或一帧(frame)数据时,经过必定的处理,让接收方能从字节流中识别并截取(还原)出一个个消息。所以,“粘包问题”是个伪命题
html
对于短链接的 TCP 服务,分包不是一个问题,只要发送方主动关闭链接,就表示一个消息发送完毕,接收方 read() 返回0,从而知道消息的结尾编程
为了提升 TCP 的传输效率,TCP 有一套本身的发送机制缓存
最大报文段长度 MSS
。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去推送(push)
操做对于长链接的 TCP 服务,分包有四种方法网络
<root>
...</root>
的配对,或者 JSON 格式中的 { ... } 的配对。解析这种消息格式一般会用到状态机(state machine)假如消息格式很是简单,“消息”自己是一个字符串,每条消息有一个4字节的头部,以网络序存放字符串的长度。消息直接没有间隙,字符串也不要求以 '0' 结尾tcp
发送两条消息“hello”和“smartboy”,打包后的字节流共有21字节code
0x00, 0x00, 0x00, 0x05, 'h', 'e', 'l', 'l', 'o', 0x00, 0x00, 0x00, 0x08, 's', 'm', 'a', 'r', 't', 'b', 'o', 'y'
假设数据最终都所有到达,数据解析逻辑至少能正确处理如下各类数据到达的次序htm
《TCP粘包拆包》 原文连接:https://blog.maplemark.cn/2019/04/tcp粘包拆包.html?utm=sfblog