现代Linux系统更倾向于使用ss命令,因其通过netlink直接与内核通信,性能更高、信息更全、支持精细过滤,尤其在处理大量连接时远优于依赖解析/proc文件的netstat。
在Linux系统中,要查看当前系统开放或正在使用的端口,最常用的两个命令是
ss
netstat
netstat
ss
解决方案
要查看Linux中的端口,我们可以利用
ss
netstat
使用 ss
ss
socket statistics
netstat
-
查看所有监听的TCP和UDP端口(数字格式):
ss -tuln
这里
表示TCP,-t
表示UDP,-u
表示监听状态,-l
表示以数字形式显示端口号和IP地址,而不是尝试解析服务名或主机名。这是我个人最常用的组合,能快速概览哪些服务在等待连接。-n
-
查看所有已建立的TCP连接:
ss -tna
显示所有(监听和非监听)套接字。-a
-
查看所有连接及其关联的进程信息:
ss -apn
会显示拥有该套接字的进程名和PID。这在排查哪个程序占用了某个端口时非常有用。-p
使用 netstat
netstat
/proc/net
-
查看所有监听的TCP和UDP端口(数字格式):
netstat -tuln
参数含义与
命令类似。ss
-
查看所有连接及其关联的进程信息:
netstat -apn
同样,
参数用于显示进程信息。-p
-
查看所有TCP连接的详细信息:
netstat -ant
这里的
表示所有连接,-a
表示数字显示,-n
表示TCP协议。-t
通常,我会优先使用
ss
netstat
为什么现代Linux系统更倾向于使用
ss
命令来查看网络连接?
ss
现代Linux系统之所以更推荐使用
ss
netstat
netstat
/proc/net/tcp
/proc/net/udp
netstat
ss
相比之下,
ss
netlink
netlink
ss
ss
-
性能卓越: 对于大量并发连接的系统,的执行速度远超
ss
,能够更快地返回结果,极大地提高了故障排查效率。netstat
-
信息更丰富: 能够提供比
ss
更详细的TCP连接状态信息,比如TCP窗口大小(netstat
)、缓冲区大小(wscale
、sk_rmem
)、TCP状态机定时器信息(sk_wmem
)、RTT(往返时间)等。这些额外的信息对于深入分析网络性能问题和诊断疑难杂症非常有帮助。timer
-
功能更强大: 支持更复杂的过滤和查询条件,例如可以根据TCP状态、源/目的地址、端口范围等进行精细化过滤,这让查找特定连接变得更加便捷。
ss
所以,虽然
netstat
ss
netstat
ss
如何使用
ss
或
netstat
命令过滤和查找特定的端口连接?
ss
netstat
在实际操作中,我们很少需要查看所有的端口信息,更多时候是想找到特定端口、特定状态或特定程序的连接。
ss
netstat
过滤特定端口:
最直接的方法就是结合
grep
- 查找监听在80端口的TCP服务:
ss -tuln | grep ':80'
或者使用
:netstat
netstat -tuln | grep ':80'
- 查找与SSH(22端口)相关的连接:
ss -ant | grep ':22'
这里
显示所有连接,-a
数字显示,-n
只显示TCP。-t
过滤特定状态:
ss
state
netstat
grep
- 查找所有处于(已建立)状态的TCP连接:
ESTABLISHED
ss -tn state established
- 查找所有处于(监听)状态的TCP连接:
LISTEN
ss -tn state listening
- 查找所有处于状态的连接(这对于诊断高并发服务器上的连接资源耗尽问题很有用):
TIME-WAIT
ss -tn state time-wait
通常需要先列出所有连接,再通过netstat
过滤状态,效率稍低:grep
netstat -ant | grep ESTABLISHED
过滤特定协议:
- 只看TCP连接:
ss -tln
或
netstat -tln
- 只看UDP连接:
ss -uln
或
netstat -uln
过滤特定程序或PID:
使用
-p
- 查找所有由服务打开的连接:
sshd
ss -apn | grep sshd
或者查找占用某个特定端口的进程,比如80端口:
ss -apn | grep ':80'
输出会包含进程名和PID,例如
。这里有个小技巧,有时候你发现一个端口被占用了,但不知道是哪个程序,users:(("nginx",pid=1234,fd=5))或者ss -apn
就能直接告诉你PID和程序名,非常方便。我经常用它来揪出那些“幽灵进程”,比如一个服务崩溃后,它的监听端口可能还被一个僵尸进程或者旧的实例占用着。netstat -apn
通过这些组合和过滤,我们可以非常精确地定位到我们关心的网络连接信息,大大提升了排查问题的效率。
理解
ss
和
netstat
输出中的端口状态和关键信息
ss
netstat
掌握了如何使用命令,下一步就是理解它们输出的信息,特别是那些看似神秘的端口状态。这些状态是TCP/IP协议栈内部连接生命周期的体现,理解它们对于网络故障诊断至关重要。
常见的TCP端口状态及其含义:
- LISTEN (监听): 服务器端程序正在等待客户端连接。端口已打开,并准备接受传入连接。
- SYN_SENT (同步已发送): 客户端已发送一个SYN(同步)报文请求建立连接,正在等待服务器的SYN/ACK(同步/确认)响应。
- SYN_RECV (同步已接收): 服务器已收到客户端的SYN报文,并已发送自己的SYN/ACK报文,正在等待客户端的ACK(确认)报文。
- ESTABLISHED (已建立): TCP连接已经成功建立,双方可以开始进行数据传输。这是最常见的活动连接状态。
- FIN_WAIT1 (终止等待1): 应用程序已请求关闭连接,并发送了FIN(终止)报文,等待对端的ACK。
- FIN_WAIT2 (终止等待2): 已收到对端的ACK,现在等待对端发送FIN报文来关闭连接。
-
TIME_WAIT (时间等待): 连接已关闭,但本地套接字仍在等待一段时间,以确保所有迟到的报文段都已在网络中消失。这是TCP连接关闭的最后一个阶段,通常持续2MSL(Maximum Segment Lifetime,最大报文段生存时间)。大量连接可能导致端口资源耗尽,影响新连接的建立。
TIME_WAIT
- CLOSE_WAIT (关闭等待): 对端已发送FIN报文并关闭了连接,但本地应用程序尚未关闭其套接字。这通常意味着本地应用程序在处理完剩余数据后,需要主动关闭连接。
- LAST_ACK (最后确认): 本地应用程序已发送FIN报文并收到对端的FIN报文,现在正在等待对端的ACK报文来确认本地的FIN。
- CLOSING (关闭中): 双方同时发送了FIN报文,但本地在收到对端的FIN之前收到了自己的FIN的ACK。这种情况比较少见。
ss
netstat
- Proto (协议): 指示是TCP还是UDP协议。
-
Recv-Q / Send-Q (接收队列/发送队列):
- 对于,通常表示在套接字缓冲区中等待发送或接收的字节数。
netstat
- 对于,在
ss
状态下,ESTABLISHED
表示接收队列中未被应用程序读取的字节数,Recv-Q
表示发送队列中未被远程主机确认的字节数。在Send-Q
状态下,它们可能表示待处理的(未完成三次握手)和已完成三次握手的连接数。LISTEN
- 对于
-
Local Address:Port (本地地址:端口): 本地机器的IP地址和端口号。表示监听所有可用的IP地址,
0.0.0.0
表示监听所有IPv6地址。::
- Foreign Address:Port (外部地址:端口): 远程机器的IP地址和端口号。
- State (状态): 上面解释的TCP连接状态。
- PID/Program name (进程ID/程序名): 拥有该套接字的进程ID和对应的程序名称。
这些状态看似复杂,但理解了它们,你就能更好地诊断网络问题。比如,如果看到大量
TIME_WAIT
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
TIME_WAIT
CLOSE_WAIT
以上就是如何在Linux中查看端口 Linux ss与netstat对比的详细内容,更多请关注php中文网其它相关文章!
P粉602998670 
![[爱了]](/js/img/d1.gif)
![[尴尬]](/js/img/d16.gif)