关于 TCP 编程的错误理解

隔三差五看到头条推送的关于 TCP 粘包拆包的文章,刚开始看到还觉得有点滑稽,看多了就觉得有点无奈。


粘包拆包这个说法是谁最先提出来的,无从考证,从字面上看好像数据一坨一坨的粘在一起,像极了那啥。


但是这个说法是错误的,错误的,错误的,重要事情说三遍。

解释下原因:

  • TCP 是流式协议,不是数据报协议(UDP);
  • 流像根水管,一头是客户端,另一头通往服务器,数据在管道中流动,而不是一坨数据包在管道中哐当哐当往下掉。
  • 流动的东西是没有边界的,就好象水,抽刀断水水更流;
  • 协议栈保证了流动的顺序问题,先流入的一定会先流出;
  • 在流中传输结构化数据(消息或报文)需要自行处理,貌似这个就是他们所说的粘包拆包的问题点,如在数据前加 tag 带长度、加结束符等等,各种骚操作应有尽有,但这跟 TCP 一毛钱关系都没有;
  • 以上几点适用于各种数据流,如文件流、转换流等;

也许某一天会继续看到这样的文章:TCP的粘包问题、读文件的粘包问题、串口通信的粘包问题...



分享到:


相關文章: