TCP连接的建立:
(1)B的TCP服务器进程首先创建传输控制块TCB,准备接受客户进程的连接请求。
然后服务器进程处于LISTEN状态,等待客户的连接请求。
(2)A的TCP进程首先创建传输控制块TCB,然后在打算建立TCP连接时,向B发出连接请求报文段,首部的同步位SYN=1。首部的同步位SYN=1,同时选择一个初始序号seq=x。
TCP规定,SYN报文段不能携带数据,但是要消耗掉一个序号。
客户端进入SYN-SENT状态
(3)客户端收到B的确认后,还要向B给出确认。
确认报文段ACK=1,确认号ack=x+1
同时发送SYN=1,seq=y
TCP服务器进入SYN-RCVD状态。
(4)TCP客户进程收到B的确认后,还要向B给出确认。
确认报文段ACK=1,ack=y+1
seq=x+1。如果不携带数据则不消耗序号。
A进入ESTABLISHED状态
(5)B收到A的确认后进入ESTABLISHED状态
TCP连接的释放:
(1)A应用进程向TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接。
A把连接释放报文段首部的终止控制位FIN置1,序号seq=u,等于前面已传送过的数据的最后一个字节的序号加1。
A进入FIN-WAIT-1状态,等待B确认。
FIN报文段即使不携带数据,也消耗掉一个序号。
(2)B收到连接释放报文段后发出确认
ACK=1,ack=u+1,seq=v
TCP服务器处于半关闭状态。从B到A方向的连接并未关闭。
(3)A收到来自B的确认后进入FIN-WAIT-2状态,等待B发出的连接释放报文
(4)如果B已经没有要向A发送的数据,B发出连接释放报文。
FIN=1,B必须重复上次已发送过的确认号ack=u+1,seq=w(在半关闭状态B又可能发送了一些数据)
B进入LAST-ACK状态,等待A的确认
(5)A收到B的连接释放报文后发送确认
ACK=1,ack=w+1,seq=u+1
TCP连接没有立即释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入到CLOSED状态。MSL叫最长报文段寿命。
(1)为了保证A发送的最后一个ACK报文段能够到达B
(2)A发送完最后一个ACK报文段后,再经过2MSL,就可以是本连接持续的时间内所产生的所有报文段都从网络上消失
wireshark三次握手实验:
三次握手:
SYN标志位为0x002,Sequence号为558864304,ack=0
SYN=1,ACK=1,ack=558864305,为上一个报文的seq+1。
ack=2249409165为上一个报文的seq+1,ACK=1。连接建立。