1

为什么 python 在套接字对象的实例化中指定 IPv4 或 IPv6SOCK_STREAMSOCK_DGRAM当它还接受协议号参数时(nrs 4 和 41,请参阅 协议号列表)?(如protosocket.socket([family[, type[, proto]]])这不是使family论点无用吗?

4

2 回答 2

1

没有。您链接到的协议列表中的第 4 和 41 号明确说明了“IPv4 封装”和“IPv6 封装” 例如,您将使用带有 IPV6 封装的 IPv4 来生成数据包,然后在上游解封装(除非这实际上不是一个词),例如IPv6 over IPv4 隧道

于 2012-05-15T14:14:06.467 回答
1

proto在此上下文中是指要使用的第 4 层 (L4) 协议。这很可能是IPPROTO_TCP(TCP) 或IPPROTO_UDP(UDP)。实际上,您不太可能需要非常频繁地显式传递这些参数,因为 IP 通常SOCK_STREAM意味着 TCP 并SOCK_DGRAM意味着 UDP。

但是,如果您想在程序中使用原始套接字实现 ICMP 支持,它可能会派上用场。然后你会通过SOCK_RAWand IPPROTO_ICMP。另外,请记住,这是基于 Berkeley 套接字 API,它旨在处理的不仅仅是 IP 网络(查看模块中的所有其他AF_*内容socket以了解它支持的内容)。

相比之下,IPv4/IPv6 是第 3 层 (L3) 协议,独立于 TCP/UDP 工作。

编辑:

至于为什么您在该列表中看到 IPv4/IPv6 封装,它是为了支持IP in IP6in4等协议。您不太可能在程序中直接处理这些机制。

于 2012-05-15T14:23:47.143 回答