🌐 交互式 TCP / UDP 实验室

从创建 Socket 到收发消息,一步步看着数据包在客户端和服务器之间穿梭。 亲手触发三次握手、模拟丢包重传、对比两种协议的真实差异。

0. Socket 与五元组 基础知识

Socket(套接字)是应用层与传输层之间的"门牌"。通信前双方都要先调用 socket() 创建它。 一条网络连接由五元组唯一确定。点击按钮,随机"拨号"建立一条连接看看:

协议
TCP
源 IP(客户端)
源端口
目的 IP(服务器)
目的端口

💡 客户端端口通常是系统随机分配的高位端口(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 对比总结 速查表

特性TCPUDP
连接面向连接(三次握手)无连接,直接发
可靠性可靠:确认 + 重传 + 去重不保证送达
顺序保证按序交付可能乱序
首部开销20~60 字节仅 8 字节
速度/延迟较慢(握手、确认、拥塞控制)快,延迟低
流量/拥塞控制无(应用层自己管)
通信方式点对点(单播)支持单播 / 广播 / 组播
典型应用HTTP/HTTPS、文件传输、邮件、SSHDNS、视频直播、语音通话、游戏、QUIC

💡 没有绝对的优劣:要"一个都不能少"选 TCP,要"快比全重要"选 UDP。HTTP/3 的 QUIC 协议正是在 UDP 之上自己实现了可靠性。