Unix Socket - 端口和服务


当客户端进程想要连接服务器时,客户端必须有一种方法来识别它想要连接的服务器。如果客户端知道服务器所在主机的 32 位 Internet 地址,则它可以联系该主机。但是客户端如何识别该主机上运行的特定服务器进程呢?

为了解决识别主机上运行的特定服务器进程的问题,TCP和UDP都定义了一组众所周知的端口。

出于我们的目的,端口将被定义为 1024 到 65535 之间的整数。这是因为所有小于 1024 的端口号都被认为是众所周知的 - 例如,telnet使用端口 23,http 使用 80,ftp 使用 21,等等。

网络服务的端口分配可以在文件 /etc/services 中找到。如果您正在编写自己的服务器,则必须注意为您的服务器分配端口。您应该确保该端口不应分配给任何其他服务器。

通常情况下,分配超过 5000 的端口号是一种惯例。但是有许多组织编写的服务器端口号超过 5000。例如,Yahoo Messenger 运行在 5050 上,SIP Server 运行在 5060 上等。

端口和服务示例

这是服务和相关端口的一小部分列表。您可以在IANA - TCP/IP 端口分配中找到最新的互联网端口和相关服务列表。

服务 端口号 服务说明
回声 7 UDP/TCP 发送回其接收到的内容。
丢弃 9 UDP/TCP 丢弃输入。
白天 13 UDP/TCP 返回 ASCII 时间。
电荷 19 UDP/TCP 返回字符。
文件传输协议 21 TCP 文件传输。
远程登录 23 TCP远程登录。
邮件传输协议 25 TCP 电子邮件。
白天 37 UDP/TCP 返回二进制时间。
传输协议 69 UDP 简单文件传输。
手指 79 有关用户的 TCP 信息。
http 80 TCP 万维网。
登录 513 TCP远程登录。
WHO 513 UDP 不同的用户信息。
X服务器 6000 TCP X 窗口(NB >1023)。

端口及服务功能

Unix 提供了以下函数来从 /etc/services 文件中获取服务名称。

  • structservent *getservbyname(char *name, char *proto) - 此调用采用服务名称和协议名称,并返回该服务相应的端口号。

  • structservent *getservbyport(int port, char *proto) - 此调用采用端口号和协议名称,并返回相应的服务名称。

每个函数的返回值是一个指向以下形式的结构的指针 -

struct servent {
   char  *s_name;
   char  **s_aliases;
   int   s_port;
   char  *s_proto;
};

这是成员字段的描述 -

属性 价值观 描述
名字 http 这是该服务的正式名称。例如,SMTP、FTP POP3 等。
s_别名 别名 它保存服务别名列表。大多数时候,它会被设置为NULL。
运动 80 它将具有关联的端口号。例如,对于 HTTP,它将是 80。
s_proto

传输控制协议

UDP协议

它被设置为所使用的协议。Internet 服务使用 TCP 或 UDP 提供。