我们知道服务器端是要指定和开放端口号的,比如 web 服务 http 请求的 80,https 的 443 端口,都要开放,否则无法请求成功。
我们知道通信是由两端组成的,既然服务器需要指定端口,那么客户端呢?
比方说我用 chrome 浏览器请求 www.baidu.com, 我知道对于百度的服务器肯定开放了 80、443 端口,那么浏览器呢,或者说我的电脑本机用于请求的端口是什么呢?
带着疑问我用 Wireshark 抓包看了一下
可以看到我的浏览器请求 源端口是 62412 ,目标端口是 443。
443 我知道,62412 又是为什么?
不知道,于是想了想 TCP 的连接和请求过程,参考这篇文章:
如文章所说:
“TCP 协议里面会有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。”
浏览器端口随机生成?嗯,可以,但理论依据是什么?谁规定的?怎么规定的,怎么个随机法,不可能乱生成对吧。带着疑问,查到了资料。
这是 RFC 的其中一份文档 。
解释下 RFC(来自维基百科)
“请求意见稿(英语:Request for Comments,缩写:RFC),又翻译作意见征求,意见请求,请求评论是由互联网工程任务组(IETF)发布的一系列备忘录。文件收集了有关互联网相关信息,以及 UNIX 和互联网社群的软件文件,以编号排定。目前 RFC 文件是由互联网协会(ISOC)赞助发行。
RFC 始于 1969 年,由当时就读加州大学洛杉矶分校(UCLA)的斯蒂芬·克罗克(Stephen D. Crocker)用来记录有关 ARPANET 开发的非正式文档,他是第一份 RFC 文档的撰写者。最终演变为用来记录互联网规范、协议、过程等的标准文件。基本的互联网通信协议都有在 RFC 文件内详细说明。RFC 文件还额外加入许多的论题在标准内,例如对于互联网新开发的协议及发展中所有的记录。
总结一下
所有的端口被划分为三个数字范围
- 系统端口,也称为众所周知的端口,从 0 到 1023(由 IANA 分配)
“互联网号码分配局(英语:Internet Assigned Numbers Authority,缩写 IANA),是一家互联网地址指派机构,管理国际互联网中使用的 IP 地址、域名和许多其它参数的机构。IP 地址、自治系统成员以及许多顶级和二级域名分配的日常职责由国际互联网注册中心(IR)和地区注册中心承担。IANA 是由 ICANN 管理的。”
- 用户端口,也称为注册端口,从 1024-49151(由 IANA 分配)
- 动态端口,也称为私有或临时端口,从 49152-65535(从未分配)
在可分配的端口范围(系统端口和用户端口,即端口号 0-49151)中,单个端口号在任何给定时间处于以下三种状态之一:
- 已分配:已分配的端口号当前已分配给注册表中指示的服务。
- 未分配:当前可根据请求分配未分配的端口号。
- 保留:保留端口号不可用于常规分配;它们被“分配给 IANA”用于特殊目的。保留端口号包括每个范围边缘的值,例如 0、1023、1024 等,可用于扩展这些范围或将来的整体端口号空间。
对于动态端口(Dynamic Ports),范围从 49152 到 65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如 49152 端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。
这样就解决了我的疑问,确实客户端也是要有明确的端口号分配的,具体讲比如浏览器它的端口看上去也是随机分配的,而分配范围是在“动态端口”范围,这个依据可以在 RFC-6335 中查到。