ss 命令输出详解
ss 全名socket statistics,是iproute2中的一员
ss已经替代netstat,大热于江湖。但是关于ss命令输出的内容,是什么意思呢?

[root@test]# ss -s
Total: 26437 (kernel 27730)
TCP:   31961 (estab 25762, closed 6003, orphaned 70, synrecv 0, timewait 5985/0), ports 0

Transport Total     IP        IPv6
*         27730     -         -        
RAW       0         0         0        
UDP       21        13        8        
TCP       25958     25073     885      
INET      25979     25086     893      
FRAG      0         0         0


Total: 26437 (kernel 27730) 是什么意思?为什么Total的值小于kernel?

Transport Total     IP        IPv6
*         27730     -         - 
* 又代表什么?


网上全是千篇一律,对于输出格式的文档却没有说明

关于* 

答:仅是和简单的打开、管理相关的sockets,而不管在内核级别的传输是什么层

 

关于total 和kernel 的 数量不一致的解释:

答:系统socket 使用后不会立即过期,所以 26437 是所有active sockets 减去过期sockets.。27730 是 连接到kernel sockets,包含(27730-26437)剩余的 还没有被 kernel清理的sockets。
http://tweaked.io/guide/kernel/
这篇关于内核调优的页面很好地概述了内核如何处理套接字的概念,以及如何调整系统以更好地管理内核级别的套接字。

输出格式字段说明


netid 它表示套接字类型和传输协议, 当它不明确时:tcp、udp、raw、u str是unix_stream的缩写,u_dgr是unix数据报套接字,nl是netlink,p_raw和p_dgr是raw和datagram数据包套接字

第二列是状态。此处显示套接字状态。这些名称是标准TCP名称,但UNCON除外,它不能用于TCP,但对于其他类型的未连接的套接字是正常的。同样,可以隐藏此列。

然后两列(recv-q和send-q)显示排队等待接收和发送的数据量。

最后两列显示了套接字的本地地址和端口以及它的对等地址(如果套接字已连接)。 

如果给出了选项-o、-e或-p,则不在固定位置显示选项,而是用空格对分隔:选项:值。如果值不是一个数字,它将以值列表的形式显示,括在(…)用逗号分隔



硬翻外国文档

https://superuser.com/questions/885250/what-does-the-output-of-ss-s-mean

 

socket 和port 的区别

https://stackoverflow.com/questions/152457/what-is-the-difference-between-a-port-and-a-socket/152863#152863

 

ss命令详解

https://www.cyberciti.biz/tips/linux-investigate-sockets-network-connections.html


Linux创建sockets原理

https://ops.tips/blog/how-linux-creates-sockets/

通过本文知道,kernel 的数值 是取得kernel 全部的sockets,而且不能知道 这些sockets 具体是被哪些占用,就算用不同的namespace,也是一样

# Create a bunch of sockets using our
# example in C
./sockets.out

 Check that we have a bunch of sockets

cat /proc/net/sockstat
sockets: used 296
TCP: inuse 5 orphan 0 tw 2 alloc 108 mem 3
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

 Create a network namespace

ip netns add namespace1

 Get into it

ip netns exec namespace1 /bin/bash

 Check how /proc/net/sockstat shows the same

 number of allocated sockets.

TCP: inuse 0 orphan 0 tw 0 alloc 108 mem 3
UDP: inuse 0 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0