tcp 连接 三次握手、四次挥手
1.三次握手 说明: ACK:确认报文 ack:确认号 SYN 在连接建立时用来同步序号 一、 客户端 到 服务器端
1、Tcp服务端首先创建连接模块TcB,然后等到客户端的发起请求, 进入到listen监听状态
2、TCP客户端也创建连接模块TcB,发送报文请求:SYN=1( SYN在连接建立时用来同步序号) ACK=0 ,同时选择一个序列号 (这时有(客户端的seq)seq=x 和 SYN=1,ACK=0 )两个。 然后进入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状态,)
|