现代Linux系统更倾向于使用ss命令,因其通过netlink直接与内核通信,性能更高、信息更全、支持精细过滤,尤其在处理大量连接时远优于依赖解析/proc文件的netstat。
在Linux系统中,要查看当前系统开放或正在使用的端口,最常用的两个命令是
ss
netstat
netstat
ss
解决方案
要查看Linux中的端口,我们可以利用
ss
netstat
使用 ss
ss
socket statistics
netstat
-
查看所有监听的TCP和UDP端口(数字格式):
ss -tuln
这里
-t
-u
-l
-n
-
查看所有已建立的TCP连接:
ss -tna
-a
-
查看所有连接及其关联的进程信息:
ss -apn
-p
使用 netstat
netstat
/proc/net
-
查看所有监听的TCP和UDP端口(数字格式):
netstat -tuln
参数含义与
ss
-
查看所有连接及其关联的进程信息:
netstat -apn
同样,
-p
-
查看所有TCP连接的详细信息:
netstat -ant
这里的
-a
-n
-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
netstat
wscale
sk_rmem
sk_wmem
timer
-
功能更强大:
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
-t
过滤特定状态:
ss
state
netstat
grep
- 查找所有处于
ESTABLISHED
ss -tn state established
- 查找所有处于
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
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地址和端口号。
0.0.0.0
::
- 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中文网其它相关文章!