今天继续网络基础的深入,重点复习了传输层协议(TCP/UDP)、连接管理(三次握手/四次挥手)、WebSocket 以及长连接与短连接的区别。以下是当天的问答整理。
Q1:TCP 和 UDP 的区别是什么?各自的应用场景?
我的回答:
- TCP 和 UDP 都在传输层工作。TCP 是面向连接的,需要经过三次握手、传输数据、四次挥手,确保双方都能接收到数据。UDP 是无连接的,直接发送带有标识符的数据包,因此速度更快,资源消耗更低。
补充:
- TCP(传输控制协议):
- 面向连接,提供可靠的、按序的、无重复的数据传输。
- 具备流量控制、拥塞控制、错误重传等机制。
- 适用于对数据完整性要求高的场景,如文件传输、网页浏览、电子邮件等。
- UDP(用户数据报协议):
- 无连接,尽最大努力交付,但不保证可靠性和顺序。
- 头部开销小(8字节),实时性好。
- 适用于实时性要求高、允许丢包的场景,如视频直播、语音通话、DNS查询等。
Q2:TCP 三次握手和四次挥手的过程是怎样的?为什么要三次握手?
我的回答:
- 三次握手:
- 客户端向服务端发送 SYN 包(同步序列号),请求建立连接。
- 服务端回复 SYN + ACK 包,确认收到客户端的 SYN,并发送自己的 SYN。
- 客户端回复 ACK 包,确认收到服务端的 SYN。连接建立。
- **需要三次握手是因为:**如果只用两次握手,服务端无法确认客户端是否收到了自己的 SYN+ACK,可能导致已失效的连接请求报文突然传到服务端,引起错误(如重复连接或数据丢失)。
- 四次挥手:
- 客户端发送 FIN 包,表示数据发送完毕,请求关闭连接。
- 服务端回复 ACK,确认收到关闭请求,但可能还有数据要发送,因此进入半关闭状态。
- 服务端数据发送完毕后,发送 FIN 包。
- 客户端回复 ACK,确认关闭,经过等待后连接彻底断开。
补充:
- **三次握手的根本原因:**为了防止已失效的连接请求报文段突然又传到服务端,造成错误。例如客户端第一个 SYN 在网络中滞留,客户端超时重传后成功建立连接并关闭,此时滞留的 SYN 才到达,服务端会误认为新连接请求,如果只有两次握手,就会直接建立连接并等待数据,浪费资源。三次握手可以让服务端确认客户端是否真的需要连接。
Q3:HTTP 和 WebSocket 的区别是什么?
我的回答:
- HTTP 属于半双工通信,只能由客户端向服务端发起请求,服务端响应。WebSocket 属于全双工通信,客户端和服务端可以互相主动发送消息,适用于需要实时数据交互的场景,如游戏、聊天、实时推送等。
补充:
- HTTP/1.x 确实是半双工,每次请求-响应都需要客户端主动发起。
- HTTP/2 引入了服务器推送和多路复用,但仍遵循客户端发起请求的模型,本质上还是客户端驱动。
- WebSocket 在建立连接后,两端可以随时发送数据,没有请求-响应的限制,适合实时通信。
- WebSocket 协议标识为 ws://(或 wss:// 加密版),默认端口 80 或 443。
Q4:WebSocket 是如何建立的?即从 HTTP 升级到 WebSocket 的过程。
我的回答:
- 刚开始不论是哪种网页,都是客户端向服务端发起 HTTP 请求,如果需要升级到WebSocket,HTTP 请求头中会携带特定的字段(如 Upgrade: websocket)以及一个随机生成的标识符(如 Sec-WebSocket-Key)。服务端验证匹配后,返回 101 Switching Protocols 状态码,之后通信就切换到 WebSocket 协议。
Q5:长连接和短连接有什么区别?HTTP 的 keep-alive 是什么?
我的回答:
- 短连接:每次请求数据都要创建一个新的 TCP 连接,完成后关闭。
- 长连接:可以复用同一个 TCP 连接进行多次请求,减少连接建立的开销。HTTP 的 keep-alive 就是长连接的一种实现,但依然需要客户端主动发起请求。
补充:
- 短连接:HTTP/1.0 默认使用短连接,每次请求都要经历 TCP 三次握手和四次挥手,效率较低。
- 长连接:HTTP/1.1 默认开启 Connection: keep-alive,可以在一个 TCP 连接上发送多个 HTTP 请求和响应,减少延迟和资源消耗。
- 但 keep-alive 只是保持连接不断开,并不是服务端推送,依然需要客户端主动请求。
- 长连接也有缺点:如果长时间不通信,连接可能被中间设备(如防火墙)断开,因此需要心跳机制维持连接(WebSocket 就常用心跳)。
- 此外,HTTP/2 的多路复用进一步优化了长连接,允许多个请求在同一个连接上并行传输。
今日知识点总结
| 概念 | 要点 |
| TCP vs UDP | TCP 面向连接、可靠、有序、流量控制;UDP 无连接、不可靠、低延迟、轻量 |
| 三次握手 | SYN → SYN+ACK → ACK,防止失效连接请求 |
| 四次挥手 | FIN → ACK → FIN → ACK,保证双方数据发送完毕 |
| HTTP 与 WebSocket | HTTP 半双工,客户端驱动;WebSocket 全双工,双向实时通信 |
| WebSocket 升级 | 通过 HTTP Upgrade 机制,携带 Sec-WebSocket-Key 等头,返回 101 状态码 |
| 长连接 vs 短连接 | 短连接每次新建 TCP;长连接复用连接,HTTP keep-alive 是长连接的一种 |
|---|