请注意,这不是为什么 IP 层知道网络堆栈中的更高层的重复?
在基于数据包的通信中对协议标识符(例如 IP 标头的协议字段)的需求是显而易见的:要么是这种,要么是某种计算密集型推理算法。问题是:为什么它必须作为 IP 标头的一部分而不是封装协议的标头中的一部分存在?
在我看来,这是理论清晰度满足实际考虑的情况之一(又名“Haskell 满足 Go”...):一方面,在 IP 标头中放置“协议”字段打破了概念上的利益分离,例如. OSI 模型旨在;另一方面,强制协议栈更高的协议以一致的方式声明它们的类型要困难得多,并且最终会导致类似的情况(例如,如果堆栈更高的每个协议都使用它的第一个头字节来声明它的类型,看起来好像 IP 使用其最后一个标头字节来做同样的事情)。
所以我的问题是 - 将“协议”字段放置在 IP 的数据包标头内而不是其他任何地方的原因是什么?
编辑:在写这个问题我考虑是否要加上“原创”,“推理”之前,该设计团队即推理IP,但估摸这是因为这个问题在过去时措辞(“什么多余的是的推理...”)。尽管如此,这似乎是必要的,因为没有一个回复实际上回答了这个问题。一些注意事项:
- @immibis 建议任何其他形式都会破坏其他协议的模型(例如,加密通信协议必须有一个明文识别字段)
- @Eddie 本质上说原因是约定(接受协议链设计,尽管为什么这是约定仍然是个谜)
- @Ricky 强调实用性是首要考虑因素
- @Claudio 建议,如果协议字段是封装标头的一部分,则需要额外的标头识别步骤,在当前模型中,在 IP 标头解析期间发生
所以我会改写:模型有什么问题,其中每个标头不是每个标头标识下一个标头的类型,而是在预定位置(例如,在第一个标头字节中)标识自己的类型?为什么这样的模型比当前的模型更不受欢迎?
编辑#2:似乎答案是给出的几个答案的组合(主要是上面提到的那些以及@Eddie 的第二个附录):
简单性:在这种特殊情况下打破层不可知论的原则意味着整个堆栈(或模型)可以更简单:
- 没有“协议识别”阶段,既不隐含也不明确
- 层独立性得到改进(例如,加密的通信处理程序不必与任何帮助协议共享层)
监管也大大简化,无需对客户端协议强制执行任何要求。
性能:在数据包本身之前声明封装数据包的协议允许将几种类型的快速路由协议(数据包过滤、QOS、直通交换)集成到网络(互联网)层本身;然后,它们可以像访问哈希表一样快速做出决定,考虑到该协议设计用于运行的有限硬件,这一点更为重要。
这个模型有它的缺点,但对于常见的用例,它似乎比替代方案更适合。