TCP 用两字节(16 bit)来表示端口,也是就说一台服务器最多可以有 65536 个端口号的。
传输层使用端口号区分同一台主机的不同的应用程序。操作系统为需要的进程分配端口号,当目标主机收到数据包以后,会根据报文首部的目标端口将数据发送给对应端口的进程。
端口分类:
- 熟知端口(well-know port)
- 已登记端口(registered port)
- 临时端口号 (ephemeral port)
熟知端口
熟知端口的范围是0-1023,比如 HTTP 使用 80端口,HTTPS 使用 443 端口,ssh 使用 22 端口。
已登记的端口
范围是1024到49151。
临时端口号
如果应用程序没有调用 bind 将 socket 绑定到特定的端口上去,那么系统会为该 socket 分配一个唯一的临时端口。临时端口范围是 49152 - 65535,这些端口可以供本地程序临时分配端口使用。
通过 cat /proc/sys/net/ipv4/ip_local_port_range 查看临时端口的范围。
使用下面的命令修改临时端口的范围:
sysctl -w net.ipv4.ip_local_port_range="50000 50010"
使用 telnet 或 nc -v 可以查看对方端口是否打开,端口如果没有被打开,会报 connection refuse 的错误。
查看端口被什么进程监听占用
netstat -ltpn | grep :22
lsof -n -P -i:22
其中-n
表示不将 IP 转换为 hostname,-P
表示不将 port number 转换为 service name,-i:port
表示端口号为 22 的进程
如何查看进程监听的端口号
netstat -atpn | grep 3306
lsof -n -P -p 3306