TCP三次握手和四次挥手

91 阅读3分钟

三次握手

  • 小写seq(sequence number),序列号的意思,它是一个随机数,相当于我们的随机验证码
  • 小写ack(acknowledgement number),确认号的意思,确认的是发送方的seq值,ack = seq + 1(发送方的seq值加1,就代表确认收到了对方的seq)
  • TCP标志位
    • 大写的ACK就是确认序号有效,如果大写ACK值等于1的话,就代表确认序号有效
    • SYN(synchronous),如果SYN = 1的话,就代表发起一个新链接
    • FIN代表释放一个链接,如果FIN=1的话,就代表释放一个链接

首先客户端主动开启结束CLOSED的状态;服务端被动开启结束CLOSED状态,进入LISTEN。然后客户端向服务端发送一个tcp报文,携带数据SYN=1,seq=x(SYN=1,表示建立一个新链接,seq=x,表示自己的一个随机序列号),此时客户端进入一个SYN-SEND阶段。当服务端收到此条信息后会回复SYN=1,ACK=1,seq=y,ack=x+1(SYN=1,表示同意建立一个新链接;ACK=1,表示确认序列号有效。seq=y,表示自己的随机序列号为y。ack=x+1,表示确认收到序列号是x),此时服务端进入SYN-RCVD阶段。当客户端收到此条报文的时候,就回复服务端另一条报文ACK=1,seq=x+1,ack=y+1(ACK=1,表示确认收到序列号;ack=y+1,确认收到的序列号是y值;同时携带自己的seq=x+1,因为上次携带的是x,在此基础上加1)。当服务端收到此条信息的时候,客户端跟服务端都进入ESTAB-LISTEND阶段,然后就开启了数据传输。

image.png

四次挥手

起初,客户端和服务端都属于数据传输阶段,当断开一个连接的时候,客户端是主动关闭方,服务端是被动关闭方,客户端首先给服务端发送一条报文FIN=1,seq=u(FIN=1代表释放一个链接;seq=u代表自己的一个随机序列号),此时客户端进入了FIN-WAIT-1阶段(半关闭状态);服务端收到客户端发送过来的报文,知道客户端有断开连接的需求,服务端就立马回复客户端一条报文ACK=1,seq=v,ack=u+1(ACK=1代表收到了客户端的报文;seq=v代表自己的随机序列号;ack=u+1代表确认收到的序列号为u),此时服务端进入了CLOSE-WAIT阶段(关闭整理阶段);当客户端收到服务端此条报文之后,知道了服务端同意断开连接,然后就进入了FIN-WAIT-2阶段,等待服务端做好关闭整理工作;当服务端做好关闭整理工作后,回向客户端发送一条报文FIN=1,ACK=1,seq=w,ack=u+1(FIN=1代表释放一个链接,ACK=1代表确认确认释放链接,seq=w代表自己的随机序列号,ack=u+1代表确认收到的序列号为u),此时服务端进入了LAST-ACK阶段(最后确认阶段);当客户端收到服务端发来的报文后,就立马回复一条报文ACK=1,seq=u+1,ack=w+1(ACK=1代表收到了服务端的报文,seq=u+1代表上次随机序列号基础上加1,ack=w+1,代表收到了服务端的seq值为w),此时客户端进入TIMW-WAIT阶段,在这个阶段客户端会等待4分钟,目的就是为了确认服务端收到自己发给服务端的报文;当服务端收到客户端发送来的报文,服务端进入CLOSED阶段,客户端再等待4分钟后,确认服务端收到自己的报文后,也进入了CLOSED阶段,然后断开连接。

image.png