TCP协议的3次握手

TCP

TCP(全称:Transmission Control Protocol)是计算机网络中用于设备间通信的传输层协议的一种,它是面向连接的传输协议,
还提供了各种机制保证传输过程的可靠性,包括错误检查,流量控制等机制。

3次握手

要清晰理解3次握手的过程,先来想2个问题:

  1. 3次握手的目的是什么?
  2. 通过什么保证握手过程客户端和服务端相互理解?

目的

目的?TCP是面向连接的,所以很明显,3次握手的目的是建立连接。

通过什么数据(或信息)使得客户端和服务端相互理解并成功建立连接?

既然是建立连接,那自然需要沟通,3次握手就是3次沟通的过程,在这个沟通的过程中建立起连接。既然有沟通就需要消息承载沟通信息。

首先了解下TCP报文首部字段 (拷贝来源)

  • 16位端口号:源端口号,主机该报文段是来自哪里;目标端口号,要传给哪个上层协议或应用程序
  • 32位序号:一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
  • 32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到的TCP报文段的序号值加1。
  • 4位头部长度:表示tcp头部有多少个32bit字(4字节)。因为4位最大能标识15,所以TCP头部最长是60字节。
  • 6位标志位:URG(紧急指针是否有效),ACK(表示确认号是否有效),PSH(缓冲区尚未填满),RST(表示要求对方重新建立连接),SYN(建立连接消息标志接),FIN(表示告知对方本端要关闭连接了)
  • 16位窗口大小:是TCP流量控制的一个手段。这里说的窗口,指的是接收通告窗口。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。
  • 16位校验和:由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保障。
  • 16位紧急指针:一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。

注意6位标志位的描述。对于3次握手和4次挥手,我们只关注以下3个:

  • SYN -> Synchronize的缩写,表示请求初始化或建立连接
  • ACK -> Acknowledgement的缩写,表示确认收到请求消息数据
  • FIN -> Final的缩写,请求终止一个连接

数据包头部字段:

  • seq -> Sequence number, 序列号,用于沟通并确保消息顺序的
  • ack -> Acknowledge number,是对上一个包的序号进行确认的号,ack = seq + 1

过程示意图:
3Ways Handshake
经过3次握手建立连接:

  • 第一次握手

Client将SYN设置为1,并随意生成一个序列号值为x(seq = x),包装好数据包发送至Server,进入等待Server确认状态。

  • 第二次握手

Server收到SYN消息,知道Client想建立连接,并作出回应。SYN和ACK设置为1,ack number = x + 1,随机产生一个序列号y给seq,包装数据包发送给Client,Server进入已接受并回应状态。

  • 第三次握手

Client收到Server的确认回应后,拿到确认回应的数据,检查对应的数据是否正确:

  1. ack 是否为 x+1
  2. ACK 是否和Client请求时一致

经过上面数据检查通过后,同样需要给Server发送确认回应消息,Server再收到回应消息同样做以上2步检查。
如果检查通过,则连接建立成功。Client和Server进入ESTABLISHED状态。完成3次握手。接下来可以相互开始传输数据了。

参考链接

TCP 3-Way Handshake Process
Understanding TCP Sequence and Acknowledgment Numbers