TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图:
刚开始客户端处于 closed 的状态,服务端处于 listen 状态。
第一次握手:客户端给服务端发一个 SYN 报文,客户端会随机初始化序号(client_isn)。此时客户端处于 SYN_SEND 状态。此状态下将此序号置于 TCP 首部的「序号」字段中,同时把 SYN
标志位置为 1
,表示 SYN
报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN_SEND 状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且服务端也是也随机初始化自己的序号(server_isn
),将此序号填入 TCP 首部的「序号」字段中,同时会把客户端的 client_isn + 1
作为 ACK 的值,表示自己已经收到了客户端的 SYN,接着把 SYN
和 ACK
标志位置为 1
。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN_RCVD 状态。
第三次握手:客户端收到服务端 SYN 报文之后,还要向服务端回应最后一个应答 ACK 报文,当然,也是一样把服务器的 server_isn + 1
作为 ACK 的值,把报文发送给服务端,表示已经收到了服务端的 SYN 报文,这次报文可以携带客户到服务端的数据,这时候客户端处于 established 状态。
服务器收到 ACK 报文之后,也处于 established 状态,此时,双方以建立起了链接,客户端和服务端就可以相互发送数据了。