隔三差五看到头条推送的关于 TCP 粘包拆包的文章,刚开始看到还觉得有点滑稽,看多了就觉得有点无奈。
粘包拆包这个说法是谁最先提出来的,无从考证,从字面上看好像数据一坨一坨的粘在一起,像极了那啥。
但是这个说法是错误的,错误的,错误的,重要事情说三遍。
解释下原因:
- TCP 是流式协议,不是数据报协议(UDP);
- 流像根水管,一头是客户端,另一头通往服务器,数据在管道中流动,而不是一坨数据包在管道中哐当哐当往下掉。
- 流动的东西是没有边界的,就好象水,抽刀断水水更流;
- 协议栈保证了流动的顺序问题,先流入的一定会先流出;
- 在流中传输结构化数据(消息或报文)需要自行处理,貌似这个就是他们所说的粘包拆包的问题点,如在数据前加 tag 带长度、加结束符等等,各种骚操作应有尽有,但这跟 TCP 一毛钱关系都没有;
- 以上几点适用于各种数据流,如文件流、转换流等;
也许某一天会继续看到这样的文章:TCP的粘包问题、读文件的粘包问题、串口通信的粘包问题...
閱讀更多 熙爸愛釣魚 的文章