【问题标题】:Does raw sockets reassemble the packet?原始套接字会重新组装数据包吗?
【发布时间】:2020-02-13 22:52:00
【问题描述】:

我对传出的 IP 数据包实现了简单的隧道和加密,即每个数据包+IP 标头都被加密并添加了一个新的 IP 标头。

为此,我在发送方和接收方中使用原始套接字。

我只是想弄清楚传出数据包的碎片是否会导致破坏再次解密它们的能力。

原始套接字是否提供组装数据包,还是我需要自己实现碎片整理?

【问题讨论】:

  • 重组发生在 IP 层。如果您不使用它,则无需重新组装。

标签: sockets networking encryption ip raw-sockets


【解决方案1】:

假设您指的是Berkeley Sockets API(又名 BSD 套接字)的 RAW 套接字,
答案是:

不,它们不会组合分段 IP 数据包的片段。您将收到 IP 数据包,包括 IP 标头,就像它们到达您的网络接口一样。

请注意,在不同的操作系统中存在各种 BSD 套接字实现。您没有说您正在为哪个系统开发该代码。尽管 POSIX 标准基于 BSD 套接字的网络 API,但 POSIX 根本没有指定 RAW 套接字,因此符合 POSIX 的操作系统甚至不必支持 RAW 套接字。

尽管事实上许多系统都采用了 BSD API,其中包括 Linux/Android、FreeBSD、macOS/iOS 甚至 Windows,但它们的实现还是存在一些重要差异。例如。它们支持不同的套接字选项,它们的套接字选项以不同的方式运行,或者它们支持不同的扩展。作为套接字选项差异的示例,see here。所以理论上你的系统可能有一个选项,你可以设置它来获取重新组装的数据包。这不会是可移植的,但 RAW 套接字本身只是有限的可移植性。

【讨论】:

    【解决方案2】:

    这是特定于操作系统的,但通常取决于您阅读它们的方式。查看一些关于 POSIX 套接字的 linux 文档:

    特别是你使用 SOCK_RAW 然后 recvfrom 不会总是返回完整的数据包。请参阅以下引文:

    如果消息太长而无法放入提供的缓冲区, 多余的字节可能会被丢弃,具体取决于套接字的类型 收到消息。

    如果 len 太小而无法容纳整个数据包,则多余的字节将从下一次读取中返回。

    接听电话 通常返回任何可用的数据,不超过请求的数量, 而不是等待收到请求的全部金额。

    你的问题:

    原始套接字提供组装数据包还是我需要自己实现碎片整理?

    他们不这样做,您需要对自己进行碎片整理。如果套接字没有被刷新,或者发生碎片,调用将返回任何可用的数据,可能只有部分数据包,期望你重组它们。

    【讨论】:

    • 不以任何方式回答问题。
    • 添加了明确的答案。虽然,我认为答案从解释中非常明显。
    • “对你的问题”上面的所有内容现在和过去都是无关紧要的。
    • 在“原始”人中,我发现“请注意,数据包套接字不会重新组装 IP 片段,这与原始套接字不同”。这不是意味着原始套接字重新组装片段吗?
    • 还有一个关于 MTU 的讨论,似乎暗示使用原始套接字无法实现碎片。相反,套接字将返回错误。话虽如此,我想在一些奇怪的网络场景中,除非您直接设置 DF 位,否则您仍然可以收到片段。另请参阅stackoverflow.com/a/4187935/234261
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多