2. IP地址与端口:IPv4地址分类、子网掩码、默认网关、端口号范围、知名端口与动态端口
在TCP/IP网络通信中,IP地址用于标识网络中的一台主机,而端口号用于标识主机上的一个特定进程。理解IP地址的分类、子网掩码的作用以及端口号的划分,是进行Socket编程和网络故障排查的基础。
2.1 IPv4地址结构与分类
IPv4地址是一个32位的二进制数,通常用点分十进制表示(例如:192.168.1.1)。它由网络号和主机号两部分组成。根据网络号的长度,IPv4地址被分为A、B、C、D、E五类,其中A、B、C是常用的单播地址。
核心概念:IP地址 = 网络号 + 主机号。网络号标识一个网段,主机号标识该网段内的具体设备。
IPv4地址分类表
| 类别 | 首字节范围 | 默认子网掩码 | 网络号位数 | 主机号位数 | 最大主机数 | 典型用途 |
|---|---|---|---|---|---|---|
| A类 | 1 – 126 | 255.0.0.0 | 8位 | 24位 | 16,777,214 | 大型网络(如ISP骨干) |
| B类 | 128 – 191 | 255.255.0.0 | 16位 | 16位 | 65,534 | 中型网络(如企业园区) |
| C类 | 192 – 223 | 255.255.255.0 | 24位 | 8位 | 254 | 小型网络(如办公室、家庭) |
| D类 | 224 – 239 | 无 | 组播地址 | 组播地址 | N/A | 多播通信 |
| E类 | 240 – 255 | 无 | 保留 | 保留 | N/A | 实验与研究 |
注意:127.0.0.0/8是回环地址(Loopback),用于本地测试,不属于任何分类。127.0.0.1通常被称为localhost。
IPv4地址分类结构SVG图
2.2 子网掩码与默认网关
子网掩码
子网掩码是一个32位的掩码,用于将IP地址划分为网络号和主机号。子网掩码中为1的位对应网络号,为0的位对应主机号。通过子网掩码,可以判断两个IP地址是否属于同一个子网。
判断方法:将IP地址和子网掩码进行按位与(AND)运算,得到网络地址。如果两个IP的网络地址相同,则它们在同一子网内。
默认网关
默认网关是一个子网中主机的出口。当主机要访问其他子网(如互联网)时,数据包会被发送到默认网关,由网关进行路由转发。默认网关的IP地址通常是一个子网中可用的第一个或最后一个地址。
子网掩码与网关工作流程SVG图
2.3 端口号范围与分类
端口号是一个16位的整数,范围从0到65535。端口号用于区分同一台主机上的不同网络服务或进程。端口号分为以下三类:
| 类别 | 范围 | 说明 | 示例 |
|---|---|---|---|
| 知名端口 | 0 – 1023 | 由IANA分配,用于标准服务。通常需要管理员权限才能绑定。 | HTTP(80), HTTPS(443), FTP(21), SSH(22) |
| 注册端口 | 1024 – 49151 | 可由用户或应用程序注册使用,但需避免与知名端口冲突。 | MySQL(3306), PostgreSQL(5432), Docker(2375) |
| 动态/私有端口 | 49152 – 65535 | 临时端口,通常由客户端操作系统自动分配,用于临时通信。 | 浏览器访问网页时分配的临时端口 |
Socket编程提示:在编写服务器程序时,通常绑定知名端口或注册端口(如8080用于HTTP代理)。客户端程序则不需要指定端口,操作系统会自动从动态端口范围分配一个临时端口。
端口号范围分布SVG图
2.4 知名端口与动态端口详解
知名端口(Well-Known Ports)
知名端口范围是0-1023,由IANA(互联网号码分配局)统一分配。这些端口通常与特定的应用层协议绑定。在Socket编程中,绑定知名端口通常需要管理员/root权限。
常见知名端口列表:
- 20/21 – FTP(文件传输协议)
- 22 – SSH(安全外壳协议)
- 23 – Telnet(远程登录)
- 25 – SMTP(简单邮件传输协议)
- 53 – DNS(域名系统)
- 80 – HTTP(超文本传输协议)
- 443 – HTTPS(安全超文本传输协议)
动态端口(Dynamic/Private Ports)
动态端口范围是49152-65535。当客户端程序(如浏览器、Socket客户端)发起连接时,操作系统会自动从该范围中分配一个未使用的端口作为临时源端口。通信结束后,该端口会被释放,供其他程序使用。
常见问题:如果服务器程序绑定的端口被其他程序占用,启动时会报错“Address already in use”。此时可以使用
netstat -ano | grep <端口号> 或 lsof -i :<端口号> 查看占用端口的进程。
端口使用示例代码(Python)
import socket
# 服务器端:绑定知名端口 8080
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8080)) # 绑定到所有网络接口的8080端口
server_socket.listen(5)
print("服务器正在监听端口 8080...")
# 客户端:自动分配动态端口
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.1.10', 8080)) # 操作系统自动分配临时端口
print("客户端已连接,本地端口为:", client_socket.getsockname()[1])
2.5 本章小结
- IPv4地址分为A、B、C、D、E五类,其中A、B、C用于单播通信,D类用于多播,E类保留。
- 子网掩码用于划分网络号和主机号,默认网关是子网出口。
- 端口号范围0-65535,分为知名端口(0-1023)、注册端口(1024-49151)和动态端口(49152-65535)。
- 知名端口用于标准服务,动态端口由客户端临时分配。
- Socket编程中,服务器绑定固定端口,客户端使用临时端口。