攻克网络协议学习的 10 大难点,配动画演示、图解、类比和练习题
为什么不是两次或四次握手?三次握手的核心目的是什么?
第一次握手(SYN):客户端发送 SYN 包,服务端收到后确认"客户端发送能力正常"
第二次握手(SYN+ACK):服务端回复 SYN+ACK,客户端收到后确认"服务端收发能力都正常"
第三次握手(ACK):客户端回复 ACK,服务端收到后确认"客户端收发能力都正常"
结论:三次握手确保双方都确认了对方的发送和接收能力,建立可靠的双向通信通道。
认为三次握手只是为了同步序列号。实际上序列号同步只是附带效果,核心目的是确认双方的收发能力。
就像打电话:1) 你说"喂"(确认对方能听到);2) 对方说"喂,我听得到,你能听到我吗"(确认双方都能听到);3) 你说"能听到"(确认对方也能听到你)。三次确认才能确保双向通话正常。
为什么断开连接需要四次挥手?能不能像握手一样合并成三次?
第一次挥手(FIN):客户端发送 FIN,表示"我没有数据要发送了"
第二次挥手(ACK):服务端回复 ACK,确认收到 FIN,但服务端可能还有数据要发送
第三次挥手(FIN):服务端数据发送完毕后,发送 FIN,表示"我也没有数据了"
第四次挥手(ACK):客户端回复 ACK,确认收到服务端的 FIN
关键:第二次和第三次不能合并,因为服务端收到客户端的 FIN 后,可能还有数据需要发送,必须等数据发完才能发送自己的 FIN。
认为四次挥手是对称的。实际上第二次和第三次挥手之间可能有时间间隔(服务端发送剩余数据)。
就像结束通话:1) 你说"我说完了";2) 对方说"好的,我听到了"(但对方可能还有话要说);3) 对方说完后说"我也说完了";4) 你说"好的,拜拜"。不能合并是因为对方可能需要时间说完剩余的话。
HTTPS 如何安全地交换密钥?为什么需要非对称加密和对称加密结合?
1. ClientHello:客户端发送支持的 TLS 版本、加密套件、客户端随机数
2. ServerHello:服务端选择加密套件,发送服务端随机数、证书(含公钥)
3. 密钥交换:客户端生成预主密钥,用服务端公钥加密后发送
4. 生成会话密钥:双方用三个随机数(客户端 + 服务端 + 预主密钥)生成相同的会话密钥
5. 加密通信:之后所有通信都用会话密钥进行对称加密
认为 HTTPS 全程使用非对称加密。实际上只有握手阶段用非对称加密交换密钥,数据传输用对称加密(速度快 1000 倍)。
就像安全快递:1) 对方给你一个带锁的箱子(公钥);2) 你把秘密放进箱子锁好寄回(加密预主密钥);3) 对方有钥匙打开箱子(私钥解密);4) 你们约定用这个秘密作为暗号(会话密钥)进行后续通信。
WebSocket 连接是如何建立的?Upgrade 机制是如何工作的?
客户端请求:
GET /chat HTTP/1.1 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
服务端响应:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Accept 计算:Base64(SHA1(Key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))
认为 WebSocket 是完全独立的协议。实际上 WebSocket 借用 HTTP 端口(80/443)和 Upgrade 机制建立连接,之后才是独立的 WebSocket 协议。
HTTP/1.1 的队头阻塞是什么?HTTP/2 如何解决的?
HTTP/1.1 问题:一个 TCP 连接同一时间只能处理一个请求,必须等前一个响应完成才能发送下一个。多个请求需要建立多个 TCP 连接。
HTTP/2 解决方案:
结果:一个 TCP 连接可以并行处理多个请求,无需等待。
HTTP/1.1 像单车道公路,一辆车必须等前车到达才能出发;HTTP/2 像多车道高速公路,多辆车可以同时行驶,每辆车有自己的车道号(流 ID),到达后按车道号重组。
输入网址后,DNS 是如何一步步找到 IP 地址的?
1. 浏览器缓存:检查浏览器是否缓存过该域名的 DNS 记录
2. 系统缓存:检查操作系统 hosts 文件和 DNS 缓存
3. 本地 DNS 服务器:向 ISP 提供的 DNS 服务器查询
4. 根域名服务器:本地 DNS 向根服务器查询.com 的权威服务器
5. TLD 服务器:向.com 服务器查询 tongxinxieyi.com 的权威服务器
6. 权威服务器:向 tongxinxieyi.com 的权威服务器查询具体记录
7. 返回结果:层层返回,最终得到 IP 地址
认为 DNS 查询是直接查询目标域名的服务器。实际上需要经过根→TLD→权威的层级查询过程。
滑动窗口如何实现流量控制?发送窗口和接收窗口有什么区别?
发送窗口:发送方维护的窗口,表示已发送但未确认的数据范围
接收窗口:接收方在 ACK 中告知发送方自己还能接收多少数据
滑动机制:
目的:防止发送方发送过快,超过接收方处理能力。
就像传送带:接收方说"我这边只能放 10 个箱子"(窗口大小),发送方每放一个箱子,等接收方确认收到后,才能再放新的。这样确保不会堆积。
为什么 HTTPS 要同时使用两种加密?它们各自的优势是什么?
对称加密:
非对称加密:
HTTPS 的结合:用非对称加密安全交换对称密钥,之后用对称加密传输数据。
什么是幂等性?哪些 HTTP 方法是幂等的?为什么重要?
幂等性定义:同一个操作执行多次,结果与执行一次相同。
幂等方法:
重要性:网络请求可能超时重试,幂等操作可以安全重试而不产生副作用。
认为幂等就是"安全"。实际上 GET 是安全且幂等,PUT/DELETE 是幂等但不安全(会改变资源状态)。
为什么需要 WebSocket?长轮询不能解决问题吗?
短轮询:客户端每隔几秒请求一次服务器,询问是否有新数据。浪费带宽和服务器资源。
长轮询:客户端请求后,服务器保持连接直到有数据才返回。比短轮询好,但每次仍需重新建立连接。
WebSocket:
短轮询像每隔几分钟打电话问"有消息吗";长轮询像打电话后等对方有消息才挂;WebSocket 像建立专线电话,随时可以通话。