TCP三次握手与连接释放

TCP连接

为什么需要三次握手

TCP是一个可靠的通信协议,所谓的可靠是指接收方收到的数据是完整的,有序的,无差错的。为了实现这个目标,TCP的通信双方需要判断自己的数据是否已经被对方接收,如果没有,那么需要重发。为了实现这个需求,TCP引入了序列号(Sequence number)和确认号(Acknowledgement number).

序列号用来表明发送了哪些数据,确认号用来表明已经收到了哪些数据。因此序列号的唯一性和有效性就显得尤为重要。TCP的通信双方在初始时都需要告知对方自己随机选择的初始序列号(Initial Sequence Number, ISN).而TCP三次握手的本质就在于同步双方初始的序列号

TCP连接过程

  1. client发送SYN=1,SEQ=x,表示它想与服务端建立连接,它初始的的序列号为x
  2. server收到SEQ=x的数据,需要发送ACK=x+1给client,表示它已经收到了序列号为x的数据,它下一个希望收到数据的序列号是x+1
  3. 同时server也需要告知client它的初始序列号,因此server端发送SYN=1,SEQ=y到client
  4. client收到ACK=x+1,就知道server收到了序列号为x的数据,所以它可以发送序列号为SEQ=x+1的数据。client收到SYN=1,SEQ=y,就知道server端的初始序列号为y,它需要发送ACK=y+1,告知服务端它已收到了数据

上述2,3两步可以合并在一个包里发送,因此可以称为三次握手

TCP连接释放

TCP连接释放过程

  1. client发送FYN=1,SEQ=u,表示client已经没有数据想要发送,想要关闭连接
  2. server收到数据之后,明白了client想要关闭连接,但是它还有数据需要发送给客户端,于是它发送ACK=u+1,SEQ=v到client,表示它已经收到了连接关闭的请求
  3. server端一直发送数据,直到它也没有数据发送了。于是它发送FYN=1,SEQ=w,ACK=u+1到client,表示它也要关闭连接了
  4. client收到这个数据,需要发送ACK=w+1给server,表示它收到了连接关闭的请求,server可以关闭连接
  5. client在等待2MSL(最大报文生存时间)时间后,两端连接全部释放

(1) TCP是全双工的,即数据可以同时在两个方向上传递,所以每个方向的连接需要单独释放

(2) 等待2MSL的时间是为了保证client最后一个ACK能够到server端。若ACK丢失,则server会超时重传。如果不设置等待时间,client直接关闭连接,若ACK丢失,则server会一直重传。另外一个原因是,经过报文最长生存时间的等待之后,此次连接的所有报文要么到达对端,要么失效,不会对下次连接造成干扰

参考文献


Reprint please specify: wbl TCP三次握手与连接释放

Previous
MySQL Explain详解 MySQL Explain详解
简介explain命令可以对Select语句进行分析,并输出 SELECT 执行的详细信息, 以供开发人员针对性优化. explain的用法,只需要在Select语句之前加入explain即可 explain SELECT * from u
2019-07-27
Next
TCP与UDP协议 TCP与UDP协议
UDP(User Data Protocol) UDP是位于传输层中的协议 UDP是一个无连接的协议,也就意味着UDP是不可靠的 UDP不考虑错误控制,流控制 UDP HeaderUDP的头部固定只有8字节 源端口和目标端口都是2字节