- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解析通过原始套接字接收到的 IPv6 数据包并确定它是否是ICMPv6。我可以处理以太网和IPv6 header ,但还有可选的扩展 header 。如果 IPv6 header 的 Next Header
字段不是 ICMPv6,我必须迭代可能位于前面的任何扩展。
迭代本身不是问题,因为每个扩展 header 都带有其长度。但是,我找不到区分可能遵循的扩展 header 和其他上层协议(protocol)(例如 TCP 和 UDP)的好方法。我可以检查 Next Header
是否是已知的扩展 header 之一(在这种情况下我可以迭代),或者 Next Header
是否是上层协议(protocol)(在这种情况下)我必须停下来,不会有任何ICMP..)。
在这两种方法中,我都依赖于一些自建的常量列表,我正在检查Next Header
,并且该列表将来可能会发生变化。难道没有更好的方法来判断我何时位于扩展 header 的末尾并且后面没有上层 header (或什么也没有)吗?
最佳答案
每个扩展 header 都有自己的 Next Header
字段作为其第一个八位字节,其含义与固定 IPv6 header 的相应字段相同(但相对位置不同)。您可以将它们与扩展 header 的长度字段一起使用来逐步浏览扩展 header ,直到找到传输层 header 。维基百科covers this一些细节。
更新:
关于您修改后的问题,不,没有标准函数或算法来区分指定扩展 header 和指定协议(protocol) header 的 header 代码,除了简单地知道哪个是哪个。它们是从相同的代码空间分配的,没有特殊的内部结构。
然而,只有 256 个可能的值,因此知道哪些是哪些是可行的。但请注意:近一半的可用代码当前尚未分配,但将来可能会分配给扩展 header 类型或协议(protocol)类型。除非代码用尽,否则您的软件将需要识别三个类别:
此外,对于实现这样的测试,我建议创建和使用查找表,而不是构建复杂的条件表达式。大致如下:
enum header_type { HDR_PROTOCOL, HDR_EXTENSION, HDR_UNKNOWN };
const enum header_type header_types[256] = {
[0x00] = HDR_EXTENSION, // IPv6 hop-by-hop option
[0x01] = HDR_PROTOCOL, // ICMP
// ... both extension and protocol headers in this range ...
[0x8e] = HDR_PROTOCOL, // robust header compression
[0x8f] = HDR_UNKNOWN, // unassigned
// ... more unassigned ...
[0xfd] = HDR_UNKNOWN, // for experimentation
[0xfe] = HDR_UNKNOWN, // for experimentation
[0xff] = HDR_UNKNOWN, // reserved
};
您可以用它来回答多种问题,而且效率很高。初始化程序中的显式指示符并不是严格必要的,但我认为它们是一个好主意:它们将帮助您验证和维护表。
关于c - 如何区分扩展头和上层头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42286369/
我正在尝试将多个项目转换为 classy-prelude眼下。虽然大多数行为对我来说似乎相当简单,但 (head . head) 在简单的 2D 列表上给出了神秘的错误。 考虑以下 GHCi sess
我创建了这个类来从请求中获取 Header 值。 public class AuthenticationHeader { private static IHttpContextAccesso
这里有两段代码。 工作: joins :: [String] -> String -> String joins [] _ = "" joins [x] _ = x joins xs d = head
我是编程新手,正在Windows中使用vscode并通过Mingw 64进行编译。尝试了数天后,我要求对此问题做出解答。我用谷歌搜索了很多次。这是我的项目树的外观。请帮助我包括并将 libA 链接到
我正在研究 Ninety-Nine Scala Problems 的 P07 问题: P07 (**) Flatten a nested list structure. Example: scala>
这里有两段代码。 工作: joins :: [String] -> String -> String joins [] _ = "" joins [x] _ = x joins xs d = head
我正在使用现成的欧洲 cookie 政策脚本。问题是,我的 Hubspot CMS 只允许所有内容的全局标题或每个页面的单独标题。我们有 120 个页面,很难手动定义它,但我们需要一个用于德语页面的脚
Solaris 10 SPARC Sun Studio C 编译器 12.3 在 SPARC64 机器上,如果您访问一个在相关 4 或 8 字节边界上未正确对齐的变量,您将获得核心转储。这需要编码人员
我正在尝试从服务器列表中获取 apache 版本。我正在考虑解析 header ,但是我无法发送 HEAD 但它可以与 GET POST 等一起使用。 这是我的代码: import java.io.B
嗨,我是 github 的新手,当我对代码做了一些更改然后 merge 到上游时,如果有任何冲突,它将执行以下操作。 Auto-merging Global.asax.cs CONFLICT (con
例如,获取偏移量 Y 之后的前 X 行的建议方法是什么?我目前正在做的是: offset, limit = 2, 2 df=pd.DataFrame([{'a':1}, {'a': 2}, {'a':
当我在R块 header 中插入长标题等内容时,能够将 header 拆分为多行会很好。 有没有简单的方法可以做到这一点? 例如。: ```{r, echo=FALSE, warning=FALSE,
我刚刚开始使用 Erlang(虽然有一些 lisp 背景)并且有一个关于列表模式匹配的问题。 如果我说 [Head | Tail] = [1, 2, 3]. 然后我得到 Head = 1 Tail =
我的 index.php 文件开头有这段代码: if ( !isset($_GET['cat']) ) die(header("Location: ?cat=top")
对第 3 方应用程序进行一些 SOAP 调用。他们提供此 soap header 作为应用程序期望的示例。如何在 PHP 中创建这样的 SOAP header ?
我对 git 仓库下的文件做了一些更改,我使用 git commit 提交了文件 然后我尝试使用 git push origin master 推送到 master,它返回了 Everything u
我刚刚尝试从 url 下载 webp 图像,但是当我尝试处理存储的图像时,我发现了一些不同的东西。 如果我从浏览器下载图像,它可以使用 x/image/webp 包解码,但如果我使用 http.Get
这是来自 slices 的略微修改的代码 var buffer [256] byte func SubtractOneFromLength(slice []byte) []byte { sli
在 Linux 中是否有一种方法可以请求 Head 或 Tail 但要忽略额外的记录偏移量。 例如,如果文件 example.lst 包含以下内容: row01 row02 row03 row04 r
代码: /* * File: problem5.c * Author: levihackwith * Description: Write a Pop() function that is th
我是一名优秀的程序员,十分优秀!