82

TCP 具有元组对(IP 地址/端口/类型)来告诉一个客户端与另一个客户端。UDP 传递客户端 IP 和端口。unix 域如何跟踪不同的客户端?

换句话说,服务器创建一个绑定到某个路径的套接字,比如 /tmp/socket。2 个或更多客户端连接到 /tmp/socket。下面发生了什么来跟踪来自 client1 和 client2 的数据?我想网络堆栈在域套接字中没有任何作用,那么内核是否在这里完成了所有工作?

是否有像 IP 协议格式和 TCP/UDP 格式一样的 unix 域协议格式?域套接字数据报协议的格式是否在某处发布?每个unix都是不同的还是POSIX之类的东西标准化了它?

感谢您的任何照明。我找不到任何解释这一点的信息。每个来源都只是掩饰了如何使用域套接字。

4

1 回答 1

113

如果您创建一个PF_UNIX类型为 的套接字SOCK_STREAM,并在其上接受连接,那么每次接受连接时,您都会获得一个新的文件描述符(作为accept系统调用的返回值)。此文件描述符从客户端进程中的文件描述符读取数据并将数据写入数据。因此,它就像 TCP/IP 连接一样工作。

没有“unix 域协议格式”。不需要,因为 Unix 域套接字无法通过网络连接连接到对等点。在内核中,代表 Unix 域套接字末端的文件描述符SOCK_STREAM指向一个数据结构,该结构告诉内核哪个文件描述符位于连接的另一端。当您将数据写入文件描述符时,内核会在连接的另一端查找文件描述符并将数据附加到其他文件描述符的读取缓冲区。内核不需要将您的数据放入带有描述其目的地的标头的数据包中。

对于SOCK_DGRAM套接字,您必须告诉内核应该接收数据的套接字的路径,然后它会使用该路径查找该接收套接字的文件描述符。

如果在连接到服务器套接字之前(或者在使用 发送数据之前SOCK_DGRAM)绑定到客户端套接字的路径,则服务器进程可以使用getpeername(for SOCK_STREAM) 获取该路径。对于 a SOCK_DGRAM,接收端可以recvfrom用来获取发送套接字的路径。

如果不绑定路径,那么接收进程就无法获得唯一标识对等方的 id。至少,不在我正在运行的 Linux 内核上(2.6.18-238.19.1.el5)。

于 2012-03-10T06:42:45.793 回答