Unix 套接字 - 端口和服务
当客户端进程想要连接服务器时,客户端必须有一种方法来识别它想要连接的服务器。如果客户端知道服务器所在主机的 32 位 Internet 地址,它就可以联系该主机。但客户端如何识别在该主机上运行的特定服务器进程?
为了解决识别在主机上运行的特定服务器进程的问题,TCP 和 UDP 都定义了一组众所周知的端口。
为了实现我们的目的,端口将被定义为 1024 到 65535 之间的整数。这是因为所有小于 1024 的端口号都被视为众所周知 - 例如,telnet 使用端口 23,http 使用 80,ftp 使用 21,等等。
可以在文件 /etc/services 中找到网络服务的端口分配。如果您正在编写自己的服务器,则必须小心为您的服务器分配端口。您应确保此端口不应分配给任何其他服务器。
通常,分配大于 5000 的任何端口号是一种惯例。但有许多组织编写的服务器的端口号超过 5000。例如,Yahoo Messenger 在 5050 上运行,SIP 服务器在 5060 上运行,等等。
示例端口和服务
以下是服务和相关端口的简短列表。您可以在 IANA - TCP/IP 端口分配 中找到最新的互联网端口和相关服务列表。
服务 | 端口号 | 服务说明 |
echo | 7 | UDP/TCP 返回其收到的内容。 |
discard | 9 | UDP/TCP 丢弃输入。 |
daytime | 13 | UDP/TCP 返回 ASCII 时间。 |
chargen | 19 | UDP/TCP 返回字符。 |
ftp | 21 | TCP 文件传输。 |
telnet | 23 | TCP 远程登录。 |
smtp | 25 | TCP 电子邮件。 |
daytime | 37 | UDP/TCP 返回二进制时间。 |
tftp | 69 | UDP 简单文件传输。 |
finger | 79 | TCP 用户信息。 |
http | 80 | TCP 万维网。 |
login | 513 | TCP 远程登录。 |
who | 513 | UDP 用户不同信息。 |
Xserver | 6000 | TCP X windows(注意: >1023)。 |
端口和服务函数
Unix 提供以下函数从 /etc/services 文件中获取服务名称。
struct servent *getservbyname(char *name, char *proto) − 此调用获取服务名称和协议名称,并返回该服务的相应端口号。
struct servent *getservbyport(int port, char *proto) − 此调用获取端口号和协议名称,并返回相应的服务名称。
每个函数的返回值都是指向具有以下形式的结构的指针 −
struct servent { char *s_name; char **s_aliases; int s_port; char *s_proto; };
以下是成员字段的描述 −
属性 | 值 | 描述 |
---|---|---|
s_name | http | 这是服务的正式名称。例如,SMTP、FTP POP3 等。 |
s_aliases | ALIAS | 它保存服务别名的列表。大多数情况下,它将被设置为 NULL。 |
s_port | 80 | 它将具有关联的端口号。例如,对于 HTTP,它将是 80。 |
s_proto |
TCP UDP |
它设置为使用的协议。互联网服务使用 TCP 或 UDP 提供。 |