Files
netstack/tcpip/ports
impact-eintr 7b3086540d wsl code edit
2022-11-30 11:31:44 +08:00
..
2022-11-30 11:31:44 +08:00
2022-11-30 11:31:44 +08:00

端口

概念

在互联网上,各主机间通过 TCP/IP 协议发送和接收数据包,各个数据包根据其目的主机的 ip 地址来进行互联网络中的路由选择,把数据包顺利的传送到目的主机。大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决。

运行在计算机中的进程是用进程标识符来标志的。一开始我们可能会想到根据进程标识符来区分数据包给哪个进程,但是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符,因此发送方非常可能无法识别其他机器上的进程。为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志,因此 TCP/IP 体系的传输层端口被提了出来。

img

TCP/IP 协议在运输层使用协议端口号(protocol port number),或通常简称为端口(port),端口统一用一个 16 位端口号进行标志。端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的。虽然通信的终点是应用进程,但我们可以把端口想象是通信的终点,因为我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就由 TCP 来完成。

如果把 IP 地址比作一栋楼房,端口号就是这栋楼房里各个房子的房间号。数据包来到主机这栋大楼,会查看是个房间号,再把数据发给相应的房间。端口号只有整数,范围是从 0 到 655352^16-1其中 0 一般作为保留端口,表示让系统自动分配端口。

最常见的是 TCP 端口和 UDP 端口。由于 TCP 和 UDP 两个协议是独立的,因此各自的端口号也相互独立,比如 TCP 有 235 端口UDP 也可以有 235 端口,两者并不冲突。

TCP 和 UDP 协议首部的前四个字节都是用来表示端口的,分别表示源端口和目的端口,各占 2 个字节,详细的 TCP、UDP 协议头部会在下面的文章中讲到。

img

  1. 周知端口Well Known Ports 周知端口是众所周知的端口号,范围从 0 到 1023其中 80 端口分配给 WWW 服务21 端口分配给 FTP 服务等。我们在 IE 的地址栏里输入一个网址的时候是不必指定端口号的,因为在默认情况下 WWW 服务的端口是"80"。网络服务是可以使用其他端口号的,如果不是默认的端口号则应该在 地址栏上指定端口号,方法是在地址后面加上冒号":",再加上端口号。比如使用"8080"作为 WWW 服务的端口,则需要在地址栏里输入"网址:8080"。但是有些系统协议使用固定的端口号,它是不能被改变的,比如 139 端口专门用于 NetBIOS 与 TCP/IP 之间的通信,不能手动改变。

  2. 注册端口Registered Ports 端口 1024 到 49151分配给用户进程或应用程序。这些进程主要是用户选择安装的一些应用程序而不是已经分配好了公认端口的常用程序。这些端口在没有被服务器资源占用的时候可以用用户端动态选用为源端口。

  3. 动态端口Dynamic Ports 动态端口的范围是从 49152 到 65535。之所以称为动态端口是因为它一般不固定分配某种服务而是动态分配。比如本地想和远端建立 TCP 连接,如果没有指定本地源端口,系统就会给你自动分配一个未占用的源端口,这个端口值就是动态的,当你断开再次建立连接的时候,很有可能你的源端口和上次得到的端口不一样。

一些常见的端口号及其用途如下:

  1. TCP21 端口FTP 文件传输服务
  2. TCP22 端口SSH 安全外壳协议
  3. TCP23 端口TELNET 终端仿真服务
  4. TCP25 端口SMTP 简单邮件传输服务
  5. UDP53 端口DNS 域名解析服务
  6. UDP67 端口DHCP 的服务端端口
  7. UDP68 端口DHCP 的客户端端口
  8. TCP80 端口HTTP 超文本传输服务
  9. TCP110 端口POP3“邮局协议版本 3”使用的端口
  10. TCP443 端口HTTPS 加密的超文本传输服务

端口在 tcpip 协议栈中算是比较简单的概念,提出端口的本质需求是希望能将数据包准确的发给某台主机上的进程,实现进程与进程之间的通信。

协议栈全局管理端口,一个端口被分配以后,不允许给其他进程使用,但是要注意的是端口是网络层协议地址+传输层协议号+端口号来区分的,比如:

  1. ipv4 的 tcp 80 端口和 ipv4 的 udp 80 端口不会冲突。
  2. 如果你主机有两个 ip 地址 ip1 和 ip2那么你同时监听 ip1:80 和 ip2:80 不会冲突。
  3. ipv4 的 tcp 80 端口和 ipv6 的 tcp 80 端口不会冲突。