tcp 连接 三次握手、四次挥手
1.三次握手
说明:
ACK:确认报文 ack:确认号
SYN 在连接建立时用来同步序号
一、 客户端 到 服务器端
1、Tcp服务端首先创建连接模块TcB,然后等到客户端的发起请求,
进入到listen监听状态
2、TCP客户端也创建连接模块TcB,发送报文请求:SYN=1( SYN在连接建立时用来同步序号) ACK=0 ,同时选择一个序列号 (这时有(客户端的seq)seq=x 和 SYN=1)两个。
然后进入SYN-SENT状态
3、TCP服务端接收到后就,如果同意请求,就确认报文,ACK=1,SYN=1,确认号为ack=x+1(x客户端发过来的序列seq);通过也有一个属于自己的序列号 seq=y;
(这时有:(服务端的seq)seq=y,SYN=1,ack=x+1,ACK=1)四个。
然后进入SYN-RCVD状态
4、TCP客户进程收到确认后,还要向服务端给一个确认,确认的报文
(ACK=1,ack=y+1,seq=x+1)
然后进入数据传输状态
二、四次挥手
1、TCP客户端发起了断开链接报文处理,并且停止发送数据。释放报文首部的 FIN=1,然后序列号为seq=u(u为最后一次传输的序号的+1) TCP规定,FIN报文段即使不携带数据,也要消耗一个序号
(进入,FIN-WAIT-1状态,等待)
2、服务端收到连接释放报文,然后发出确认释放报文,ACK=1,ack=u+1,
seq=v,这时候,但是服务器若发送数据,客户端依然要接受
(进入,CLOSE-WAIT状态,等待)
3、客户端收到服务器的确认请求后,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
(进入,FIN-WAIT-2状态,等待)
4、服务端将最后的数据传输给客户端,发送报文FIN=1,ack=u+1,当时的序号如:seq=w,
(进入了LAST-ACK(最后确认)状态,等待客户端的确认。)
5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1
而自己的序列号是seq=u+1注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
(进入,TIME-WAIT状态,等待)
6、服务端接受到了确认报文后,关闭链接状态,撤销TCB后,断开TCP链接可以看到,服务器结束TCP连接的时间要比客户端早一些。
(进入,CLOSED状态,)