TCP的链接建立与终止
TCP是面向连接的协议,所以在双方进行数据交互之前,必须先建立连接。而一个TCP连接的建立与断开需要进行交互7个数据包才能完成,也就是常说的“三次握手,4次挥手”。建立与断开连接都是通过TCP首部中的控制字段来实现的,所发送的TCP数据包也都是不包含数据,只有首部信息的。
1. 建立连接
(1)首先,客户端发送一个TCP报文段请求建立连接,其中的TCP首部信息中的控制字段中的SYN标志位为1,并且首部信息中还包含了想要连接服务端的端口号,初始序号等数据。(第一次握手,客户端发出建立连接的请求,服务端接收)
(2)服务端接收到该连接请求后,服务器响应一个TCP报文段,首部信息中的SYN字段为1,ACK字段也为1,初始序号为服务端的初始序号,而且确认序号字段为客户端发送的初始序号加1,以此进行确认。(第二次握手,服务端接收到客户端发出建立连接的请求,并且确认可以连接,然后返回给客户端一个连接请求)。
(3)客户端在发出建立连接请求后,如果收到了服务端的建立连接请求响应,就表示可以进行连接。客户端响应一个TCP报文段,首部信息中的SYN字段为0,ACK字段为1,确认序号字段为服务端发送的初始序号加1,该TCP报文段发送成功后,TCP连接就成功建立。(第三次握手,客户端接收到服务端发出建立连接的请求,并且确认可以连接,然后发送给服务端一个连接确认,完成TCP连接建立)。
2. 断开连接
建立一个连接需要三次握手,而终止一个连接要经过4次握手。这由TCP的半关闭造成的。可以这么理解,在TCP的两端,每端都有着两条数据通道,一条数据通道是用来接收对方发送的数据,而另一条则是用来向对方发送数据,而我们必须将这两条数据通道全部关闭才算是真正的中断TCP连接,否则如果只中断一条,可能发生另一端仍然在发送数据的情况。
(1)首先,客户端确认数据发送完毕并且服务端也接收完毕后,向服务端发送一条TCP报文段请求终止连接(中断从客户端发送数据到服务端这条通道的连接),报文段首部信息中主要是FIN字段的值为1(第一次挥手)
(2)而服务端在收到客户端的中断请求后就会响应一个首部ACK字段值为1的TCP报文段,客户端收到这条响应之后就意味着从客户端到服务端这个方向的数据通道已经关闭。(第二次挥手)
(3)服务端确认数据发送完毕并且客户端也接收完毕后,向客户端发送一条TCP报文段请求终止连接(中断从服务端端发送数据到客户端这条通道的连接),报文段首部信息中主要是FIN字段的值为1,同时ACK也为1(第三次挥手)
(4)而客户端在收到服务端的中断请求后就会响应一个首部ACK字段值为1的TCP报文段,服务端收到这条响应之后就意味着从服务端到客户端这个方向的数据通道已经关闭。(第四次挥手)至此,TCP连接两端的数据双数据通道已经全部关闭,也就完成了TCP连接的中断。