端口号基础
端口号(Port)标识了主机上正在通信的不同应用程序。在 TCP/IP 协议中,我们通常使用'源 IP、源端口号、目的 IP、目的端口号、协议号'这五元组来唯一标识一个通信连接。
端口范围划分
- 0 - 1023:知名端口号。HTTP、FTP、SSH 等广泛使用的应用层协议固定占用这些端口。
- 1024 - 65535:动态分配端口。客户端程序通常由操作系统从该范围随机分配端口。
常见知名端口
- SSH 服务器:22
- FTP 服务器:21
- Telnet 服务器:23
- HTTP 服务器:80
- HTTPS 服务器:443
可以通过以下命令查看系统定义的知名端口:
cat /etc/services
开发时若需自定义端口,建议避开上述知名端口。
常用网络命令
netstat 是网络管理中常用的命令行工具,用于查看网络连接状态。
-p:显示与每个连接关联的进程 ID(需 root 权限)-u:仅显示 UDP 连接-t:仅显示 TCP 连接-l:仅显示监听状态的端口-a:显示所有端口-n:以数字形式显示 IP 地址和端口号
pidof 命令可通过进程名快速查询进程 ID,便于排查服务器进程。
pidof [进程名]
进程与端口的关系
- 一个进程可以绑定多个端口号吗?不可以,端口号通常标识唯一的进程实例。
- 一个端口号可以被多个进程绑定吗?可以,例如通过 SO_REUSEADDR 选项或不同协议栈。
UDP 协议
协议段格式
UDP 报头结构相对简单,包含以下字段:
- 16 位源端口号:标识发送方端口
- 16 位目的端口号:标识接收方端口
- 16 位长度:整个 UDP 报文长度(含报头)
- 16 位校验和:检测传输错误
UDP 协议由报头和有效载荷组成。由于报头长度固定为 8 字节,剩余部分即为数据。接收方通过目的端口号将数据交付给上层进程。此外,UDP 长度字段记录了总长度,若实际接收数据不足,说明报文未收齐,将被丢弃。
内核中的 UDP 管理
在内核层面,UDP 报头可视为一个结构体:
struct udphdr {
uint32_t srcport:16;
uint32_t dstport:16;
uint32_t length:16;
uint32_t checksum:;
};


