SCM_RIGHTS 从另一个进程发送或接收一组打开的文件描述符。数据部分包含文件描述符的整数数组。传递的文件描述符表现得好像它们是用 dup(2) 创建的。
其中还有其他带有 SCM 的概念;SCM 在这里是什么意思?我没能找到它。
SCM_RIGHTS 从另一个进程发送或接收一组打开的文件描述符。数据部分包含文件描述符的整数数组。传递的文件描述符表现得好像它们是用 dup(2) 创建的。
其中还有其他带有 SCM 的概念;SCM 在这里是什么意思?我没能找到它。
unix 域套接字是否支持重用?
网上有很多关于这个的相互矛盾的信息。我怀疑其中很多只是过时的,但我不是专家。
如果我ProxySet enablereuse=on
的处理程序是套接字,我会这样做吗?例如
<Proxy "fcgi://matching-worker-string/" max=10>
# Unsure about this:
ProxySet enablereuse=on
</Proxy>
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler proxy:unix:/run/php/php.sock|fcgi://matching-worker-string/
</If>
</FilesMatch>
许多在线评论表示它们不受支持,并声明您甚至可以查看Apache 文档以获取证据,但我没有看到。也许他们在 2015-2017 年没有重用支持,但现在呢?
编辑
Apache 2.4、php-fpm 7.3、mod_proxy_fcgi
我发现lsof
命令输出中使用了一个 Unix 套接字:
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
screen 110970 username 4u unix 0xffff91fe3134c400 0t0 19075659 socket
“DEVICE”列包含看起来像内存地址的内容。根据 lsof 手册页:
DEVICE contains the device numbers, separated by commas, for a character special, block special, regular, directory or NFS file;
or ``memory'' for a memory file system node under Tru64 UNIX;
or the address of the private data area of a Solaris socket stream;
or a kernel reference address that identifies the file (The kernel reference address may be used for FIFO's, for example.);
or the base address or device name of a Linux AX.25 socket device.
Usually only the lower thirty two bits of Tru64 UNIX kernel addresses are displayed.
我的问题是,我在看这些中的哪一个0xffff91fe3134c400
?
另外,我该如何与之互动?我知道我可以netcat
用来连接到 Unix 域套接字,但是从在线阅读示例看来,您必须指定一个文件。
我正在尝试调试为什么不通过 Unix 域套接字发送数据。
我有 2 个应用程序应该通过 UDS 进行通信,但不是。
为了测试我做了以下事情:
使用socat
,我在这样的套接字上监听:
socat -x -u UNIX-RECV:/tmp/dd.sock STDOUT
并使用 netcat 发送这样的数据:
echo "hello" | nc -U -w1 /tmp/dd.sock
什么都没发生。
但是,如果我还将 socat 设置为代理,以侦听 UDP 端口,并将其写入套接字,如下所示:
socat -s -u UDP-RECV:9988 UNIX-SENDTO:/tmp/dd.sock
然后通过netcat
UDP 端口发送工作:
echo "Hello" | nc -u localhost 9988
我还能够让我的客户端应用程序将 UDP 写入代理,并且在写入 unix 套接字时没有成功。
我想了解为什么socat
不接收由 写入它的数据nc
,但如果我通过 UDP 代理则可以。
使用 Amazon Linux 4.14.101-75.76.amzn1.x86_64
如果我bind()
是一个AF_INET
套接字(用于 TCP 连接),那么稍后close()
,当我运行我的程序时,我可能会遇到问题,因为尽管有close()
,内核仍然可以拥有与打开的套接字关联的资源。
不过,我对 Unix Domain Sockets 的这个问题不是很清楚。
到目前为止我见过
我需要一个独特的路径来使用它bind()
。调用时路径必须不存在,bind()
文件将由bind()
. (但是,它可能在文件系统中可见也可能不可见。如果路径以特殊字符开头,则文件不会出现在文件系统中\0
。)
如果文件不是unlink()
-ed,即使在关闭之后,内核也会保留相关的资源,并且套接字是完全正常的。
问题:
由于任何一个close()
或unlink()
单独一个都不能使 Unix 域套接字消失,他们两个都会可靠地完成这个技巧/触发内核放弃与套接字相关的所有资源吗?
如果两者都被调用,我是否可能会遇到reuseaddr
错误?close()
unlink()
编辑(在评论和回答之后):
因此,绑定的 AF_LOCAL 套接字看起来像这样:
unix_domain_socket_inode
-> binded to a socket
-> associated with a file (path)
unix_domain_socket_inode
只要:
如果只有 1. 为真,我们有一个打开的套接字和一个 inode,一切正常。
如果只有 2. 为真,因为 inode 有与之关联的路径,内核无法清理它,但它也不起作用,因为它缺少处理传入连接的套接字资源。它甚至不会是一个普通的文件,只是一个繁忙的工作套接字的过去荣耀的死壳。
在 AF_INET 连接的情况下,地址重用问题是提高可用性的设计选择。
在 AF_LOCAL 的情况下,剩余文件是先前设计选择的产物,这会阻止内核本身在调用时自动清理它在 1 go 中创建的文件close()
。没有相关的隐藏机制,因此内核希望在close()
调用 a 后保留此资源。
我对套接字比对常规文件更感兴趣,但基本上我想知道一个进程是否可以将套接字“视为”阻塞,而另一个进程可以将其视为非阻塞。我猜是的,内核根据系统调用中使用的选项来处理所有这些。
我想这更多是关于 Unix 域套接字而不是 TCP 套接字,因为我不认为 2 个不同的进程可以使用相同的 TCP 套接字(但我可能是错的)
我经常遇到一种情况,我想在 Linux 中跟踪没有 root 或 NET_RAW 上限的 IP。
我试图发送一个带有小 TTL 的 UDP 数据包,但根本没有发出 ttl 错误。似乎获得 TTL 超出错误需要使用 ICMP 套接字。是否可以在不涉及 ICMP 的情况下仅使用 UDP 或 TCP 协议,同时仍会收到 TTL 错误通知,以便我可以使用有限的功能跟踪路由?
考虑/var/run/acpid.socket
。在任何时候,我都可以连接到它并从中断开连接。将其与nc
:
$ nc -l -U ./myunixsocket.sock
Ncat: bind to ./myunixsocket.sock: Address already in use. QUITTING.
nc
显然只允许一次性使用的套接字。那么问题是,我如何创建一个类似于 的套接字以/var/run/acpid.socket
供多次使用和重用?
该ss
命令(iproute2
来自作为 的更新替代品的工具集netstat
)在其--help
以下选项中
-0, --packet display PACKET sockets
-t, --tcp display only TCP sockets
-S, --sctp display only SCTP sockets
-u, --udp display only UDP sockets
-d, --dccp display only DCCP sockets
-w, --raw display only RAW sockets
-x, --unix display only Unix domain sockets
RAW
域套接字和域套接字之间的区别到底是什么UNIX
?
PACKET
插座实际上是什么?
我ssh
在 macOS 上运行以将连接到本地 Unix 域套接字重定向到另一台机器上的域套接字。call的命令行ssh
大致如下:
$ ssh -nNT -L /var/run/some.socket:/var/run/some.socket -o TCPKeepAlive=yes \
-o ServerAliveCountMax=10 -o ServerAliveInterval=60 user@destination
在执行一些负载测试后,我发现有时某些客户端连接失败,并且在检查日志时,我发现在ssh
连接失败的同时输出以下错误:
channel 41: open failed: connect failed: open failed
channel 44: open failed: connect failed: open failed
channel 47: open failed: connect failed: open failed
channel 49: open failed: connect failed: open failed
channel 51: open failed: connect failed: open failed
channel 59: open failed: connect failed: open failed
channel 62: open failed: connect failed: open failed
channel 64: open failed: connect failed: open failed
负载测试参数是运行 100 个并发连接(连接、发送一些数据、接收一些数据、断开连接,总共要执行 10,000 个连接。)
观察到的行为是,在测试开始时非常快速地创建第一组连接时,很少有连接因上述错误而失败。多少次失败的范围从运行到运行,但通常在几到十几个之间。大多数失败往往发生在测试开始时,尽管有时会发生在测试的后期(即在完成前 100 次之后)。
SO 上具有类似描述的其他帖子似乎涵盖了 using localhost
with workaround to use的问题127.0.0.1
,这使得它不相关,因为它不是 TCP/IP 套接字。此外,destination
上述命令中的部分已指定为 IP 地址。
对如何解决和跟踪问题有点茫然。我尝试使用-vvv
来获取详细的ssh
操作转储,但没有任何成果(它为相关通道记录的所有内容是套接字设置为非阻塞)。
请注意,调用ssh
是从脚本完成的,并且调用之前ulimit -n 1024
应该提供足够多的文件描述符来为所有套接字提供服务。