【浏览器】浅析“三次握手”与“四次挥手”

我们来全面、系统地讲解浏览器(客户端)与服务器建立和关闭 TCP 连接的“三次握手”与“四次挥手”过程。这是所有 HTTP/HTTPS 网络通信的基石。


第一部分:三次握手 - 建立连接

在浏览器发送任何请求(如输入网址后回车)之前,必须先与服务器建立一条可靠的 TCP 连接。这个过程就像打电话前的拨通和问候。

目标: 双方确认彼此的发送和接收能力正常,并同步初始序列号。

我们以浏览器作为主动打开方(客户端),服务器作为被动打开方。

第一次握手:SYN 从客户端发向服务器

  • 动作:浏览器(客户端)发送一个 TCP 报文。
  • 报文内容
    • SYN 标志位 = 1,表示这是一个连接请求报文。
    • 序列号 seq = x(x 是一个随机生成的初始值)。
  • 含义:客户端对服务器说:“你好,我想和你建立连接。我的初始序列号是 x。”
  • 状态变化:客户端进入 SYN-SENT 状态。

第二次握手:SYN-ACK 从服务器发向客户端

  • 动作:服务器收到 SYN 报文后,如果同意连接,则回复一个报文。
  • 报文内容
    • SYN 标志位 = 1
    • ACK 标志位 = 1
    • 确认号 ack = x + 1(表示我确实收到了你的序列号 x,期待你下一个发 x+1 的数据)
    • 序列号 seq = y(服务器自己也随机生成一个初始序列号)。
  • 含义:服务器对客户端说:“我收到你的请求了,我同意建立连接。这是我的初始序列号 y,请你确认。”
  • 状态变化:服务器进入 SYN-RCVD 状态。

第三次握手:ACK 从客户端发向服务器

  • 动作:客户端收到服务器的 SYN-ACK 报文后,必须再次进行确认。
  • 报文内容
    • ACK 标志位 = 1
    • 确认号 ack = y + 1(表示我确实收到了你的序列号 y)
    • 序列号 seq = x + 1(因为第一次握手已被确认)。
  • 含义:客户端对服务器说:“我收到你的确认了。现在我们可以开始传输数据了!”
  • 状态变化
    • 客户端发送完 ACK 后,进入 ESTABLISHED 状态(连接已建立)。
    • 服务器收到这个 ACK 后,也进入 ESTABLISHED 状态。

至此,连接建立成功,浏览器可以开始发送 HTTP 请求了。

为什么是三次,而不是两次?

核心是防止已失效的连接请求报文突然又传送到服务器,因而产生错误
假设只有两次握手:如果一个滞留在网络中的旧连接请求报文突然到达服务器,服务器会误以为是新的请求,直接建立连接并等待数据,但客户端并不会发送数据,这就导致了服务器资源的浪费。第三次握手是一个“双重保险”,客户端需要基于服务器的响应来做出最终确认,只有双方都确认无误后,连接才真正建立。


第二部分:四次挥手 - 关闭连接

当数据交换完毕(例如网页已加载完成),任何一方都可以发起关闭连接的请求。我们以浏览器作为主动关闭方来举例。

目标: 可靠地关闭一个全双工的数据通道。

第一次挥手:FIN 从客户端发向服务器

  • 动作:浏览器(客户端)发送一个 TCP 报文。
  • 报文内容
    • FIN 标志位 = 1,表示请求终止连接。
    • 序列号 seq = u
  • 含义:客户端对服务器说:“我这边没有数据要发送了,我想关闭我到你方向的连接。”
  • 状态变化:客户端进入 FIN-WAIT-1 状态。

第二次挥手:ACK 从服务器发向客户端

  • 动作:服务器收到 FIN 后,立即回复一个确认报文。
  • 报文内容
    • ACK 标志位 = 1
    • 确认号 ack = u + 1
    • 序列号 seq = v
  • 含义:服务器对客户端说:“好的,我同意你关闭你那边的连接。”
  • 状态变化
    • 服务器进入 CLOSE-WAIT 状态。
    • 客户端收到这个 ACK 后,进入 FIN-WAIT-2 状态。
  • 注意:此时是 “半关闭”状态。从客户端到服务器的连接已关闭,但服务器到客户端的连接仍然存在,服务器可能还有未发送完的数据。

第三次挥手:FIN 从服务器发向客户端

  • 动作:当服务器也准备关闭连接时,它发送一个 FIN 报文。
  • 报文内容
    • FIN 标志位 = 1
    • ACK 标志位 = 1
    • 确认号 ack = u + 1(保持不变)
    • 序列号 seq = w(因为中途可能又发送了数据)。
  • 含义:服务器对客户端说:“我这边也处理完了,没有数据要发了,我也要关闭我这边到你的连接。”
  • 状态变化:服务器进入 LAST-ACK 状态。

第四次挥手:ACK 从客户端发向服务器

  • 动作:客户端收到服务器的 FIN 后,必须发出确认。
  • 报文内容
    • ACK 标志位 = 1
    • 确认号 ack = w + 1
    • 序列号 seq = u + 1
  • 含义:客户端对服务器说:“收到,同意你关闭。”
  • 状态变化
    • 客户端发送 ACK 后,进入 TIME-WAIT 状态,等待 2MSL(两倍最大报文段生存时间)后,才进入 CLOSED 状态。
    • 服务器一旦收到这个 ACK,立即进入 CLOSED 状态。

为什么是四次挥手?

因为 TCP 连接是全双工的,关闭时需要双方各自独立关闭。当客户端发起 FIN 时,只表示它没有数据发送了,但服务器可能还有数据要传,所以服务器的 ACKFIN 通常不能合并,需要分两步进行,这就比握手多了一次。

为什么客户端最后要等待 2MSL?

  1. 确保最后的 ACK 能到达服务器:如果服务器没收到 ACK,会重传 FIN,客户端在 TIME-WAIT 状态下能收到并重发 ACK。
  2. 让旧连接的报文在网络中消逝:防止本次连接的延迟报文被之后新建的、相同四元组(源IP、源端口、目的IP、目的端口)的连接错误地接收。

总结对比

特性三次握手四次挥手
目的建立可靠连接,同步序列号可靠地终止全双工连接
发起方客户端客户端或服务器均可
次数3次4次
关键标志SYN, ACKFIN, ACK
核心状态SYN-SENT, SYN-RCVD, ESTABLISHEDFIN-WAIT-1/2, CLOSE-WAIT, LAST-ACK, TIME-WAIT
为何不能合并服务器的 SYNACK可以且必须合并的服务器的 ACKFIN 通常不能合并,因为中间可能有数据要发送

简单来说,三次握手是“你好,你好,好的,开始说话”四次挥手是“我说完了,好的,我也说完了,好的,再见”。这个过程确保了浏览器与服务器之间通信的可靠性和有序性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝莓味的口香糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值