ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
端口号的英文叫`Port` 分层结构中每一层都有一个唯一标识,比如链路层的 MAC 地址,IP 层的 IP 地址,传输层是用端口号。 传输层就是用端口号来区分同一个主机上不同的应用程序的。操作系统为有需要的进程分配端口号,当目标主机收到数据包以后,会根据数据报文首部的目标端口号将数据发送到对应端口的进程。 主动发起的客户端进程也需要开启端口,会把自己的端口放在首部的源端口(source port)字段中,以便对方知道要把数据回复给谁。 ## 端口号分类 端口号被划分成以下 3 种类型: * 熟知端口号(well-known port) * 已登记的端口(registered port) * 临时端口号(ephemeral port) ### 熟知端口号(well-known port)(保留端口) 熟知端口号由专门的机构由 IANA 分配和控制,范围为 0~1023。为了能让客户端能随时找到自己,服务端程序的端口必须要是固定的。很多熟知端口号已经被用就分配给了特定的应用,比如 HTTP 使用 80端口,HTTPS 使用 443 端口,ssh 使用 22 端口。 在 Linux 上,如果你想监听这些端口需要 Root 权限,为的就是这些熟知端口不被普通的用户进程占用,防止某些普通用户实现恶意程序(比如伪造 ssh 监听 22 端口)来获取敏感信息。熟知端口也被称为保留端口。 ### 已登记的端口(registered port) 已登记的端口不受 IANA 控制,不过由 IANA 登记并提供它们的使用情况清单。它的范围为 1024~49151。 已登记的端口常见的端口号有: * MySQL:3306 * Redis:6379 * MongoDB:27017 ### 临时端口号(ephemeral port) 如果应用程序没有调用 bind() 函数将 socket 绑定到特定的端口上,那么 TCP 和 UDP 会为该 socket 分配一个唯一的临时端口。IANA 将 49152~65535 范围的端口称为临时端口(ephemeral port)或动态端口(dynamic port),也称为私有端口(private port),这些端口可供本地应用程序临时分配端口使用。 ## 端口相关的命令 Linux 系统下 ### 如何查看对方端口是否打开 使用 nc 和 telnet 这两个命令可以非常方便的查看到对方端口是否打开或者网络是否可达。(Windows Telnet客户端默认是关闭状态, netcat要确定安装才行) ### 如何查看端口被什么进程监听占用 比如查看 22 端口被谁占用,常见的可以使用 lsof 和 netstat 两种方法 ``` sudo netstat -ltpn | grep :22 ``` **使用 lsof**因为在 linux 上一切皆文件,TCP socket 连接也是一个 fd。因此使用 lsof 也可以 ``` sudo lsof -n -P -i:22 ``` 其中`-n`表示不将 IP 转换为 hostname,`-P`表示不将 port number 转换为 service name,`-i:port`表示端口号为 22 的进程 ## 小结 ![](https://img.kancloud.cn/b6/d9/b6d9bbc22624fccd9f817c121497b6f3_1189x693.png)