![“ss”的“-f”和“-A”有什么区别?](https://linux22.com/image/150456/%E2%80%9Css%E2%80%9D%E7%9A%84%E2%80%9C-f%E2%80%9D%E5%92%8C%E2%80%9C-A%E2%80%9D%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
-f
和-A
之间有什么区别ss
?
-f
和哪个-A
相关-t, -u, -4, -6, -w, -x
?
是否-A inet,packet
暗示-A tcp,udp,raw
?
我知道一些套接字概念,但无法弄清楚联机帮助页中的术语。
谢谢。
-F
FAMILY 类型的显示插座。目前支持以下系列:unix、inet、inet6、link、netlink。
-一个问题
要转储的套接字表列表,以逗号分隔。可理解以下标识符:all、inet、tcp、udp、raw、unix、packet、netlink、unix_dgram、unix_stream、unix_seqpacket、packet_raw、packet_dgram。
答案1
-4, -6, -x
- 根据手册页。
-t
, -u
, -w
- 均对应于套接字表。
是否
-A inet,packet
暗示-A tcp,udp,raw?
该表inet
暗示了所有tcp
, udp
, raw
, 并且大概还包含dccp
和sctp
。我认为all
在某种程度上是合成的,所以我认为inet
是相似的。
我注意到当指定重叠的“套接字表”值时,例如-A tcp,inet
,ss
不显示重复项。
我认为-A packet
和-A raw
是脱节的。所以我认为-A inet,packet
应该严格显示超过-A tcp,udp,raw
......
谨防
-A raw
看起来-A packet
他们做的事情是相关的,但实际上存在一些差异。 目前将所有数据包套接字视为侦听套接字,[*] 但(大多数?)如果通过该选项以及未通过该选项,ss
则会显示原始套接字。通常使用的原始套接字和数据包套接字并不多。如果您看到这个并决定您甚至不想信任这里,您可以只列出所有使用的原始套接字和数据包套接字。-l
-l
-l
ss -a -A raw,packet
更奇怪的是,ss
无法确定表中的数据包是否raw
属于link
地址族:
# ss -A raw -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 0.0.0.0:ipproto-255 0.0.0.0:* users:(("atop",pid=26422,fd=4))
UNCONN 0 0 *:ipv6-icmp *:* users:(("NetworkManager",pid=1317,fd=17))
# ss -f link -p
Netid Recv-Q Send-Q Local Address:Port Peer Address:Port
p_raw 0 0 *:wlp2s0 * users:(("dhclient",pid=20548,fd=5))
p_dgr 0 0 [34958]:wlp2s0 * users:(("wpa_supplicant",pid=1406,fd=13))
p_dgr 0 0 [0]:* * users:(("wpa_supplicant",pid=1406,fd=16))
p_dgr 0 0 [0]:* * users:(("wpa_supplicant",pid=1406,fd=12))
# ss -A raw -f link -p
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
??? UNCONN 0 0 0.0.0.0:ipproto-255 0.0.0.0:* users:(("atop",pid=26422,fd=4))
icmp6 UNCONN 0 0 *:ipv6-icmp *:* users:(("NetworkManager",pid=1317,fd=17))
同样,它似乎无法决定这两个选项是用 AND 还是 OR 组合。 ss -A all -f link
给出与 相同的输出ss -A all
。但ss -A raw -f link
给出的行数比 少ss -f link
。
此外,地址族的概念link
似乎是ss
. Linux没有AF_LINK
,它有AF_PACKET
。
“套接字表”这个名称听起来像是指内核内的本机表。因此,准确列出套接字会非常有效,tcp
例如,我们只需列出整个表。
但是我可以看到旧的纯文本 /proc 接口列在旧的man netstat
tcp
...并且这些不完全匹配,例如和都有单独的表tcp6
。唔。
现实情况是,内核哈希表用于 inet,然后还有另一个表用于 inet6,...我无法真正理解ss
“套接字表”与sock_diag
,看来是编出来的ss
。
像中提到的 FILTER 表达式这样的选项man ss
可能与他们需要扫描的表格大小相比,打印的内容要少得多。从这个意义上说,它们可能比转储内核返回的整个列表效率低。
我认为我们不太可能需要担心效率。
笔记
[*] 证明:strace
表明ss
确实如此没有什么,当你要求它列出数据包套接字而不传递时-l
:
$ strace -f -e '!mprotect,mmap,read,write,lseek' ss -A packet
...
openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=258624, ...}) = 0
mmap(NULL, 136384, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbffcade000
mmap(0x7fbffcae4000, 65536, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fbffcae4000
mmap(0x7fbffcaf4000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7fbffcaf4000
mmap(0x7fbffcafa000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) = 0x7fbffcafa000
mmap(0x7fbffcafc000, 13504, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fbffcafc000
close(3) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbffcadc000
arch_prctl(ARCH_SET_FS, 0x7fbffcadce40) = 0
munmap(0x7fbffcdc7000, 199180) = 0
set_tid_address(0x7fbffcadd110) = 2588
set_robust_list(0x7fbffcadd120, 24) = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7fbffcae4c50, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fbffcaf1030}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7fbffcae4ce0, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fbffcaf1030}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", {f_type=SELINUX_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
statfs("/sys/fs/selinux", {f_type=SELINUX_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
brk(NULL) = 0x563e25ce6000
brk(0x563e25d07000) = 0x563e25d07000
access("/etc/selinux/config", F_OK) = 0
mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbffc9db000
ioctl(1, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, {ws_row=35, ws_col=150, ws_xpixel=0, ws_ypixel=0}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
[ss output starts here]
State Recv-Q Send-Q Local Address:Port Peer Address:Port
[ss output ends]
munmap(0x7fbffc9db000, 1052672) = 0
exit_group(0) = ?