一.概述:
tcp是属于传输层上的协议,它是在网络层协议之上,应用层协议之下,通常我们web开发最关注的是http协议,而http协议就是属于应用层协议,而我们网络上一个一个的ip包,这个是属于网络层。
之所以想要学习下tcp协议,也是慢慢的发现,在而今的分布式环境下,必不可少的就是高性能的通信模型的实现,比如dubbo协议其实就是在tcp协议之上的应用层协议,为了实现连接的多路复用,在应用层上做了一些特殊处理(requestId等等)。举个例子,我们都知道dubbo的每个consumer实例和provider实例默认都是采用的单一长连接,那么tcp协议的实现本身,只是为了在通信的两端之间保证数据能够正确高效的传输,而应用层上又提出了一些新的要求,比如说,客户端发出去了两个请求,如果保证这两个请求和响应在应用层上的正确性,dubbo协议可能利用requestId等手段来实现。
tcp协议是一种面向连接的可靠的字节流服务。首先,我们来看下tcp的首部。
我们打开wireshark来抓包看一下。
首先,一个ip包会先有ip首部,然后body是tcp报文,然后tcp报文中也有个首部,这个首部很重要,后续的很多可靠性方面的实现都是依赖于这个首部,通常tcp报文的首部是20个字节。
从图中可以看到,整个tcp报文长度是32个字节,而首部占据了20个字节,options占据12个字节,具体的对应关系可以抓包看出。