传输层是干什么的?
传输层位于网络层之上、应用层之下,核心任务只有一个:
负责把数据从发送端传输到接收端。
网络层(IP)负责把数据送到目标主机,但主机上可能同时运行着很多程序(浏览器、QQ、微信、游戏……),传输层要解决的是:
数据到了主机之后,到底交给哪个应用程序?
这就引出了“端口号”的概念。
端口号:一台主机上不同应用的“门牌号”
1. 什么是端口号?
端口号(Port)用来标识一台主机上进行通信的不同应用程序。
举个例子:你的电脑上同时开着:
FTP 服务器(端口 21)
SSH 服务器(端口 22)
SMTP 服务器(端口 25)
HTTP 服务器(端口 80)
FTP 客户端(端口 2000)
HTTP 客户端(端口 2001)
当数据到达你的主机时,传输层会根据目的端口号决定把数据交给哪个程序处理。
2. 五元组标识一个通信
在 TCP/IP 协议中,一个通信由以下五个元素唯一标识:
源 IP
源端口号
目的 IP
目的端口号
协议号(TCP 还是 UDP)
你可以用netstat -n命令查看当前的网络连接情况。
扩展:五元组就像快递单上的“寄件人地址+寄件人电话+收件人地址+收件人电话+快递类型”,缺一不可。
3. 端口号范围划分
| 范围 | 名称 | 说明 |
|---|---|---|
| 0 - 1023 | 知名端口号(Well-Known Port) | 固定分配给常用服务,如 HTTP(80)、FTP(21)、SSH(22) |
| 1024 - 65535 | 动态分配端口号 | 操作系统动态分配给客户端程序 |
常见知名端口号:
SSH 服务器:22
FTP 服务器:21
Telnet 服务器:23
HTTP 服务器:80
HTTPS 服务器:443
注意:我们自己写程序时,要避开这些知名端口号,否则可能和系统服务冲突。
4. 两个常见问题
问题1:一个进程是否可以 bind 多个端口号?
可以。一个进程可以绑定多个端口,但通常不这么做。
问题2:一个端口号是否可以被多个进程 bind?
一般情况下不行。一个端口号在同一时刻只能被一个进程绑定(除非使用 SO_REUSEPORT 等特殊选项)。
UDP 协议详解
1. UDP 协议端格式
UDP 数据报由首部(8 字节)和数据组成:
| 字段 | 长度 | 说明 |
|---|---|---|
| 16位源端口号 | 2 字节 | 发送方端口 |
| 16位目的端口号 | 2 字节 | 接收方端口 |
| 16位UDP长度 | 2 字节 | 整个数据报(首部+数据)的最大长度 |
| 16位UDP校验和 | 2 字节 | 用于检测数据是否出错 |
| 数据 | 可变 | 应用层数据 |
注意:如果校验和出错,UDP 会直接丢弃该数据报,不会通知应用层。
2. UDP 的特点
UDP 传输的过程类似于寄信:
无连接:知道对端的 IP 和端口号就直接发送,不需要建立连接。
不可靠:没有确认机制,没有重传机制。如果网络故障导致数据丢失,UDP 不会给应用层返回任何错误信息。
面向数据报:应用层交给 UDP 多长的报文,UDP 就原样发送,既不拆分,也不合并。
举个例子:
你用 UDP 发送 100 个字节:
发送端调用一次
sendto,发送 100 字节;接收端必须调用一次
recvfrom,接收 100 字节;不能循环调用 10 次
recvfrom,每次接收 10 字节。
扩展:这就像寄信,你寄出一整封信,收信人必须一次性收完整封信,不能分 10 次收。
3. UDP 的缓冲区
发送缓冲区:UDP 没有真正意义上的发送缓冲区。调用
sendto会直接交给内核,由内核传输给网络层。接收缓冲区:UDP 有接收缓冲区,但不能保证收到的 UDP 报的顺序和发送顺序一致。如果缓冲区满了,再到达的 UDP 数据就会被丢弃。
4. 全双工
UDP 的 socket 既能读,也能写,这个概念叫做全双工。
扩展:全双工就像打电话,双方可以同时说话和听对方说话。
UDP 使用注意事项
1. 最大长度限制
UDP 首部中有一个 16 位的“UDP 长度”字段,所以一个 UDP 能传输的数据最大长度是64K(包含 UDP 首部)。
64K 在当今互联网环境下非常小。如果需要传输超过 64K 的数据,就需要在应用层手动分包,多次发送,并在接收端手动拼装。
2. 基于 UDP 的应用层协议
NFS:网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议(用于无盘设备启动)
DNS:域名解析协议
当然,也包括你自己写 UDP 程序时自定义的应用层协议。
扩展内容:UDP 的优缺点与适用场景
1. 优点
速度快:没有连接建立、确认、重传等机制,开销小。
实时性好:适合对延迟敏感的应用,如视频直播、语音通话、在线游戏。
实现简单:协议首部只有 8 字节,处理逻辑简单。
2. 缺点
不可靠:数据可能丢失、乱序、重复。
无拥塞控制:网络拥塞时不会自动降速,可能加剧网络负担。
数据报大小受限:最大 64K。
3. 适用场景
实时音视频传输(如 WebRTC、RTSP)
DNS 查询
DHCP 配置
广播/多播通信
游戏对战数据同步
扩展:很多现代协议在 UDP 之上自己实现了可靠性,比如 QUIC(HTTP/3 的底层协议),就是基于 UDP 实现了类似 TCP 的可靠传输。
总结对比:UDP vs TCP
| 特性 | UDP | TCP |
|---|---|---|
| 连接方式 | 无连接 | 面向连接 |
| 可靠性 | 不可靠 | 可靠 |
| 传输方式 | 面向数据报 | 面向字节流 |
| 首部大小 | 8 字节 | 20 字节起 |
| 速度 | 快 | 慢 |
| 适用场景 | 实时、广播、简单查询 | 文件传输、网页、邮件 |
一句话记住 UDP
UDP 就像寄信:不建立连接、不保证送到、一次寄一整封,速度快但可能丢。