TCP三次握手、四次断开(挥手)

一、三次握手

       TCP建立连接的过程就是三次握手,在建立连接的过程实践上就是客户端和服务端之间总共发送三个数据包。客户端和服务端都会指定自己的初始化序列号,就是为了后面数据传输的可靠性做好准备。

        实质上也就是客户端在连接服务器端的时候指定端口,建立TCP连接,并同步连接双方的序列号(seq)和确认号(ack),交换TCP的窗口大小信息。

       1、目的:为了确认双方都可以接收到数据包和发送数据包

       2、三次握手的过程

             第一次握手:客户端给服务端发一个 SYN 标志位的数据包(TCP中有6个标志位,SYN标志位在倒数第15位,二进制位为1,发送第一个SYN包之后,SYN=1)请求建立连接

             第二次握手:服务端收到客户端的SYN标志位数据包之后,也会给客户端发送一个SYN标准位数据包(SYN是为了告诉客户端,客户端到服务端的通道是没问题的)作为应答,表示同意建立连接。还指明了自己的初始化序列号seq。并且会把客户端的seq+1(x+1)作为ACK的值,(ACK是用来验证服务端到客户端的通道没有问题),表明自己已经接收到了客户端的SYN。

             第三次握手:客户端收到SYN标志位数据包之后,会发送一个ACK标志位数据包,也会把服务端的初始序列号seq+1(y+1)作为自己的确认号ACK的值,表示收到了服务端的SYN标志位数据包。

            第一次握手的时候客户端回复的是SYN标志位数据包

            第二次握手的时候服务端回复的是SYN和ACK标志位

            第三次客户端回复的是ACK标志位

           当服务器回复的时候客户端会变成SYN_SENT状态,

           当客户端发送数据包过去之后,服务器端会变成SYN_RCVD状态。

           服务器收到确认标志位数据包,客户端处于ESTABLISHED状态(完成连接)。

二、四次挥手(断开连接)
       建立一个连接需要进行三次握手,而终止一个连接需要经过四次挥手(断开连接),这由TCP的半关闭造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这个连接可以是客户端主动断开的,也可以是因为超过连接时间了,服务端主动断开的。

刚开始的时候,双方都处于established状态。假如是客户端先发起关闭连接请求。
第一次挥手:客户端发送一个FIN的标准位数据包(FIN=1,连接释放报文段)给服务器端,会在报文中会指定一个序列号seq=u,并停止发送数据,主动关闭TCP连接。此时的客户端处于FIN_WAIT1的状态,等待服务端的确认。

第二次挥手:服务端收到FIN标志位数据包之后会给客户端发送ACK报文(ACK=1:确认报文段),表明已经收到客户端的报文了,这个报文中是把客户端的序列号值进行加一(u+1)作为确认ACK报文的序列号值(ack=u+1:确认序列号),同时也会生成一个初始序列号seq=v。此时的服务器端处于 CLOSE_WAIT (关闭等待)状态。

此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。

第三次挥手:如果服务器也想断开连接了(服务端没有要向客户端发出的数据),就会和客户端的第一次挥手一样,会给客户端发送一个FIN报文(FIN=1:连接释放报文,ACK=1),并且随机指定一个序列号seq=w(确认号为ack=u+1)。此时的服务端处于 LAST_ACK (最后确认)的状态,等待客户端的确认。

第四次挥手:客户端收到FIN报文(连接释放报文段)之后,一样的发送一个ACK报文(ACK=1,seq=u+1:确认报文段)作为应答,并且把服务端的序列号值+1(ack=w+1)作为自己ACK报文的序列号值。此时的客户端处于TIME_WAIT (时间等待)状态,(此时的TCP没有被释放掉)需要经过一段时间(等待时间计时器设置的时间2MSL)以确保服务端收到自己的ACK报文之后才会进入CLOSED状态,服务器端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态。

收到一个FIN只意味着在这一方向上没有数据流动。客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭,不会进入TIME_WAIT状态。
 

你可能感兴趣的:(HCIA,tcp/ip,网络,网络协议)