5.1 传输层干什么:端到端 + 端口号
网络层把包送到"主机",传输层再把数据送到主机里的"某个程序"。
- 端到端传输——网络层只管送到主机(点到点),传输层负责进程到进程(端到端)。
- 端口寻址——一台主机上跑着浏览器、微信、游戏,IP 只能找到机器,端口号才能找到具体程序:IP + 端口 才能唯一确定一个通信的端点。
- 复用与分用——多个程序共用一条网络通道(发送时复用),收到数据后再按端口分给对应程序(分用)。
- 差错控制 / 流量控制——TCP 的拿手好戏(UDP 则完全不管)。
端口号是 16 位,取值 0–65535,分三类:
| 范围 | 名称 | 说明 |
|---|---|---|
| 0 – 1023 | 熟知端口 | 给固定服务用,必须背(见下表) |
| 1024 – 49151 | 注册端口 | 登记给一般应用 |
| 49152 – 65535 | 动态/临时端口 | 客户端发起连接时临时分配 |
熟知端口必背表(选择题常客):
| 端口 | 协议/服务 | 端口 | 协议/服务 |
|---|---|---|---|
| 20 / 21 | FTP(数据 / 控制) | 53 | DNS |
| 22 | SSH | 67 / 68 | DHCP(服务器 / 客户端) |
| 23 | Telnet | 80 | HTTP |
| 25 | SMTP(发邮件) | 110 | POP3(收邮件) |
| 143 | IMAP | 443 | HTTPS |
5.2 TCP vs UDP:必须能张口说出三条区别
两者都是传输层协议,但性格完全相反。
| TCP | UDP | |
|---|---|---|
| 连接 | 面向连接(先三次握手) | 无连接,直接发 |
| 可靠性 | 可靠:确认、重传、按序到达 | 不可靠:发出去不保证到达、不保证顺序 |
| 速度/开销 | 慢、开销大(头部 20 字节起) | 快、开销小(头部固定 8 字节) |
| 数据单位 | 报文段(segment) | 用户数据报(datagram) |
| 适用场景 | 文件传输、网页浏览、收发邮件——不许丢的场合 | 视频直播、语音通话、DNS 查询——快了再说的场合 |
一句话记忆
- TCP 求稳,UDP 求快。直播宁愿糊一下也不能卡(丢几帧没关系),传文件丢一个字节都不行。
- DNS 查询用 UDP(一次问答就结束,不需要建连接);但 DNS 区域传送用 TCP。
课堂练习(3 题)
- 视频会议适合用 TCP 还是 UDP?为什么? 答:UDP。实时性优先,偶发丢包重传反而造成更大延迟。
- UDP 的头部是多少字节? 答:固定 8 字节(TCP 头部最少 20 字节)。
- 列举 TCP 保证可靠传输的两个机制。 答:确认应答与超时重传(另外还有序号确保按序、滑动窗口做流量控制等,答出任意两个即可)。
5.3 三次握手:为什么是三次不是两次
过程要会写,原因要能说——两问都是考点。
为什么必须三次?
- 核心目的:双方都确认"自己的发送能力和对方的接收能力"都正常。
- 如果只有两次:客户端发了连接请求,服务器同意后就认为建立了; 但一个滞留的老请求可能突然到达服务器,服务器误以为新连接又同意,白白建立一条没人用的连接。 第三次握手让客户端有机会对"意外的同意"置之不理。
易错
- 握手包里 SYN 和 ACK 是标志位(等于 1 表示有效),不要和序号搞混。
- "三次握手为了可靠传输"太笼统——要答出"确认双方收发能力 / 防止失效的旧请求建立连接"。
课堂练习(2 题)
- 三次握手中第二次握手报文包含哪些标志?方向是谁发给谁? 答:服务器 → 客户端,含 SYN=1 和 ACK=1,带着自己的序号 y 和对 x 的确认。
- 为什么不用两次握手就建立连接? 答:防止已失效的旧连接请求报文突然到达服务器,导致服务器单方面建立无效连接、浪费资源;三次握手保证双方都确认了对方的收发能力。
5.4 四次挥手:为什么多了一次
记住"双向都要关"这个本质,四次的原因自然顺出来。
客户端 服务器 ── FIN=1 ─────────────────────→ ① 我没数据要发了,想关 ←──────── ACK=1 ────────────────── ② 知道了(但可能还有数据没发完) ←──────── FIN=1 ────────────────── ③ 我的数据也发完了,可以关了 ── ACK=1 ────────────────────→ ④ 收到,再见(等 2MSL 后彻底关闭)
为什么挥手要四次(比握手多一次)?
- TCP 连接全双工——两个方向要分别关闭。
- 收到对方的 FIN 后,本方向可能还有数据没发完,所以先回一个 ACK 表示"知道你要关了", 等自己数据发完再单独发 FIN。ACK 和 FIN 分开发 = 多了一次。
顺带认识:TIME_WAIT
- 主动关闭方最后要等 2MSL 才真正关闭,确保最后那个 ACK 能到达对方、也让旧报文在网络中消失。
课堂练习(2 题)
- 四次挥手比三次握手多一次的根本原因是什么? 答:连接是全双工的,两个方向分别关闭;且收到对方 FIN 后己方可能还有数据要发,ACK 与自己的 FIN 不能合并,故需要四次。
- 为什么主动关闭方要等待 2MSL? 答:确保最后的 ACK 能送达对方(对方没收到会重发 FIN);同时让本次连接的所有旧报文段在网络中消逝,避免影响新连接。
5.5 TCP 的可靠性是怎么做到的
概念站住即可:确认、重传、序号、窗口、拥塞控制。
| 机制 | 作用 |
|---|---|
| 序号 + 确认应答(ACK) | 每个字节都有编号,接收方确认"收到哪了";发送方据此知道有没有丢 |
| 超时重传 | 发出后一段时间没收到确认,就重发 |
| 滑动窗口 | 不必"发一个等一个",可以连发多个再统一确认,提升效率(流量控制:按接收方能力调整发送量) |
| 拥塞控制 | 网络堵了就主动降速(慢启动、拥塞避免等,知道名字即可) |
课堂练习(2 题)
- "滑动窗口"解决什么问题? 答:实现流量控制并提高传输效率——允许一次连续发送多个报文段,而不必每发一个就停下来等确认。
- TCP 收到乱序到达的报文段会怎么处理? 答:依靠序号重整按序交付(一般先缓存乱序段,等缺失段到达后按序号提交给应用层)。