TCP三次握手(Three-way Handshake)
三次握手指的是建立一个TCP连接时,需要客户端和服务器总共发送3个包。其目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手。下图是三次握手过程:
TCP三次握手过程
第一次握手:
客户端发送一个SYN包(SYN标志位置1,SYN序号X)到服务器,并进入SYN_SEND状态。
客户端发送一个SYN包(SYN标志位置1,SYN序号X)到服务器,并进入SYN_SEND状态。
第二次握手:
服务器收到SYN包,发送ACK+SYN包(SYN标志位置1,ACK标志位置1,ACK序号为X+1,SYN序号Y)到客户端,此时服务器 进入SYN_RECV状态。
第三次握手:
客户端再次发送ACK+SYN包(SYN标志位置0,ACK标志位置1,ACK序号Y+1)。此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
通过三次握手,客户端和服务器端建立起可靠的双工的连接。至于为什么需要进行三次握手才能建立起可靠的双工的连接,我们可以这样理解:
第一次握手和第二次握手(也可以认为是第一次握手的SYN,第二次的ACK)是为了保证服务器端能够接受到客户端的信息并能够做出正确的应答;第二次握手和第三次握手(也可以认为是第二次握手的SYN,第三次的ACK)是为了保证客户端能够接受到服务器端的信息并能够正确的应答。
附上TCP四次挥手结束连接图: