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图

IPv4地址分类结构 A类 1 – 126 大型网络 B类 128 – 191 中型网络 C类 192 – 223 小型网络 D类 224 – 239 多播 私有地址范围(RFC 1918) A类:10.0.0.0/8 B类:172.16.0.0 – 172.31.255.255 C类:192.168.0.0/16

2.2 子网掩码与默认网关

子网掩码

子网掩码是一个32位的掩码,用于将IP地址划分为网络号和主机号。子网掩码中为1的位对应网络号,为0的位对应主机号。通过子网掩码,可以判断两个IP地址是否属于同一个子网。

判断方法:将IP地址和子网掩码进行按位与(AND)运算,得到网络地址。如果两个IP的网络地址相同,则它们在同一子网内。

默认网关

默认网关是一个子网中主机的出口。当主机要访问其他子网(如互联网)时,数据包会被发送到默认网关,由网关进行路由转发。默认网关的IP地址通常是一个子网中可用的第一个或最后一个地址。

子网掩码与网关工作流程SVG图

子网掩码与默认网关工作流程 主机A IP: 192.168.1.10 默认网关 IP: 192.168.1.1 外部网络 目标: 8.8.8.8 流程说明 1. 主机A使用子网掩码 255.255.255.0 判断目标IP 8.8.8.8 不在同一子网 2. 主机A将数据包发送给默认网关 192.168.1.1 3. 默认网关将数据包路由到外部网络

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图

端口号范围分布 知名端口 0 – 1023 注册端口 1024 – 49151 动态端口 49152 – 65535 服务器通常绑定知名端口或注册端口;客户端使用动态端口进行临时通信 Socket编程中,服务器使用 bind() 绑定端口,客户端使用 connect() 自动分配临时端口

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编程中,服务器绑定固定端口,客户端使用临时端口。