传输层
传输层负责端到端的连接建立、数据分段与流量控制。这篇讲 TCP 与 UDP 的区别、TCP 的三次握手与四次挥手、TCP/UDP 的封装字段,以及常用端口号。
TCP 与 UDP 对比
传输层有两个核心协议:
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不可靠传输 |
| 资源占用 | 大 | 小 |
| 速度 | 延迟相对较高 | 传输速度快 |
| 典型场景 | 文件传输、网页 | 语音、视频、查询应答 |
TCP 可靠的原因:有排序、有确认、有重传、有流控。
TCP
封装字段
TCP 头部的关键字段:
| 字段 | 作用 |
|---|---|
| Source Port | 源端口 |
| Destination Port | 目标端口 |
| Sequence Number | 序列号(排序) |
| Acknowledge Number | 确认号(确认) |
| SYN | 同步,建立连接 |
| ACK | 确认 |
| PSH | 传送(push) |
| FIN | 结束连接 |
| RST | 重置连接 |
| URG | 紧急 |
| Window | 窗口大小(流控) |
| Checksum | 首部校验 |
三次握手
TCP 建立连接需要三次握手,通知对方进行数据收发:
- 第一次握手:客户端发送 SYN 包(seq=j)到服务器,进入
SYN_SENT状态,等待确认。 - 第二次握手:服务器收到 SYN,回复 SYN+ACK 包(ack=j+1,自己的 seq=k),进入
SYN_RECV状态。 - 第三次握手:客户端收到 SYN+ACK 后,发送确认包 ACK(ack=k+1)。发送完毕后,双方进入
ESTABLISHED状态,连接建立成功。
四次挥手
TCP 断开连接需要四次挥手:
- 主机 A 数据发送完毕,向 B 发送带 FIN 标记的报文段。
- 主机 B 收到 FIN 后,先回复一个 ACK(确认序号),并通知自己的应用程序对方要求关闭连接。(先发 ACK 是为了防止这段时间内对方重传 FIN。)
- 主机 B 的应用程序准备好后,向 A 发送一个 FIN 报文段,表示彻底关闭。
- 主机 A 收到 FIN 后,向 B 发送 ACK,连接彻底释放。
握手用三次而挥手用四次,是因为关闭连接时,被动方收到 FIN 后往往还有数据要发送,所以把 ACK 和 FIN 分两次发出。
常用 TCP 端口号
| 端口 | 服务 | 端口 | 服务 |
|---|---|---|---|
| 20 + 21 | FTP | 80 | HTTP |
| 22 | SSH | 110 | POP3 |
| 23 | Telnet | 443 | HTTPS |
| 25 | SMTP | 53 | DNS(也用 TCP) |
UDP
封装字段
UDP 头部仅占 8 字节,只有:源端口、目标端口、长度、校验和。
特点:
- 传输数据时没有确认机制,报文到达确认、排序、流量控制等需由应用程序自行实现。
- 不提供重传机制,占用资源小、处理效率高。
- 面向无连接,因此可以实现广播发送。
- 属于不可靠传输,可能丢包,实际应用需程序员编程验证。
时延敏感的流量(语音、视频)通常使用 UDP。使用 UDP 的服务还包括 NTP(网络时间协议)、DNS(DNS 也使用 TCP)、NFS、SNMP 等。
常用 UDP 端口号
| 端口 | 服务 |
|---|---|
| 53 | DNS |
| 69 | TFTP |
| 161 | SNMP |
安全提示:欺骗 UDP 包比欺骗 TCP 包更容易,因为 UDP 没有建立初始连接(握手),与 UDP 相关的服务面临更大的安全风险。
最后更新于