一直都知道 HTTP 请求中有个“三次握手”的概念,但是一直不是很清楚究竟是怎么回事,今天就稍稍的了解一下。
三次握手的目的
三次握手之后,TCP 连接被建立。其目的在于确保客户端与服务端在此次通信时所建立的信道是可靠的。
白话三次握手
-
第一次握手:客户端向服务端发送一个信号,服务端收到该信号。服务端可以判断:客户端的发送功能与自己的接收功能都是 OK 的。
-
第二次握手:服务端给客户端返回一个信号,客户端接收到该信号。客户端可以判断:自己的发送、接收以及服务端的接收发送功能都是 OK 的。
-
第三次握手:客户端再给服务端返回一个信号,服务端接收该信号。服务端可以判断:自己的发送、接收以及客户端的接收功能都是 OK 的。
经过三次握手,客户端与服务端均确认了此次通信连接的可靠性,连接被建立。三次是保证双方互相明确对方能收能发的最低值。
细说三次握手参考来源

TCP 协议中,请求由『客户端』主动发起,『服务端』被动连接,连接建立后,客户端和服务端都能够发送和接收数据。最开始,服务端和客户端都处于 CLOSED 状态。通信开始前,双方均需要创建各自的传输控制块(TCB),服务端完成 TCB 的创建之后进入 LISTEN 状态,做好接收客户端的连接请求。
握手过程中传送的报文段中不包含数据,三次握手完毕后,客户端与服务段才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
第一次握手
客户端向服务端发送请求报文段。该报文头部中,SYN=1,ACK=0,seq=x,请求发送后,客户端进入 SYN-SENT 状态。
1.SYN=1,ACK=0 表示该报文段为连接请求报文。
2.x 为本次 TCP 通信的字节流的初始序号。
3.TCP 规定:SYN=1 的报文段不能有数据部分,但要消耗掉一个序号。
第二次握手
服务端收到客户端的连接请求报文段之后,如果同意连接,则在回应的报文段头部中:SYN=1,ACK=1,seq=y,ack=x+1。该应答发送完成后,服务端进入 SYN-RCVD 状态。
1.SYN=1,ACK=1 表示该报文段为连接同意的应答报文段。
2.seq=y 表示服务端作为发送者时,发送字节流的初始序号。
3.ack=x+1表示服务端希望下一个数据报发送序号从x+1开始的字节。
第三次握手
客户端接收到服务端同意连接的报文段之后,需要向服务端发送一个确认报文段,用以说明,服务端发来的连接同意应答已经成功收到,该报文段的头部为:ACK=1,seq=x+1,ack=y+1。客户端在完成该报文段的发送之后,进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,连接建立完成。
附注
SYN(synchronous)与 ACK 是标志位,seq 是数据包序号