我实现了传出IP数据包的简单隧道传输和加密,即每个packet+IP报头都经过加密并添加了新的IP报头。
为此,我在发送方和接收方中使用原始套接字。
我只是尝试弄清楚传出数据包的碎片是否会导致破坏再次解密它们的能力。
原始套接字是否提供组装的数据包,或者我是否需要自己实现碎片整理?
发布于 2021-02-06 08:54:26
假设您引用的是Berkeley Sockets API的原始套接字(也称为BSD套接字),
答案是:
不会,它们不会合并零碎IP数据包的片段。您将收到IP数据包,包括IP报头,就像它们到达您的网络接口一样。
请注意,BSD套接字在不同的操作系统中有不同的实现。您没有说您正在为哪个(S)系统开发代码。尽管POSIX标准将其网络API基于BSD套接字,但POSIX根本没有指定原始套接字,因此符合POSIX标准的操作系统甚至不需要支持原始套接字。
尽管许多系统已经采用了BSD,其中包括Linux/Android,FreeBSD,macOS/iOS,甚至Windows,但它们在实现上有一些重要的区别。例如,它们支持不同的套接字选项,它们的套接字选项以不同的方式运行,或者它们支持不同的扩展。作为套接字选项差异的示例,see here。因此,理论上您的系统可能有一个选项,您可以设置该选项以获得重新组装的数据包。这将不是可移植的,但是原始套接字本身从一开始就只能是有限的可移植。
发布于 2019-10-17 13:45:09
这是特定于操作系统的,但通常取决于您如何读取它们。看看几个关于POSIX套接字的linux文档:
特别是,如果您使用SOCK_RAW,那么recvfrom将不会总是返回完整的数据包。请参阅以下引文:
如果消息太长,无法放入所提供的缓冲区,则可能会丢弃多余的字节,具体取决于从其接收消息的套接字类型。
如果len太小,无法容纳整个数据包,则会在下一次读取时返回多余的字节。
接收调用通常返回任何可用的数据,直到请求的数量,而不是等待接收到请求的全部数量。
关于你的问题:
原始套接字是否提供组装的数据包,或者我是否需要自己实现碎片整理?
他们没有,你需要整理你自己的碎片。如果套接字没有刷新,或者发生了碎片,调用将返回任何可用的数据,可能只返回部分数据包。
https://stackoverflow.com/questions/58425473
复制相似问题