2

我一直在使用 C 语言中的 Raw Berkeley Sockets,它允许程序员访问 Internet 协议套件的第 2 层(IP 标头)。我想知道原始套接字如何处理第 1 层(链路层)上的传输,特别是关于无线局域网。

例如,套接字如何知道将数据包发送到哪个网络接口(eth0 或 wlan0)?

如果我在无线路由器后面,是否仍应使用我的 LAN 地址 (192.168.1.1) 或路由器的 Internet 地址 (74.125.226.68) 填写我的 IP 标头的 IP 源地址?

如果我确实用我的 LAN 地址 (192.168.1.1) 填充 IP 源地址,IP 标头在通过路由器时是否会更改,还是保持不变,以便数据包的接收端尝试发送响应其网络上的本地主机?

我将不胜感激这方面的任何见解。

4

1 回答 1

3

例如,套接字如何知道将数据包发送到哪个网络接口(eth0 或 wlan0)?

您可以使用 socket 选项SO_BINDTODEVICE将您的套接字绑定到特定接口。否则,操作系统选择一个。

如果我在无线路由器后面,是否仍应使用我的 LAN 地址 (192.168.1.1) 或路由器的 Internet 地址 (74.125.226.68) 填写我的 IP 标头的 IP 源地址?

您应该使用您的 LAN 地址。如有必要,路由器负责处理 NAT(网络地址转换)。

如果我确实用我的 LAN 地址 (192.168.1.1) 填充 IP 源地址,IP 标头在通过路由器时是否会更改,还是保持不变,以便数据包的接收端尝试发送响应其网络上的本地主机?

如果在路由器上启用了 NAT,源地址将更改以反映路由器的外部地址。否则,您的包可能会被路由器或防火墙丢弃,因为您的源地址在它们的上下文中是无效的。

于 2012-05-19T17:43:32.150 回答