0

我想知道就接受 N 个不同连接所需的侦听端口/服务器套接字的数量而言,所需的最小开销是多少,每个连接都使用在 IP 之上运行的不同传输协议,例如 TCP、SCTP、DCCP、UDP等等

当然,一种简单的方法是拥有 N 个独立的服务器套接字(每个都通过socket()使用适当protocol参数的调用创建),每个都侦听一个唯一的端口。但是,在同时使用多个协议的应用程序中实现这种方法会非常不方便,因为客户端需要知道多个服务器端口。此外,在一个对等应用程序中,每个协议只对等一次(使用相同的客户端),N 个服务器套接字中的每一个只接受一个(客户端)连接的事实看起来像是一个巨大的开销(N 个额外的引入套接字纯粹是为了处理到单个对等客户端的 N 个“真实”连接)。

是否有可能做得更好,例如通过减少侦听服务器套接字的数量和/或在同一端口上侦听?

(为简单起见,可以假设 N=2,一个连接是 TCP,另一个是 DCCP 或 UDP(请不要假设无连接通信,因为 DCCP 是面向连接的)。)

编辑:我对 N (客户端)连接不感兴趣,其文件描述符由 N 调用返回accept。问题在于使这 N 个连接成为可能的额外开销(即必须至少有一个额外的服务器套接字来侦听传入连接)。

4

1 回答 1

1

总结上面评论中所说的话:因为在

int socket(int domain, int type, int protocol)

调用我们必须指定protocol,我们不能为多个协议使用一个套接字。我们也不能便携地写

socket(AF_INET, SOCK_RAW, 0);

SOCK_RAW 揭秘

关于使用具有不同套接字的相同端口:这种可能性因系统而异;例如,参见 HP-UX ( man 7f inet):

  The local port address is selected from independent domains for TCP
  and UDP sockets.  This means that creating a TCP socket and binding it
  to local port number 10000, for example, does not interfere with
  creating a UDP socket and also binding it to local port number 10000
  at the same time.

与 Linux ( man ip):

  Only one IP socket may be bound to any given local (address, port) pair.
于 2014-11-05T13:44:04.277 回答