再聊t-io网络编程架构的基础知识(半包和粘包)
半包
顾名思义,就是收到了半个包,这个时候不足以组成一个应用层的包。就像你要对你喜欢的人说“我喜欢你”,但是因为喝水咽着了,第一次只说了“我”字,第二次说了个“喜”字,第三个次了个“欢你”,那么就发生了半包问题,对方只有等待你说完这4个字后才知道你是想说“我喜欢你”!
用http协议为例,展示半包场景
文章图片
粘包
粘包与半包相反,就是把多个想说的话,一口气说完了,对方反应不过来,得把你的话拆开一条一条地理解
【再聊t-io网络编程架构的基础知识(半包和粘包)】用http协议为例,展示粘包场景
文章图片
说明:http协议是一来一回的,所以正常场景是不会有粘包的,但pipeline模式下是允许一方连续发多个请求的,所以会有粘包产生
为何坑人无数
初涉网络编程的同学,往往认为每次收到的数据刚好是一个完整的数据包
于是当网络不好,或是消息包过大时,半包的情况就发生了,而程序并没有考虑到半包的情况,结果就是解码失败,导致消息丢失
当通信的对方把多条业务数据包放在一个TCP包中发过来时,粘包就产生了,而程序没有考虑到一次TCP收包会收到多个业务包,从而解析到第一个业务包后把后面的业务包丢弃了
百度一下半包粘包,一定会搜到很多记录,这也证明这俩货确实坑人无数,所以看完本节内容,你还会继续犯半包粘包的错吗?
具体请参考:https://www.tiocloud.com/doc/tio/84
推荐阅读
- 网络编程基础--HTTP
- 《Unix网络编程》第一卷第三版|《Unix网络编程》第一卷第三版 源码编译
- 网络|网络编程释疑(TCP连接拔掉网线后会发生什么)
- 用|用 Python 写网络编程(二)
- Python3.x(Socket网络编程)
- Linux系统网络编程|Linux系统(权限管理)
- Java|Java Socket -- 网络编程
- 国产开源网络编程框架t-io使用必备(极速开发器Tio.java)
- 日记博文|几种网络编程方式的比较
- Android网络编程|Android网络编程(十) 之 OkHttp3原理分析