TCP三次握手是面试中的一个很常见的问题,下面我就来详解TCP三次握手的全过程@mikechen
第一次握手(SYN)
TCP建立连接的过程通常包括三次握手阶段,用于确保通信双方都准备好进行数据传输。
首先是,第一次握手,如下图红色圆圈1所示:
客户端向服务器发送一个TCP报文,其中包含一个SYN,也就是Synchronize Sequence Numbers标志位,表示客户端请求建立连接。
客户端选择一个初始序列号并将其放入报文中,该序列号用于标识从客户端到服务器的数据包。
第二次握手(SYN-ACK)
第二次握手是TCP三次握手握手过程中的第二步,它是建立TCP连接的关键步骤之一。
在第二次握手中,服务器收到客户端发送的SYN(Synchronize Sequence Numbers)报文后,确认连接请求。
并向客户端发送一个带有SYN和ACK(Acknowledgment)标志位的报文,表示服务器接受了连接请求
如下图红色圆圈2所示:
在第二次握手完成后,TCP连接进入了建立状态,双方都知道彼此已经准备好进行通信,并且已经协商好初始序列号,以确保正确地传输数据。
需要注意的是:
- 第二次握手中服务器同时发送了SYN和ACK标志位的报文,这表示服务器既确认了连接请求,又同意建立连接。
- 客户端在收到服务器的确认报文后,也会发送一个确认报文以确保连接的双向性。
第三次握手(ACK)
第三次握手是TCP三次握手握手过程中的最后一步,它是建立TCP连接的关键步骤之一。
在第三次握手中,客户端收到服务器发送的带有SYN和ACK标志位的报文后,确认连接请求。
并向服务器发送一个带有ACK标志位的报文,表示客户端接受了服务器的连接确认。
如下图红圈3所示:
客户端:
- 客户端确认连接请求,并将TCP报文的ACK标志位设置为1,表示客户端接受了服务器的连接确认。
- 客户端将确认号字段设置为服务器的初始序列号加1,表示客户端期望接收的下一个序列号。
- 客户端将TCP报文发送给服务器,执行第三次握手。
服务端:
- 服务器确认连接请求,并将TCP报文的ACK标志位设置为1,表示服务器接受了客户端的连接确认。
- 服务器将确认号字段设置为客户端的初始序列号加1,表示服务器期望接收的下一个序列号。
- 服务器将TCP报文发送给客户端,执行第三次握手。
此时,TCP连接已经建立,通信双方可以开始传输数据。
需要注意的是:
- 第三次握手中客户端和服务器都发送了带有ACK标志位的报文,表示双方都确认了连接的建立。
- 这个阶段的目的是确保连接的双向性,客户端和服务器都能够发送和接收数据。
- 因此,第三次握手是建立TCP连接的最后一步。
总结:
客户端和服务器之间的三次握手过程确保了双方都准备好进行通信,并建立了初始序列号,以便正确地传输数据。
这个过程是为了处理网络中可能出现的延迟、重复数据包、失序数据包等问题,以确保数据的可靠性和正确性。
三次握手完成后,TCP连接处于建立状态,可以进行数据传输。
在连接建立后,双方可以使用TCP的可靠传输特性来保证数据的完整性和顺序性。
需要注意的是,关闭TCP连接通常需要进行四次握手,以确保连接的双方都能够安全地关闭连接。