什么是端口?

我们知道,网络层提供主机到主机的通信,而传输层提供进程到进程的通信 。在网络层中,IP 地址是识别主机的标识符,网络包通过 IP 地址来寻找主机;相对地,在传输层中,端口是主机上进程的标识符,网络包通过 IP 地址到达主机后,又通过端口号来寻找对应进程。即,端口号用来唯一标识主机进程

一个 IP 地址和一个端口号组成了 套接字地址 ,套接字地址唯一标识了网络中的进程。而客户端和服务器端的 IP 地址与端口,以及传输层协议,共同组成了 五元组 ,用来标识唯一通信。

客户端程序使用 临时端口号 定义自己,之所以叫“临时端口号”,是因为其生命周期较短,本次使用完该端口,下一次就不一定再使用。临时端口号通常选择 49152 ~ 65535之间的数。

服务器端也需要使用端口号定义自身,但此端口号不能随机选择,否则客户端访问服务器端时,将不知道其端口号。所以服务器必须使用 公用端口号(well-know port)

ICANN范围

公用端口: 0 ~ 1023

注册端口: 1024 ~ 49151

动态端口: 49152 ~ 65535

端口号在计算机中占 16 位 bit ,故总范围是 0 ~ 65535 公用端口号由 ICANN 预留给 TCP 和 UDP 协议使用的端口号(如 http - 80,DNS - 53);注册端口号由公司和其他用户向 ICANN 登记注册;动态端口号供进程任意挑选。

在 Linux 下,服务和端口的映射关系通常保存在 /etc/services

需要注意的是,在网络术语中,端口有两种含义,一种是物理上的端口,如路由器,交换机和集线器上的端口,此端口用于连接其他网络设备;一种是逻辑上的端口,一般是指 TCP/IP 协议中的端口 ,即我们上面所述的端口。

一个端口号是否可以被多个进程绑定?

  • 对于 TCP 而言,可以,只要绑定的 IP 不同,参见Socket常用选项

  • UDP 和 TCP 可以绑定同一个端口 。TCP/IP 传输层的两个协议 TCP 和 UDP 是完全独立的两个软件模块,因此各自的端口号也相互独立,如 http 对应的 80 号端口,TCP 和 UDP 能在同一时刻绑定 80 号端口,二者并不冲突。

    就如 HTTP,支持多个协议(TCP、UDP)的服务往往使用相同的 TCP 端口号和 UDP 端口号,不过反过来说就不一定了——有些端口号在 UDP 上用于一种服务,而在 TCP 上却使用另一种服务,比如端口 512~514 ,自行查看 etc/services