关于三次握手、四次挥手的个人理解

154 阅读2分钟

什么是TCP

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,要建立TCP连接,则需要通过三次握手建立连接、数据通信、四次挥手断开连接这三步完成,TCP的可靠性也正是由于这三步来保证的。

术语

标题seqackSYNACKFIN
含义序列号确认号建立连接确认序列号有效关闭连接

三次握手过程

  • 客户端发送SYN包到服务器端(SYN=1,seq=x)

    客户端发送SYN包到服务器端,即SYN标志位为1,同时为自己初始一个序列号x,并进入SYN_SENT状态,等待服务器端确认。
    
  • 服务器端发送SYN+ACK包到客户端(SYN=1,seq=y,ACK=1,ack=x+1)

    服务器端接收到请求并同意连接后,发送SYN+ACK包到客户端,即SYN和ACK标志位均为1,同时也为自己初始一个序列号y和将确认号(ack)设置为x+1,并进入SYN_RECV状态,等待客户端确认。
    
  • 客户端发送ACK包到服务器端(seq=x+1,ACK=1,ack=y+1)

    客户端接收到请求后再次发送ACK包到服务器端,即ACK标志位为1,同时将自己的序列号及确认号设置为x+1、y+1,发送完毕后建立连接,TCP握手结束。
    

四次挥手过程

  • 客户端发送FIN包到服务器端(FIN=1,seq=u)

    客户端发送FIN包到服务器端,即FIN标志位为1,同时为自己初始一个序列号u,并进入FIN_WAIT_1状态,等待服务器端确认。
    
  • 服务器端发送ACK包到客户端(seq=v,ACK=1,ack=u+1)

    服务器端接收到请求后,发送ACK包到客户端,即ACK标志位为1,同时为自己初始一个序列号v和将确认号设置为u+1,并进入CLOSE_WAIT状态,同时客户端进入FIN_WAIT_2状态。
    
  • 服务器端发送FIN+ACK包到客户端(FIN=1,seq=w,ACK=1,ack=u+1)

    当服务端将剩余数据传输完毕后,发送FIN+ACK包到客户端,即FIN和ACK标志位均为1,同时为自己初始一个序列号w和将确认号设置为u+1,并进入LAST_ACK状态,等待客户端确认。
    
  • 客户端发送ACK包到服务器端(seq=u+1,ACK=1,ack=w+1)

    客户端接收到请求后,发送ACK包到服务器端,即ACK标志位为1,同时将序列号和确认号设置为u+1、w+1,并进入TIME_WAIT状态,等待可能出现要求重传到ACK包,服务器端接收到ACK包后,关闭连接,进入CLOSE状态,客户端等待一段时间后,如果没有收到服务器端的ACK包,就确认服务端进入CLOSED状态,自己也进入CLOSED状态。