【问题标题】:What do I need to fill in when using IP_HDRINCL使用IP_HDRINCL时需要填写什么
【发布时间】:2010-07-16 15:04:11
【问题描述】:

我正在等待“Linux 网络编程”的到来,但同时我想我会在这里向我的兄弟(和姐妹)询问一些信息。如果我构建了一个包含以太网标头、ip 标头和 tcp/udp/icmp 标头的原始数据包结构。使用选项 IP_HDRINCL 时,我实际上必须填写什么?起初我认为我必须做所有事情,但现在我明白以太网标头的 src 和 dest mac 地址可以由内核处理。但是我需要填写什么以及其他字段应该具有什么值才能让内核理解它应该填写那些?

提前感谢男孩(和女孩)!

【问题讨论】:

    标签: linux network-programming sockets


    【解决方案1】:

    您从 IP 标头开始。但正确设置 IP 和 TCP/UDP 帧的所有成员。

    你的假设是正确的。发送原始 IP 帧时不要包含以太网标头。通常以太网用作低级通信,但也有其他的。

    【讨论】:

    • 我已经建立了一个层次结构(不想在 C 中使用继承这个词......呵呵),其中最低级别的数据包是以太网数据包。然后一个 IP 数据包包含以太网数据包的内容以及 ip 组件等等。因此,我自己确实包含了以太网标头。但我注意到,如果我只是填写 src 和 dst ip 和端口,我可以将 src 和 dst mac 设置为任何内容,内核将使用我的 dst ip 的 mac 地址使用的 mac 更新 dst 的 mac。
    • 但是您将指向 IP 标头的指针传递给 send() 函数。如果这个地址之前还有一些其他字节(比如以太网头),它不会在意。
    • 我使用 write 函数将我的数据包写入网络。如果我在我的 ethheader 中设置 macaddresses,当我用 Wireshark 查看它时,它会反映在我发送的数据包中。这允许我欺骗我的 src mac 地址。如果我将数据包作为 TCP 数据包或类似数据发送,则 det macaddress 如果被内核的 on retrivet 覆盖。
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 2015-12-02
    • 2012-10-29
    • 2013-09-29
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多