文章目录
一、定义
在传输层中也有类似于地址(MAC 地址、IP 地址)的概念,那就是端口号,它用来识别一台计算机中进行通信的不同应用程序,因此,也被称为程序地址
二、根据端口号识别应用
一台计算机上同时可以运行多个程序,例如接受 WWW 服务的 Web 浏览器、电邮客户端、远程登录用的 ssh 客户端等程序都可同时运行,传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输
三、通过 IP 地址、协议号、端口号进行通信识别
仅凭目标端口识别某一个通信是远远不够的,因此,TCP/IP 或 UDP/IP 通信中通常采用 5 个信息(源 IP 地址、目标 IP 地址、协议号、源端口号、目标端口号)来识别一个通信,只要其中某一项不同,则被认为是其他通信
此外,还有一种情况上图中并未列出,那就是 IP 地址(源 IP 地址、目标 IP 地址)和端口号(源端口号、目标端口号)全都一样,只是协议号(表示传输层是 TCP 或 UDP 的一种编号,具体见网络基础 - IPv4 篇)不同,这种情况下,也会认为是两个不同的通信
四、端口号如何确定
1、范围
uint16_t port; // [0, 65535]
2、标准既定的端口号
2.1、知名端口号
TCP 具有代表性的知名端口号
UDP 具有代表性的知名端口号
知名端口号一般由 0 到 1023 的数字分配而成,应用程序应该避免使用知名端口号进行既定目的之外的通信,以免产生冲突
2.2、注册端口号
除知名端口号之外,还有一些端口号也被正式注册,它们分布在 1024 到 49151 的数字之间,不过,这些端口号([1024, 49151])可用于任何通信用途
3、动态分配法
接受服务的客户端没必要确定端口号,客户端应用程序可以完全不用自己设置端口号,而全权交给操作系统进行动态分配(避免端口冲突),动态分配的端口号取值范围在 49152 到 65535 之间
六、引申问题
1、一个进程可以 bind 多个端口号?
答:可以
2、 一个端口号可以被同一台计算机上的多个进程 bind?
答:可以,例如 TCP 进程绑定端口 65535,UDP 进程也可以绑定端口 65535
3、一个端口号可以被同一台计算机上的多个 TCP 进程 bind?
答:可以,只要 IP 地址不同即可
注意
如果 tcp_server1/2 绑定的 IP 地址是 0.0.0.0,另一个绑定的是 192.168.5.28/127.0.0.1,假设先启动 tcp_server1,那么再启动 tcp_server2 就会报错 “bind failed: Address already in use” ,这是因为 0.0.0.0 比较特殊,它代表任意地址,意味着绑定了 0.0.0.0,相当于把主机上所有的 IP 地址都绑定了