1. 端口基础概念:TCP/UDP端口号范围、知名端口与动态端口、端口与进程的关系

各位同学好,我是老赵。今天咱们开始第一讲——端口基础概念。说实话,我带团队十几年,处理过的端口冲突问题少说也有上百起。很多新手一上来就抓包、看日志,折腾半天发现连端口号范围都没搞清。嗯,这章咱们就把地基打牢。

1.1 端口到底是什么?

端口,说白了就是操作系统给网络进程分配的一个数字标签。你想想看,一台服务器上跑着Web服务、数据库、SSH,数据包来了,内核怎么知道该交给谁?

端口就是那个门牌号。IP地址找到主机,端口号找到进程。两者缺一不可。

核心公式:

套接字(Socket)= IP地址 + 端口号

一个完整的网络连接由五元组唯一标识:源IP、源端口、目标IP、目标端口、传输层协议(TCP/UDP)

1.2 TCP/UDP端口号范围

端口号是一个16位的无符号整数,范围从0到65535。我习惯把它分成三段来看:

分类 范围 数量 说明
知名端口 0 - 1023 1024个 系统保留,需要root/管理员权限才能绑定
注册端口 1024 - 49151 48128个 IANA登记,但普通用户可用
动态/私有端口 49152 - 65535 16384个 客户端临时使用,系统自动分配

这里有个坑,我当年刚入行时踩过——0号端口是保留端口,不能用于实际通信。你如果写代码绑0,系统会给你随机分配一个可用端口。

⚠ 避坑指南:

我曾经在线上环境见过有人把应用端口配成1023,结果重启后服务起不来。为什么?因为1023属于知名端口范围,非root用户没权限绑定。后来查了半天才发现是端口权限问题。

1.3 知名端口:那些你天天见的数字

知名端口,就是IANA(互联网数字分配机构)钦定的那些服务端口。我建议你至少记住下面这几个,面试和排障都用得上:

  • 21 — FTP控制端口
  • 22 — SSH,远程管理的命根子
  • 23 — Telnet,明文传输,现在基本不用了
  • 25 — SMTP,发邮件用的
  • 53 — DNS,域名解析,UDP和TCP都用
  • 80 — HTTP,Web服务的默认端口
  • 443 — HTTPS,加密的Web服务
  • 3306 — MySQL数据库
  • 6379 — Redis缓存
  • 8080 — HTTP备用端口,Tomcat等常用

你可能会问:为什么FTP用21,SSH用22?其实早期这些端口分配挺随意的,后来用的人多了就成了事实标准。我个人习惯在/etc/services文件里查这些映射关系,Linux和macOS都自带这个文件。

1.4 动态端口:客户端是怎么拿到临时门牌的?

动态端口,也叫临时端口。当你用浏览器访问百度时,你的机器需要选一个源端口。这个端口就是系统从动态端口范围里随机挑的。

在Linux上,你可以用这个命令查看动态端口范围:

cat /proc/sys/net/ipv4/ip_local_port_range
# 输出示例:32768 60999

Windows上查看方式:

netsh int ipv4 show dynamicport tcp

我记得有一次帮客户排查连接超时问题,发现他们的应用服务器动态端口范围被改成了1024-5000,结果并发一高端口就不够用了。嗯,这就是典型的配置不当。

💡 经验之谈:

高并发场景下,建议把动态端口范围上限调到65535。Linux上直接改/proc/sys/net/ipv4/ip_local_port_range就行,但要持久化的话得写到/etc/sysctl.conf里。

1.5 端口与进程的关系:谁在监听?

端口本身只是一个数字,真正干活的是进程。一个进程可以监听多个端口,但一个端口在同一时刻只能被一个进程监听(除非用了SO_REUSEADDR等特殊选项)。

排查问题时,我最常用的命令就是:

# Linux 查看端口占用
netstat -tlnp
# 或者用 ss,更快
ss -tlnp

# Windows 查看端口占用
netstat -ano | findstr :8080

输出里你会看到类似这样的信息:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1234/nginx

这表示PID为1234的nginx进程正在监听0.0.0.0:80,也就是所有网卡的80端口。

这里有个细节——0.0.0.0:80和127.0.0.1:80是完全不同的。前者对外暴露,后者只允许本机访问。我见过有人把数据库配成0.0.0.0,结果被外部扫描到了,这是个安全隐患。

1.6 知识体系总览

下面这张图把端口的核心概念串起来了,你可以对照着理清思路:

端口基础概念知识体系 端口(Port) 端口号范围 知名端口与动态端口 端口与进程的关系 0 - 1023 知名 1024 - 49151 注册 49152 - 65535 动态 知名端口(固定) 动态端口(临时) 系统自动分配/回收 一个端口 → 一个进程 一个进程 → 多端口 netstat/ss 查看映射 套接字 = IP地址 + 端口号 五元组:源IP、源端口、目标IP、目标端口、协议(TCP/UDP)

1.7 实战小技巧:快速定位端口冲突

最后分享一个我常用的三板斧,遇到端口问题先走这三步:

  1. 查占用 — ss -tlnp | grep :端口号,看哪个进程占着
  2. 查进程 — ps aux | grep PID,确认是不是预期进程
  3. 查配置 — 看应用的配置文件,端口是不是写错了

有一次线上告警说服务连不上,我按这个流程走了一遍,发现是运维部署新版本时把端口配成了8081,但防火墙只开了8080。嗯,这种低级错误其实挺常见的。

好了,端口基础概念就讲到这里。记住:端口是数字,但背后是进程。搞懂了这个关系,后面讲端口冲突排查就轻松多了。