Sockets 在socket()中使用GGP(0x0003)作为协议参数的目的是什么

Sockets 在socket()中使用GGP(0x0003)作为协议参数的目的是什么,sockets,winapi,networking,packets,sniffer,Sockets,Winapi,Networking,Packets,Sniffer,我开始编写一个数据包嗅探器,并搜索要传递到socket()函数的正确参数,以便用以太网报头捕获数据包 我注意到,为了接收以太网报头,他们更改了这一行: s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003)) 关于这一行: s = socket.socke

我开始编写一个数据包嗅探器,并搜索要传递到
socket()
函数的正确参数,以便用以太网报头捕获数据包

我注意到,为了接收以太网报头,他们更改了这一行:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
关于这一行:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))
我的问题是:

  • 我由此了解到,带有原始套接字的
    AF\u INET
    不会给我以太网报头。我的问题是为什么

  • 为什么他也从
    IPPROTO_TCP
    更改为
    ntohs(0x0003)
    ,我知道这是GGP协议。据我所知,第三个参数表示套接字将接收的协议。如果协议参数是GGP,那么套接字将查找具有GGP作为其internet层协议的数据包,不是吗?那为什么他们通过GGP而不是TCP或IP呢?毕竟,几乎每个PDU都有IP和\或TCP\UDP作为其数据协议。。我的包嗅探器的第三个参数是什么重要吗

  • 除了第二个问题,我认为我没有得到第三个参数的目标。如果这是IPPROTO_TCP,套接字将在网络层(而不是UDP)捕获TCP数据包?如果我通过IPPROTO_IP,套接字将捕获以IP作为其internet层协议的数据包,而不检查其他层的协议(套接字对网络层使用什么协议并不重要?它只关心IP作为internet层协议存在)

  • 感谢并为语法错误感到抱歉(英语不是我的第一语言)

  • 原始套接字特性可以在网络堆栈的不同层上设置,以允许内核在较低级别上为您执行一些工作(例如:以太网制作)

  • 在您找到示例的网站上,对GGP协议的更改可能是有意义的,但这样做很难看,应该使用
    getproent()
    ,而不是使用幻数

  • 是的,您可以调整(过滤)数据包捕获的方式。如果要捕获所有数据包,请使用ETH_P_all:

  • 当协议设置为htons(ETH_p_ALL)时,则所有协议均为 收到

  • 原始套接字特性可以在网络堆栈的不同层上设置,以允许内核在较低级别上为您执行一些工作(例如:以太网制作)

  • 在您找到示例的网站上,对GGP协议的更改可能是有意义的,但这样做很难看,应该使用
    getproent()
    ,而不是使用幻数

  • 是的,您可以调整(过滤)数据包捕获的方式。如果要捕获所有数据包,请使用ETH_P_all:

  • 当协议设置为htons(ETH_p_ALL)时,则所有协议均为 收到

    如果你检查一下,你会看到

    #define ETH_P_ALL   0x0003  /* Every packet (be careful!!!) */
    
    所以ETH_p_ALL的值是0x0003。本教程的作者使用0x0003而不是ETH_P_ALL,因为在某些系统中,在python中使用时会出现“未定义”错误

    如果您查看,您将看到

    #define ETH_P_ALL   0x0003  /* Every packet (be careful!!!) */
    

    所以ETH_p_ALL的值是0x0003。本教程的作者使用0x0003而不是ETH_P_ALL,因为在某些系统中,在python中使用时会出现“未定义”错误

    那么根据你的第三个答案,为什么他(在网站示例中)将协议更改为GGP?为什么数据包嗅探器会寻找GGP数据包,而不是IP,因为IP几乎是每个数据包的一部分,所以IP更为常见?我不知道你网站的作者为什么会这样做,而且我遇到了很多关于这个主题的低质量或过时的教程,如果我是你,我不会太在意…:-)很抱歉,教程似乎没有这么好;它是Python 2,写于2011年,代码看起来很难看……所以如果我把IPPROTO_IP放进去,它不会给我的包嗅探器带来任何问题吗?我将能够捕获所有协议,其中包括IP作为其internet层协议(不知道其他层中的协议是什么),并且使用AF_数据包和SOCK_RAW选项,我也将能够获取以太网报头?基本上是的。我在这里找到了一个更好的文档参考,其中包含了大量或更少的最新示例:这将对您有很大帮助。因此,根据您的第三个答案,为什么他(在网站示例中)将协议更改为GGP?为什么数据包嗅探器会寻找GGP数据包,而不是IP,因为IP几乎是每个数据包的一部分,所以IP更为常见?我不知道你网站的作者为什么会这样做,而且我遇到了很多关于这个主题的低质量或过时的教程,如果我是你,我不会太在意…:-)很抱歉,教程似乎没有这么好;它是Python 2,写于2011年,代码看起来很难看……所以如果我把IPPROTO_IP放进去,它不会给我的包嗅探器带来任何问题吗?我将能够捕获所有协议,其中包括IP作为其internet层协议(不知道其他层中的协议是什么),并且使用AF_数据包和SOCK_RAW选项,我也将能够获取以太网报头?基本上是的。我在这里找到了一个更好的文档参考,其中包含了大量或更少的最新示例:它将对您有很大帮助。