TCP的三次握手与四次挥手

文章目录

三次握手

  • 准确来说,应该叫做 三报文握手 (计算机网络 第七版 谢希仁 p238)。

    即一次握手中交换了三个报文,类似于两人见面时进行一次握手,上下摇晃了三次。

    以下,为了遵循大家的习惯,依旧使用三次握手这个名称。

  • 在TCP连接建立的过程中要解决的三个问题

    1. 要使每一方能够确知对方的存在
    2. 要允许双方协商一些参数(如 最大窗口值)
    3. 能够对运输实体资源(如 缓存大小)进行分配
  • 简单示意图(主动发起连接建立的应用进程叫做 客户,被动等待连接建立的应用进程叫做 服务器
    TCP的三次握手与四次挥手

  • SYN:SYNchronization,同步序号。

    • 当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段
    • 当 SYN = 1 而 ACK = 1 时,表明对方同意建立连接时响应时的报文段
  • ACK:ACKnowledgment,确认号字段。

    • 仅当 ACK = 1时,确认号字段才有效,ACK = 0时,确认号无效
    • TCP 规定,在连接建立后所有传送的报文段都必须吧 ACK 置为1。
  • 为什么三次握手(目的)

    • 目的是建立可靠的通信信道。
    • 另一个说法就是:双方确认自己与对方的发送与接收都是正常的
  • 每次握手双方所确认的信息

    1. client 什么都不能确认,server 确认了对方发送正常
    2. client 确认了:自己发送、接收正常,对方发送、接收正常;server 确认了:自己接收正常、对方发送正常
    3. client 确认了:自己发送、接收正常,对方发送、接收正常;server 确认了:自己发送、接收正常,对方接收正常。

    总结:三次握手就能确认双方接收、发送正常。缺一不可。

  • 为什么要传回 SYN ?

    • 接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息就是你发送的信息。
  • 传了 SYN,为什么还要传 ACK?

    • 双方通信无误必须是两者互相发送信息都无误。传了 SYN ,只能说明发送方到接收方没有问题,接受方到发送方还需要 ACK 来验证

四次挥手

  • 数据传输完毕,双方都可以释放连接,在准备断开连接时,双方还都处于连接状态,客户端主动关闭TCP连接,服务端被动关闭。

  • 简单示意图
    TCP的三次握手与四次挥手

  • 四次挥手的内容

    1. 客户端 发送一个FIN,用来关闭客户端到服务器的数据传送
    2. 服务端 收到FIN,然后发送一个 ACK 给客户端
    3. 服务端 关闭与客户端的连接,发送一个 FIN 给客户端
    4. 客户端 发回 ACK 确定。
  • 为什么客户端还需要等待 2MSL(2个最长报文段寿命)?

    1. 为了保证客户端发送的最后一个 ACK 报文段能够达到服务器。因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
    2. 防止类似于"三次握手"中的"已失效的连接请求报文段"出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
  • 如果已经建立了连接,但是客户端突然出现故障了怎么办?

    • TCP 有一个 保活计时器(keepalive timer)。哭护短突然出现了故障,服务器就不能再接收到客户端发来的数据。服务器每收到一个客户的数据,就重新设置保活计时器,时间的设置通常为2小时。若2小时没有收到客户的数据,服务器就发送一个探测报文段,每隔75s发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭了这个连接。