目录
前言回顾、引入与总结
一、传输层的核心职责
二、端口号(Port Number)的作用
1、什么是端口号?
2、为什么需要端口号?
3、端口号的分类
三、五元组:唯一标识一次网络通信
1、为什么需要五元组?
2、实际查看五元组:netstat 命令
四、协议号 vs 端口号:作用层级不同(重点!!!)
数据交付流程示例(自底向上)
五、什么是知名端口号?
六、常见知名端口号一览
七、如何查看系统中的知名端口号?
文件格式说明
八、关于端口绑定的两个关键问题(非常重要!!!)
问题一:一个端口号是否可以被多个进程同时绑定?
问题二:一个进程是否可以绑定多个端口号?
九、网络与系统性能监控工具:netstat、iostat 与 pidof
1、netstat:网络状态查看利器
1. 功能概述
2. 常用选项详解
3. 典型使用场景
查看 TCP 监听服务(最常见)
查看 UDP 监听服务
查看所有活动连接(包括 ESTABLISHED、TIME_WAIT 等)
2、iostat:CPU 与磁盘 I/O 性能监控
1. 功能概述
2. 常用选项说明
3. 典型用法
实时监控 CPU + 磁盘 I/O(每 2 秒刷新一次,共 5 次)
仅查看 CPU 使用情况
查看磁盘 I/O(以 MB/s 为单位)
4. 关键指标解读(CPU 部分)
5. 磁盘 I/O 关键指标(-x 模式)
3、pidof:通过进程名快速获取 PID
1. 功能说明
2. 基本用法
示例:
3. 实战例子:配合 kill 快速终止进程
4. 替代方案对比
4、总结与最佳实践
前言回顾、引入与总结
在学习 HTTP 等应用层协议时,为了简化理解,我们常常会“忽略”底层细节,直接认为 HTTP 请求和响应是“直接发送到网络中”的。然而,真实的数据传输过程远比这复杂。
实际上,应用层生成的数据(如 HTTP 报文)并不会直接进入网络,而是先交给传输层。传输层对数据进行封装、处理(如分段、添加头部信息、提供可靠性保障等),再将封装后的数据单元向下交付给网络层(IP 层),最终通过链路层和物理层真正发送到网络中。这个过程贯穿整个TCP/IP 协议栈,每一层都承担特定职责。
传输层是应用层与网络层之间的桥梁,负责端到端的数据传输服务。
端口号是传输层的关键机制,用于实现多进程并发通信。
五元组(源IP、源端口、目的IP、目的端口、协议号)唯一标识一次网络通信会话,是连接管理、防火墙规则、负载均衡等技术的基础。
协议号和端口号虽都用于“标识”,但分别作用于网络层→传输层和传输层→应用层,不可混淆。
知名端口号(0–1023)是互联网基础设施的重要组成部分,确保了服务的标准化和互操作性。
/etc/services是本地系统维护服务-端口映射的权威文件,可用于查询或调试。端口绑定遵循“一对一”原则(同一协议/IP下),但一个进程可绑定多个端口,这是构建多功能网络服务的基础。
理解端口分配与绑定机制,对网络编程、系统运维、安全防护(如防火墙规则配置)都至关重要。
一、传输层的核心职责
传输层位于 OSI 模型的第四层,在 TCP/IP 模型中同样处于关键位置。其主要功能包括:
端到端通信:为运行在不同主机上的应用程序提供逻辑通信通道。
可靠传输(如 TCP):确保数据按序、无差错、不丢失、不重复地送达。
流量控制与拥塞控制:防止发送方过快导致接收方或网络崩溃。
多路复用与分用:通过端口号区分同一主机上不同的应用进程。
简单理解:你可以把传输层想象成“快递公司的分拣中心”——它不仅负责把包裹(数据)安全送到目的地城市(IP 地址),还要准确投递到具体的收件人(端口号对应的进程)。
二、端口号(Port Number)的作用
1、什么是端口号?
端口号是一个 16 位的整数(范围 0~65535),用于标识主机上某个正在运行的网络通信进程。
它是传输层的概念,出现在 TCP 或 UDP 报文头部中。
2、为什么需要端口号?
当一台主机同时运行多个网络应用(如 Web 服务器、邮件客户端、游戏程序等),网络数据到达该主机后,操作系统必须知道该把数据交给哪个应用程序处理。
关键机制:目的端口号决定了数据应交付给哪个上层进程。(自底向上交付)
例如:
当你访问
http://example.com,浏览器会向目标服务器的80 端口(HTTP 默认端口)发送请求。服务器收到数据后,查看目的端口号为 80,于是将数据交给监听 8 port 的 Web 服务进程(如 Nginx 或 Apache)。
3、端口号的分类
| 类型 | 范围 | 说明 |
|---|---|---|
| 知名端口(Well-known) | 0–1023 | 由 IANA 分配,用于标准服务(如 22/SSH, 80/HTTP, 443/HTTPS) |
| 注册端口(Registered) | 1024–49151 | 可被用户或厂商注册使用(如 MySQL 默认 3306) |
| 动态/私有端口(Dynamic/Private) | 49152–65535 | 通常由客户端临时使用(如浏览器随机选择源端口) |
三、五元组:唯一标识一次网络通信
在 TCP/IP 网络中,一次完整的双向通信会话由以下五个元素共同唯一确定,称为“五元组”(5-tuple):
| 元素 | 说明 |
|---|---|
| 源 IP 地址 | 发送方主机的 IP 地址 |
| 源端口号 | 发送方进程使用的端口号 |
| 目的 IP 地址 | 接收方主机的 IP 地址 |
| 目的端口号 | 接收方进程监听的端口号 |
| 协议号 | 使用的传输层协议(如 TCP=6,UDP=17) |
1、为什么需要五元组?
考虑以下场景:
多个客户端(不同 IP)同时访问同一个 Web 服务器(IP: 203.0.113.10, 端口 80)。
同一个客户端上可能同时打开多个浏览器标签页(每个标签页使用不同的源端口)访问同一网站。
服务器如何区分这些并发连接?答案:通过五元组。例子如下:
连接1:(192.168.1.10:50000 → 203.0.113.10:80, TCP)
连接2: (192.168.1.10:50001 → 203.0.113.10:80, TCP)
连接3: (10.0.0.5:49152 → 203.0.113.10:80, TCP)
这三个连接虽然目的相同,但源端口或源 IP 不同,因此是三个独立的会话。图示例子如下:
分析过程具体如下:
首先提取数据中的目的IP地址和端口号,确认该数据是发送给当前服务进程的。
接着解析数据中的协议号,根据协议类型提供相应服务。
最后获取数据中的源IP地址和端口号,将其作为响应数据的目的地址和端口,将结果返回给对应的客户端进程。
2、实际查看五元组:netstat命令
在 Linux 或 Windows 中,使用netstat -an可查看当前活动连接,如下:
Local Address= 源 IP + 源端口(本机视角)
Foreign Address= 目的 IP + 目的端口(远程主机)
Proto= 协议类型(TCP/UDP)
注意:从服务器角度看,“Local” 是它的 IP 和端口(如 203.0.113.10:80),“Foreign” 是客户端信息。
还可以使用 netstat -nltp 命令,大致输出也是一样的,如下:
四、协议号 vs 端口号:作用层级不同(重点!!!)
虽然两者都用于“标识”,但它们属于不同协议层,作用也不同:
| 对比项 | 协议号(Protocol Number) | 端口号(Port Number) |
|---|---|---|
| 所在位置 | IP 报头(网络层) | TCP/UDP 报头(传输层) |
| 长度 | 8 位 | 16 位 |
| 作用 | 告诉目的主机的IP 层:应将数据交给哪个传输层协议(如 TCP 还是 UDP) | 告诉目的主机的传输层:应将数据交给哪个应用进程 |
| 示例 | TCP = 6, UDP = 17, ICMP = 1 | HTTP = 80, HTTPS = 443, SSH = 22 |
| 作用边界 | 网络层 ↔ 传输层 | 传输层 ↔ 应用层 |
数据交付流程示例(自底向上)
数据帧到达主机 → 链路层剥离帧头 → 交给 IP 层。
IP 层检查目的 IP 是否是本机→ 是,则查看协议号(如 6 表示 TCP)→ 将数据交给 TCP 模块。
TCP 模块解析报头 → 提取目的端口号(如 80)→ 查找本地监听 80 端口的进程(如 Web 服务器)→ 将数据交付给该进程。
五、什么是知名端口号?
在网络通信中,端口号不仅用于区分同一主机上的不同应用进程,还承载着标准化的服务识别功能。为了确保互操作性和兼容性,许多广泛使用的网络服务被分配了固定的、广为人知的端口号,这些被称为“知名端口号”(Well-known Ports)。
定义:知名端口号是指0 到 1023 范围内的端口号,由IANA(Internet Assigned Numbers Authority)统一管理和分配。
特点:
通常用于标准、核心的网络服务(如 Web、邮件、远程登录等)。
在大多数操作系统中,只有特权用户(如 root 或管理员)才能绑定这些端口,以防止普通程序冒充关键服务。
客户端在访问这些服务时,无需显式指定端口号(例如访问
http://example.com默认使用 80 端口)。
六、常见知名端口号一览
| 服务名称 | 端口号 | 传输协议 | 功能说明 |
|---|---|---|---|
| SSH(Secure Shell) | 22 | TCP | 安全远程登录、命令执行、文件传输(如scp,sftp) |
| FTP(File Transfer Protocol) | 21 | TCP | 文件传输控制连接(数据传输通常使用动态端口) |
| Telnet | 23 | TCP | 明文远程终端登录(不安全,已基本被 SSH 取代) |
| HTTP(HyperText Transfer Protocol) | 80 | TCP | 万维网(WWW)的默认明文通信端口 |
| HTTPS(HTTP Secure) | 443 | TCP | 基于 TLS/SSL 加密的 HTTP 通信,用于安全网页浏览 |
| SMTP(Simple Mail Transfer Protocol) | 25 | TCP | 邮件发送(服务器间传输) |
| DNS(Domain Name System) | 53 | TCP/UDP | 域名解析(查询通常用 UDP,区域传输用 TCP) |
| DHCP(Dynamic Host Configuration Protocol) | 67/68 | UDP | 自动分配 IP 地址(服务器 67,客户端 68) |
| POP3(Post Office Protocol v3) | 110 | TCP | 邮件收取(明文) |
| IMAP(Internet Message Access Protocol) | 143 | TCP | 邮件同步与管理(支持更复杂的操作) |
提示:现代 Web 开发中,若使用非标准端口(如http://localhost:3000),必须显式写出端口号。
七、如何查看系统中的知名端口号?
在类 Unix 系统(如 Linux、macOS)中,所有已注册的服务与端口映射关系记录在/etc/services文件中(可以使用 vim 查看该文件)。
文件格式说明
每行代表一个服务,字段之间用空格或制表符(TAB)分隔,通常包含以下四个部分:服务名称、端口号/协议、[别名]、[# 注释]
“ssh 22/tcp # SSH Remote Login Protocol”:ssh 22/tcp表示 SSH 服务使用 TCP 协议的 22 端口。“http 80/tcp www # WorldWideWeb HTTP”:www是http的别名,因此ping www实际上无意义(但某些工具可能支持服务名解析)。注释以
#开头,用于说明用途。
使用技巧:可通过grep快速查找特定服务
grep "^http" /etc/services作用:在/etc/services文件中查找以字符串 "http" 开头的行。
逐部分解释:
grep:Linux/Unix 中用于文本搜索的命令。"^http":^是正则表达式中的“行首锚点”,表示匹配行的开头。http是要查找的字符串。所以
"^http"表示只匹配那些行首就是 "http" 的行(例如http 80/tcp),而不会匹配像old-http 8080/tcp这样的行(因为 "http" 不在行首)。
/etc/services:这是系统中定义网络服务及其对应端口号和协议的文本文件。
示例输出:这个命令常用于快速查看 HTTP 服务在系统中注册的标准端口信息。
八、关于端口绑定的两个关键问题(非常重要!!!)
问题一:一个端口号是否可以被多个进程同时绑定?
答案:不可以(在同一协议、同一 IP 下)。
端口号的核心作用是唯一标识一个通信端点(endpoint)。
在相同的传输协议(TCP 或 UDP)和相同的本地 IP 地址下,一个端口只能被一个进程绑定。
如果尝试让第二个进程绑定已被占用的端口,系统会返回错误(如
Address already in use)。
例外情况(高级):
使用
SO_REUSEPORT(Linux)等 socket 选项,允许多个进程绑定相同端口,但需满足特定条件(如负载均衡场景),且内核会自动分发连接。不同协议可共用端口号:例如 TCP 80 和 UDP 80 是两个独立的端口,可分别被不同服务使用(尽管不常见)。
问题二:一个进程是否可以绑定多个端口号?
答案:完全可以,且非常常见。
这与“端口号唯一标识进程”的原则并不矛盾。
系统约束的是“一个端口 → 一个进程”的单向映射,不要求“一个进程 → 仅一个端口”。
实际应用中,很多服务会监听多个端口以提供不同功能或兼容性。
典型例子:
Web 服务器(如 Nginx):同时监听 80(HTTP)和 443(HTTPS);甚至可监听多个虚拟主机的不同端口。
数据库服务:MySQL 默认监听 3306,但也可能开启额外端口用于管理或复制。
P2P 应用或游戏服务器:主控端口 + 多个数据通道端口。
技术实现:一个进程通过创建多个 socket 并分别调用bind()绑定不同端口即可实现。
九、网络与系统性能监控工具:netstat、iostat与pidof
在 Linux 系统运维、网络调试和性能分析中,掌握关键命令行工具至关重要。下面将详细讲解三个常用工具:
netstat:用于查看网络连接、监听端口和服务状态;iostat:用于监控 CPU 使用率和磁盘 I/O 性能;pidof:用于通过进程名快速获取其 PID(进程标识符)。
1、netstat:网络状态查看利器
1. 功能概述
netstat(Network Statistics)是一个经典的网络诊断工具,用于显示:
活动的网络连接(TCP/UDP)
监听的端口(LISTEN 状态)
路由表、接口统计、伪装连接、多播成员等(较少用)
注意:在现代 Linux 发行版中,netstat已逐渐被更高效、功能更强的ss(Socket Statistics)命令取代(来自iproute2包),但因其语法直观,仍广泛用于教学和脚本中。
2. 常用选项详解
| 选项 | 说明 |
|---|---|
-n | 以数字形式显示地址和端口号(不解析主机名、服务名)。例如:显示192.168.1.10:80而非example.com:http。提升执行速度,避免 DNS 查询延迟。 |
-l | 仅显示处于 LISTEN(监听)状态的套接字(即服务器正在等待连接的服务)。 |
-p | 显示使用该连接或监听端口的进程名和 PID(需 root 权限才能查看其他用户的进程)。 |
-t | 仅显示TCP 协议相关的连接。 |
-u | 仅显示UDP 协议相关的连接。 |
-a | 显示所有连接和监听端口(包括非 LISTEN 状态的连接,默认不显示 LISTEN)。 |
3. 典型使用场景
查看 TCP 监听服务(最常见)
netstat -nltp-n:数字格式-l:仅监听-t:TCP-p:显示进程名/PID
输出示例:
查看 UDP 监听服务
netstat -nlup查看所有活动连接(包括 ESTABLISHED、TIME_WAIT 等)
netstat -ntap # 查看所有 TCP 连接及进程netstat -nuap # 查看所有 UDP 连接及进程小技巧:结合grep过滤特定端口或服务
sudo netstat -nltp | grep :33062、iostat:CPU 与磁盘 I/O 性能监控
1. 功能概述
iostat(Input/Output Statistics)是sysstat工具包的一部分,用于监控:
CPU 使用情况
磁盘设备(或分区)的 I/O 负载
常用于诊断系统卡顿、磁盘瓶颈、高 I/O 等待等问题。安装提示(若未安装):
# Ubuntu/Debian sudo apt install sysstat # CentOS/RHEL sudo yum install sysstat我的服务器已经是安装了sysstat 工具包的:
2. 常用选项说明
| 选项 | 说明 |
|---|---|
-c | 仅显示CPU 使用统计 |
-d | 仅显示设备(磁盘)I/O 统计 |
-x | 显示扩展(详细)统计信息(强烈推荐) |
-k | 以KB/s为单位显示 I/O 速率 |
-m | 以MB/s为单位显示 I/O 速率 |
-p [device] | 显示指定设备的分区 I/O 信息(如sda1,sdb) |
-t | 在输出中包含时间戳 |
N | 显示LVM 或设备映射器(如 /dev/mapper/...)的名称(需配合-x) |
| n | 显示NFS使用情况 |
| V | 显示版本信息 |
3. 典型用法
实时监控 CPU + 磁盘 I/O(每 2 秒刷新一次,共 5 次)
iostat -x 2 5仅查看 CPU 使用情况
iostat -c查看磁盘 I/O(以 MB/s 为单位)
iostat -xdm 14. 关键指标解读(CPU 部分)
| 字段 | 含义 |
|---|---|
%user | CPU 在用户空间执行普通进程的时间百分比(不含 nice 进程) |
%nice | CPU 在低优先级(nice > 0)用户进程上花费的时间 |
%system | CPU 在内核空间执行系统调用、中断处理等的时间 |
%iowait | CPU空闲但有未完成的 I/O 请求的时间百分比 →高值可能表示磁盘瓶颈 |
%steal | 虚拟机中,被 Hypervisor 抢占 CPU 时间的比例(仅虚拟化环境有意义) |
%idle | CPU 完全空闲的时间百分比 |
重点关注:
若
%iowait持续高于 10%~20%,说明磁盘 I/O 成为瓶颈;若
%user+%system接近 100% 且%idle≈ 0,说明 CPU 过载。
5. 磁盘 I/O 关键指标(-x模式)
| 字段 | 含义 |
|---|---|
rrqm/s,wrqm/s | 每秒合并的读/写请求数(合并可减少 I/O 次数) |
r/s,w/s | 每秒完成的读/写次数(IOPS) |
rkB/s,wkB/s | 每秒读/写字节数(吞吐量) |
await | I/O 请求平均等待时间(含队列+服务时间,单位 ms)→越低越好 |
util | 设备利用率(%)→接近 100% 表示磁盘饱和 |
3、pidof:通过进程名快速获取 PID
1. 功能说明
pidof用于根据进程名称查找其对应的进程 ID(PID),常用于脚本自动化或快速终止进程。
2. 基本用法
pidof <process_name>示例:
# 查找 nginx 的 PID pidof nginx # 若进程不存在,返回空 pidof nonexist注意:若同一程序启动了多个实例,pidof会返回所有匹配的 PID(空格分隔)。
例如,我们可以使用 pidof 命令来查看自行编写的死循环进程状态,代码、运行和测试结果如下:
3. 实战例子:配合kill快速终止进程
# 终止所有名为 myapp 的进程 kill $(pidof myapp) # 或使用 xargs(更安全) pidof myapp | xargs kill谨慎操作:确保进程名唯一,避免误杀!
通过pidof命令获取进程ID后,可直接与kill命令配合使用来快速终止目标进程。如下:
4. 替代方案对比
| 命令 | 特点 |
|---|---|
pidof nginx | 简洁,直接返回 PID 列表 |
pgrep nginx | 功能更强(支持正则、用户过滤等),现代推荐 |
| ps aux | grep nginx |
推荐:在脚本中优先使用pgrep/pkill,功能更强大且不易出错。
4、总结与最佳实践
| 工具 | 核心用途 | 推荐组合 |
|---|---|---|
netstat | 查看网络连接与监听端口 | netstat -nltp(TCP 监听)、netstat -nuap(UDP 连接) |
iostat | 监控 CPU 与磁盘 I/O 性能 | iostat -x 1(实时详细监控) |
pidof | 通过进程名查 PID | pidof <name>+kill快速管理进程 |
现代替代建议:
用
ss -tulnp替代netstat -tulnp(更快、更准确)用
pgrep/pkill替代pidof+kill
掌握这些工具,不仅能快速定位网络与系统性能问题,还能大幅提升运维效率和故障排查能力。