只要看到netty相关的内容,总会出现对粘包半包等问题疑惑。开发这么久的web服务,也没看到tomcat内部有这部分逻辑呀?难道是netty搞复杂了?寻遍全网以及和大佬的求证,肤浅的解答一下自己的疑惑:
1.Http协议的作用
tomcat作为web服务器,一般都通过http协议进行通信。根绝http协议的定义,通过请求行、请求头、消息体等定义可以很方便解析到对应数据,因此我们只需要在传输层解析到对应的数据结构即可。看netty对http协议的支持,也可以在代码中看到encoder/decoder的设置。大概没有在这个过程中,有过粘包半包的探究。
2.粘包半包问题来源-tcp协议
TCP/IP (Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。
TCP的性质,不能区分消息起止。我相信当你开始探究粘包半包问题时,大概率都是从一些教学视频过来的,那么他么之前将了什么代码:socket
–socket–
我也找了一些关于socket的定义:
- Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口(API)
- Socket 的出现只是使得程序员更方便地使用 TCP/IP 协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道 的一些最基本的函数接口,比如 create、listen、connect、accept、send、read和 write 等
所以我们直接通过socket编程,发送消息时,就需要考虑到粘包半包的这个问题了。