
我是网络新手,正在学习相关理论。请帮我解答以下问题:
所以我遇到了端口号,它表示通过接收数据包的节点的操作系统将了解该数据包所属的应用程序/进程/服务并适当地转发它。
如果我们深入研究并以服务器端为例,那么实际上应用程序/软件/进程/服务会请求一个套接字,然后操作系统会创建该套接字,并且该特定套接字是该应用程序/软件/进程/服务的通信端点。该套接字实际上配置为侦听特定流量,因此您的客户端必须发送指定正确端口的请求。
到目前为止理论已经很清楚了
然后我阅读了有关 ARP 协议的内容,发现 ARP 数据报封装在以太网帧中。ARP 消息没有任何端口号信息。我得到的答案是,这是因为 ARP 请求不由节点上的任何软件应用程序处理,它实际上由 OS 网络堆栈处理,因此 ARP 数据包中收到的数据在 OS 内部使用,而不是转发给任何应用程序或服务。所以它不需要端口号。
现在,只有当数据包中的数据需要转发到节点上的某个应用程序时才需要端口号。
这是正确的理解吗?
答案1
ARP是高层用来识别低层接收设备地址的机制。
例如在以太网 LAN 中,TCP/IP 需要将数据包发送到另一台设备,然后为了将数据包放入线路中,它需要知道接收设备的 MAC 地址。
ARP 用于通过广播询问类似:“WXYZ 的 MAC 地址是什么?”
如果 IP 地址为 WXYZ 的设备存在且已连接,它将以其 MAC 地址进行回复,然后发送方可以开始直接向该设备发送信息。
ARP 不依赖于端口,因为它是 TCP/IP 套件的一部分,并且对其功能至关重要。
端口就像门。想象一下,对于每个数据包,如果是普通的 UDP 或 TCP,它都会带有一个目标端口,然后被重定向到内部“门”,以打开对特定应用程序的访问。
答案2
然后我阅读了有关 ARP 协议的内容,发现 ARP 数据报封装在以太网帧中。ARP 消息没有任何端口号信息。我得到的答案是,这是因为 ARP 请求不由节点上的任何软件应用程序处理,它实际上由 OS 网络堆栈处理,因此 ARP 数据包中收到的数据在 OS 内部使用,而不是转发给任何应用程序或服务。所以它不需要端口号。
端口号有两个用途 - 区分更高级别的协议和区分该协议的多种用途(连接或套接字或流)。
首次使用时,ARP 数据包做有类似的东西 – ARP 作为一个整体由以太网报头中的“以太网类型”字段识别,该字段的主要作用是指示允许“代码的哪一部分”处理数据包。 IPv4 有一个以太网类型,ARP 有一个以太网类型,IPv6 有一个以太网类型。
(某些以太网帧格式使用 LLC/SNAP 来实现相同目的。)
类似地,IP 本身也有一个“协议”或“下一个头”字段,指示其有效负载是 TCP 还是 UDP 还是 ICMP 还是 GRE 还是其他(并且同样可以让一些协议由操作系统处理,一些协议由使用原始套接字的应用程序处理;特别是 OSPF)。
对于第二个目的,即区分同一协议的多个流(允许不同的程序同时使用同一个远程端口),ARP 没有等效项,但也不需要;通常操作系统中确实只有一个 ARP 处理程序,如果其他软件想要生成/监听 ARP 数据包,复制它们也没有什么坏处,而且 ARP 响应本质上很容易区分(它们总是包含请求的 MAC)。
(为了进行比较,ICMP 回显请求又名“ping”由“ICMP”的 IP 协议号识别,多个并发 ping 调用由 ID 字段识别,它们共同起到与 UDP 目标/源端口类似的作用。)
“由操作系统内部”和“外部应用程序或服务”之间的区别实际上并不那么重要——您可以轻松地让操作系统自行建立 TCP 连接,并且它仍然需要与外部应用程序相同的东西。