![Python套接字协议具有相同的值](https://linux22.com/image/1627649/Python%E5%A5%97%E6%8E%A5%E5%AD%97%E5%8D%8F%E8%AE%AE%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E7%9A%84%E5%80%BC.png)
所以我正在阅读这本书并且在关于数据包嗅探的章节中我使用了这个
s = socket.socket(AF_PACKET, SOCK_RAW, sock.htons(0x0800))
我查找了自 htons(0x0800) 以来哪个协议的值为 8
在 IP 协议列表中,8 是 EGP,我不明白为什么我们要使用这个协议,并寻找了更多的例子,却变得更加困惑,一个例子使用了 0x0003,当我进一步研究它时,它是 3,3 是 GGP 协议和 eth_p_all 协议的值。
我的问题是:
1.我提供的链接中的某些协议值似乎相同,套接字是否使用基于系列的协议,或者是否存在我没有得到的东西?
2.我了解原始套接字和 eth_p_all 的用法,但我不明白它与 ggp 协议有何不同(就值而言,它们都是 3)
我发现了一些与该问题相关的问题,但答案并没有解释有什么区别,而是应该使用什么。
抱歉,如果我说得没有道理,我感到非常困惑。
首先要注意的是,我认为这是基于家庭使用的协议,但后来我发现人们使用 af_inet 和 eth_p_all,所以就是这样,我发现一些使用 ntohs(0x0003)的例子,这个值大约在 700 左右,这让我更困惑(我相信这个例子有错误,但我不确定)
链接: https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers?wprov=sfla1
https://github.com/torvalds/linux/blob/master/include/uapi/linux/if_ether.h
答案1
您混淆了两种不同的原始套接字。
您socket(AF_INET, SOCK_RAW)
在 IP 层工作,并且始终发送/接收带有自定义有效负载的 IPv4 数据包。“协议”设置 IPv4 标头的协议字段(例如,3 表示“GGP”,6 表示“UDP”)。
当socket(AF_PACKET, SOCK_RAW/DGRAM)
您在第 2 层工作并发送/接收以太网帧时。“协议”设置以太网报头中的协议字段,也称为“以太网类型”(例如 0x0800 表示“IPv4”,0x0806 表示“ARP”,0x8137 表示“Netware IPX”)。
文件 /etc/protocols 仅列出 IP 标头中的值 - 它没有列出以太网帧类型。