day19(三报文握手、四次挥手,TIME-WAIT)
- 三报文握手
a、Client(客户)将首部中的同步位SYN=1,同时选择一个初始序列号seq=x。将该数据报发送给server(服务器),客户进入SYN-SENT(同步已发送)状态。
b、服务器收到数据报后由标志位SYN=1知道客服请求建立连接。需要发送确认报文段,其中把SYN和ACK位都置1,确认号是ack=x+1,同时随机选择一个序列号seq=y。然后进入SYN-RCVD(同步收到)状态。
c、客服在收到确认后,需要给服务器给出确认,确认报文段的ACK置1,确认号ack=y+1,自己的序列号还是seq=x+1,因为不携带数据不消耗序列号,所以序列号不变。这时TCP连接已经建立了,客户进入ESTABLISHED(已建立连接)状态。
服务器收到客户的确认后,也进入ESTABLISHED状态。 - 四次挥手,连接释放的四报文握手
a、客户端应用进程发送连接释放报文段终止控制位FIN置1,其序列号seq=u,并停止发送数据,客户端进入FIN_WAIT_1状态,此时客户端依然可以接受服务器发送来的数据。(FIN报文段及时不携带数据,也消耗掉一个序列号)
b、服务器接收到FIN数据报即发出确认,确认号是ack=u+1,自己的序列号是v。服务器端进入CLOSE_WAIT(关闭等待)状态。客户端收到确认后,就进入FIN_WAIT_2状态,等待服务器端发出的连接释放报文段。
c、若服务器端没有要发送的数据的时候,发送FIN报文段使FIN=1,现在假定服务器端的序列号是w(期间可能发送过数据)。还要重复之前的发送确认号ack=u+1,seq=w,这时服务器端就进入LAST-ACK(最后确认)状态。
d、客户端收到连接释放报文段后,还要发出确认。其中报文段把ACK置1,确认号ack=w+1,自己的序列号是seq=u+1(前面发送的FIN报文段要消耗一个序列号),然后进入TIME-WAIT(时间等待)状态。必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL(2倍最长报文段寿命)后,客服端才进入到CLOSED状态。 - TIME_WAIT,为什么客户端在TIME_WAIT状态要等待2MSL时间呢?
第一,是为了保证客户端发送的最后一个ACK报文段能够到达服务端。
因为客户端发送的租后一个ACK报文段可能丢失,此时服务端处于LSAT-ACK收不到客服端的确认报文。服务端就会超时重传这个FIN+ACK报文段,而客户端就能在这个2MSL时间内收到这个重传的报文,客户端重传一次确认,重置2MSL计时器。直到两个都正常进入CLOSE状态。如果不等待的话,一旦丢失,就收不到服务端的重传报文。
第二,防止已失效的连接请求报文段,混入到本次连接中。客户端发送完最后一个ACK报文之后,经过2MSL,就可以让本链接持续的时间内的所有报文段在网络中消失。这样可以让下一个新的连接中不会出现这种就的连接请求报文段。