2012-05-19 65 views
2

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

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

如果我在无线路由器后面,我还应该使用我的LAN地址(192.168.1.1)还是我的路由器的Internet地址(74.125.226.68)来填充IP头的IP源地址?

如果我用我的局域网地址(192.168.1.1)来填充IP源地址,那么当IP头经过路由器时会发生变化,还是保持这种状态,以便数据包的接收端尝试将响应发送到其网络上的本地主机?

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

回答

3

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

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

如果我是一个无线路由器后面,我应该还是填补我的IP报头的IP源地址与我的局域网地址(192.168.1.1),或者用我的路由器的互联网地址(74.125.226.68)?

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

如果我用我的局域网地址(192.168.1.1)来填充IP源地址,那么在IP头经过路由器时会发生变化,还是保持这种状态,这样接收端数据包尝试将响应发送到其网络上的本地主机?

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

+0

谢谢澄清,nyi。 – Kokopelli