在 IP 数据包头中有一个 8 位协议字段(在偏移量 9 处),其中包含“下一级协议”,其分配的编号在 RFC 790 中给出。例如,TCP 是 6。我的问题是,为什么 IP层知道网络堆栈中的更高层吗?
为什么 IP 层知道网络堆栈中的更高层?
每个“头”都有某种“下一个协议”标识字段。这是必要的,因为在线路上,数据只是一串 1 和 0。接收端点必须有一种方法来解释下一个位所指的内容。
如果没有明确指示如何解释下一组 1 和 0 的字段,则无法确定接下来的 32 位是 TCP 序列号还是 IP 源地址(例如)。这两个字段确实都是 32 位,因此除了某种“下一个协议”字段之外,无法以编程方式确定这些 1 和 0 的实际含义。
IPv4 协议字段允许端点确定数据包中的数据类型。端点的 IP 层使用协议字段来确定将数据包交给哪个协议。
为什么 IP 层知道网络堆栈中的更高层?
IP 数据包具有必须传递给某个其他进程的有效负载。IPv4 协议字段(IPv6 Next Header 字段做同样的事情)告诉 IP 将 IP 数据包的有效负载传递到哪里。
其他层中的协议具有等效类型的字段,以了解将其有效负载传递到何处。例如,以太网有 Ethertype 字段来告诉它向哪个进程(ARP、IPv4、IPX、IPV6、AppleTalk 等)传递其有效载荷,而传输协议具有地址(端口)来告诉它们将其传递给哪个进程。有效载荷。
为什么 IP 层知道网络堆栈中的更高层?
因为 IP 不是数据包负载的最终目的地。每一层都需要知道将其有效载荷发送到何处,但这并不意味着任何层都真正知道有效载荷中的内容,或者下一层实际是什么或对有效载荷做了什么。就 IP 而言,它将数据包有效载荷传递给在协议编号处向其注册的进程,而不是将有效载荷传送到任何特定的传输协议,因为 IP 对传输协议一无所知。
来自维基百科:
第 3 层:网络层
网络层提供将可变长度数据序列(称为数据报)从一个节点传输到连接到同一网络的另一个节点的功能和程序方法。网络是一种可以连接许多节点的介质,在该介质上每个节点都有一个地址,并且允许连接到它的节点仅通过提供消息的内容和目的地的地址来将消息传输到连接到它的其他节点节点并让网络找到将消息传递(“路由”)到目标节点的方法。除了消息路由之外,网络可能(也可能不)通过将消息拆分为多个片段、通过单独的路由传递每个片段并重新组装片段、报告传递错误等来实现消息传递。
不能保证网络层的数据报传送是可靠的。许多层管理协议(在管理附件 ISO 7498/4 中定义的功能)属于网络层。这些包括路由协议、组播组管理、网络层信息和错误以及网络层地址分配。使这些属于网络层的是有效载荷的功能,而不是承载它们的协议。
每一层都支持关于它的层,这就是 OSI 模型的设计方式。