0. Socket 与五元组 基础知识
Socket(套接字)是应用层与传输层之间的"门牌"。通信前双方都要先调用 socket() 创建它。
一条网络连接由五元组唯一确定。点击按钮,随机"拨号"建立一条连接看看:
💡 客户端端口通常是系统随机分配的高位端口(49152~65535),服务器端口是固定的知名端口(如 80、443)。
1. TCP 三次握手 建立连接
TCP 是面向连接的协议:发数据前必须先"握手"确认双方都在线且收发能力正常。 点"下一步"逐包观察,注意两侧的状态变化和 SYN / ACK 序号。
💡 为什么是三次而不是两次?—— 只有第三次才能让服务器确认"客户端的接收能力正常",同时防止已失效的历史连接请求突然送达造成错误连接。
2. TCP 数据传输与可靠交付 超时重传
连接建立后,输入消息并发送。TCP 会把数据拆成若干报文段,每段带序号 SEQ, 接收方必须回复 ACK 确认。打开丢包模拟:丢失的报文段会触发超时重传——这就是 TCP 可靠性的来源。
💡 发送方每发出一段就启动定时器;超时未收到 ACK 就重发。真实 TCP 还有滑动窗口、流量控制、拥塞控制,比这复杂得多。
3. TCP 四次挥手 断开连接
TCP 连接是全双工的,两个方向要分别关闭,因此需要四次挥手。 逐步观察 FIN 与 ACK 的交互,以及客户端最后的 TIME_WAIT 状态。
💡 主动关闭方要等待 2MSL(约 1~4 分钟)才真正 CLOSED:确保最后一个 ACK 若丢失,还来得及响应对方重传的 FIN。
4. UDP 通信 无连接
UDP 没有握手、没有确认、没有重传——sendto() 一调用,数据报就直接扔上网络,听天由命。
试试发送单条消息,再"连发 3 个"观察乱序到达;打开丢包模拟看数据报悄无声息地消失。
💡 听起来不可靠?但 UDP 开销小、延迟低——视频直播、语音通话、DNS 查询都在用它:偶尔丢一帧无所谓,卡住等重传才致命。
5. TCP vs UDP 对比总结 速查表
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接,直接发 |
| 可靠性 | 可靠:确认 + 重传 + 去重 | 不保证送达 |
| 顺序 | 保证按序交付 | 可能乱序 |
| 首部开销 | 20~60 字节 | 仅 8 字节 |
| 速度/延迟 | 较慢(握手、确认、拥塞控制) | 快,延迟低 |
| 流量/拥塞控制 | 有 | 无(应用层自己管) |
| 通信方式 | 点对点(单播) | 支持单播 / 广播 / 组播 |
| 典型应用 | HTTP/HTTPS、文件传输、邮件、SSH | DNS、视频直播、语音通话、游戏、QUIC |
💡 没有绝对的优劣:要"一个都不能少"选 TCP,要"快比全重要"选 UDP。HTTP/3 的 QUIC 协议正是在 UDP 之上自己实现了可靠性。