目前大多数的C/S架构的系统,各组件之间的通信方式都基本采用TCP协议,主要是因为TCP协议是一种稳定,可靠的传输协议,但对于TCP协议细节却并不一定被大多数人所熟知。
故本文介绍在TCP的一些细节,供大家讨论了解
一:TCP连接建立
TCP协议传输可靠性最大的理由就是对每一个传输的字节进行编码,如果接收方收到的字节序号序列中出现了丢失,发送方就会将丢失的字节序号重发,以此来保证传输的可靠。
为支持以上机制,发送双方在建立TCP连接的时候需要通知初始序列号,具体的通知步聚是:
1:客户端发送一个SYN段至服务器端, 该SYN段包含请求端的初始序号
2:服务器端对客户端的SYN段进行确认,同时,为了减少网络流量,在该ACK确认报文段中,附带服务端的初始序号
3:客户端对服务器的SYN段进行确认。
以上就是常说的三次握手协议。
其中值得注意的是TCP报文格式中序号为32位的无符号整型,一般情况下初始序号为0,当其值增长到2^32-1时,又重置为0
并且一个ack确认报不会消耗一个报文序号。
现在来看一下通过抓取工具观察到的三次握手协议,如下图1所示
图1
上图中No. 9284是客户端发往服务器的SYN报文段,可以看到其初始序号为0, 窗口大小为8912, 报文长度为Len=0, MSS最大报文大小为1460.
No.9288是服务器发往客户端的SYN报文段,可以看到其初始序号为0, 窗口大小为8912, 报文长度为Len=0, MSS最大报文大小为1460.
窗口大小报告本端的接收缓存区大小,用于控制本端数据接收大小,另一个是拥塞窗口大小则是表来控制发送方的数据发送速度。
No.9289则为客户端发往服务器端的ack报文。