【问题标题】:Raw Sockets in CC 中的原始套接字
【发布时间】:2016-01-09 13:58:15
【问题描述】:

1.

socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

Linux 手册页中介绍了此代码。

在socket选项中,如果设置了IP_HDRINCL,我可以制作IP头。我对吗? 对的话,上面的socket也让我做TCP头吧?

那么,如果没有设置IP_HDRINCL,socket上面是什么意思呢?

2.

 socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
 socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

上面的代码与第一个问题的代码相比是什么意思?

我知道 IPPROTO_RAW 无法接收任何 IP 数据包。在这里,这些套接字只能接收 TCP 数据包,每个 UDP 数据包。(我可以看到 IP 标头,以太网标头吗?) 但是发送呢??这个我不太清楚。

【问题讨论】:

    标签: c linux sockets networking


    【解决方案1】:
    1. IP_HDRINCL 表示:我希望我的数据(用于发送和接收)包含 ip hdr。如果您的数据包含 ip hdr,则意味着 tcp hdr 紧随其后(就在 ip hdr 之后),最后也是应用程序的消息(您通常要发送的消息......)。如果没有 IP_HDRINCL,您只能访问应用数据。

    2. 是的,IPPROTO_TCP 和 IPPROTO_UDP 和 SOCK_RAW 只是您所说的过滤器,用于发送接收。使用 IPPROTO_RAW 可以发送任何 TCP/IP 数据包(无过滤器)。但是要接收数据包,还需要将 AF_INET 更改为 AF_PACKET。

    【讨论】:

    • 当我从这些套接字接收数据包时,我可以从 2 号问题的套接字中看到以太网、IP、tcp/udp 标头吗?关于发送,第二个问题的套接字,如果我使用IPPROTO_TCP,那么我只能制作IP头和TCP头?如果我使用IPPROTO_UDP,那么我只能制作IP头和UDP头吗?所以如果我使用 IPROTO_RAW,那么我可以制作任何 TP 图层标题?
    • 是的,你确实看到了这些标题
    • 那么,socket(af_inet, sock_raw, IPPROTO_TCP) 和socket(af_packet, sock_raw, IPPROTO_TCP) 在接收数据包时有什么不同呢?我认为他们都可以从链路层到应用层获取数据包。它们只是在发送数据包时有所不同,因为后者可以制作以太网标头吗?
    • AF_INET 中的 INET 表示 Internet,即 TCP/IP。 Internet (TCP/IP) 不关心您的链路层,它不是 Internet 的一部分。所以 AF_INET = IP 层,AF_PACKET = 链路层。您无权使用 AF_INET 访问链路层。
    • @mikedu95 不,所有陈述都不正确。 AF_INET, SOCK_RAW 套接字不能让您访问 ethernet 或 IP 层以下的任何东西。 AF_PACKET 套接字可以。
    猜你喜欢
    • 2018-12-02
    • 2017-10-28
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多