“端口”是通信端点(在传输层中)吗?
“端口号”是分配给端口的地址吗?
给定一个端口,我们是否可以更改分配给它的端口号,就像可以更改分配给网络接口的 IP 地址一样?
从https://en.wikipedia.org/wiki/Network_socket
TCP 端口 53 和 UDP 端口 53 的套接字是不同的套接字
这句话是什么意思?具体来说,
一个端口可以同时被两种传输协议(例如TCP和UDP)使用吗? (我的理解是端口是传输协议的一部分,即使在不同的时间也不能属于另一个协议。)
引用是否意味着端口号 53 可以在不同时间(但不能同时)分配给 TCP 中的端口和 UDP 中的端口?
答案1
TCP 和UDP 是IP 之上的两种不同的协议。 TCP端口号是TCP协议的一部分,UDP端口号是UDP协议的一部分。所以是的,两者可以同时使用,因为 TCP 和 UDP 是两种不同的协议,具有不同的协议号(请参阅 参考资料/etc/protocols
)。
DNS 服务器可以并且确实同时侦听 UDP/53 和 TCP/53,因为 UDP 速度更快并且日常请求的开销更少,而由于 UDP 数据包,对于特别大的 DNS 请求,TCP 可能是必需的尺寸限制从很久以前就开始了。例如,这是named
同时收听两者的:
$ sudo lsof -i -nP | fgrep \*:53
named 1267 named 20u IPv6 9691 0t0 TCP *:53 (LISTEN)
named 1267 named 512u IPv6 9690 0t0 UDP *:53
$
这named
可以通过上面列出的两个不同端口同时处理数百甚至数千个 UDP 和 TCP 客户端请求。
TCP 和 UDP 是传输层的两种不同实现,并且具有两个各 16 位的字段,指定每个 TCP 或 UDP 数据包的源端口和目标端口。可以通过调整文件来修改端口号到名称的映射关系/etc/services
(可能是一个非常非常糟糕的主意),或者可以指示服务器侦听某些非默认端口号,假设客户端系统都已正确重新配置为在该非默认端口号连接到它,例如sshd -p 1234
在 a 上server
,然后ssh -p 1234 server
连接到该非默认 TCP 端口 1234,而不是通常的tcp/22
。或者,可以将 DNS 服务器设置为在 UDP 端口 8475 上运行,但随后需要使用自定义客户端程序,例如dig -p 8475 @server ...
查询该自定义 UDP 端口,因为操作系统通常只会与 UDP/53 或 TCP/ 53 在给定的任何名称服务器 IP 上。
答案2
一台计算机可以有一个或多个 IP 地址。
某些 IP 协议(例如 ICMP)只需要 IP 地址即可进行通信。其他协议(例如 UDP 和 TCP)要求将数据包发送到端口和 IP 地址。一般来说,你有一个程序实现一个服务监听知名港口以便其他系统知道如何联系它。ssh
例如,服务器将侦听端口 22/tcp :
$ netstat -a -t
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:ssh *:* LISTEN
$ netstat -a -t -n
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
该netstat
程序将通过查找来为端口号提供符号名称,/etc/services
并且诸如以下的程序sshd
将调用getservbyname("ssh","tcp")将名称转换为端口号。
如果您侦听 IP 地址0.0.0.0
,则意味着侦听系统的所有 IP 地址,这就是 netstat 打印*
.
服务器ssh
没有有监听端口 22。您可以更改其配置文件以监听端口 8022。只要远程用户知道端口号,并且任何介入的防火墙都允许流量到达端口 8022,它就可以工作。
对于全球数百个服务,众所周知的端口号都维护在服务名称和传输协议端口号注册表。它是本地系统的超集/etc/services
。
套接字是一个通信端点。在使用之前,必须先边界IP 地址、端口号和协议。如果它使用 TCP,则必须是连接的在数据包可以交换之前连接到另一个套接字。服务器调用socket
创建套接字、bind
绑定它并listen
侦听连接。客户端使用socket
和bind
, thenconnect
连接到服务器。 (bind
对客户端的调用是可选的;connect
调用时,系统将分配一个未使用的端口并选择一个适当的 IP 地址来绑定到套接字。)
TCP 端口 53 和 UDP 端口 53 的套接字是不同的套接字
如果可以在 TCP 和 UDP 上提供服务,则两种协议中的端口号通常相同。在上述情况下,您可能有一个 DNS 服务器,它创建两个套接字,一个侦听0.0.0.0:53/tcp
,另一个侦听0.0.0.0:53/udp
。
一些较旧的服务被设计为仅在一种协议上运行,在这些情况下,您可能会看到两个服务使用相同的端口号(但当然在不同的协议上)。例如,512/tcp 用于 rexec,而 512/udp 用于 biff。像这样的系统有完全不同的程序在端口上侦听。rexecd
监听 512/tcp,并comsat
监听 512/udp。