sockets - 在子网掩码和路由方面的主机设备通信

标签 sockets networking tcp mask subnet

假设我有一台带有两个以太网适配器的主机:

  1. LAN 适配器 - 连接到 LAN,自动获取 IP 地址。

  2. 设备适配器 - IP 地址为 192.168.10.1,子网掩码为 255.255.255.0。

我也有连接到设备适配器的硬件设备,它像 TCP/IP 服务器一样工作,并配置了 IP 地址 192.168.10.2,子网掩码 255.255.255.0。

我有以下愚蠢的规则来建立主机-设备通信:将两个子网掩码设置为 255.255.255.0,并定义仅最后一个组件不同的 IP 地址。没关系,它有效。

现在我正在阅读有关 TCP/IP 通信的整个理论 (www.tcpipguide.com)。如何根据网络、子网、掩码、路由等来描述我的案例?比如主机程序向192.168.10.2、1500端口发送UDP数据报,这个数据报是如何发送给设备的?做了哪些决定,哪些网络组件参与了数据报的传递?

最佳答案

网络掩码可以被认为是 IP 地址的位掩码。

如果 (address1 & netmask) == (address2 & netmask) 那么 2 个 ip 地址被认为在同一个子网上。 (这个表达式可以有很多不同的写法...)

网络掩码只是“虚拟”划分网络的一种方式:网络掩码不是 ip header 的一部分,也不会在线路上传输。除了设备本身,没有人知道网络上设备的网络掩码。它在设备的 tcp 堆栈内部使用,以做出一些基本的路由决策。请注意,还有其他方法可以定义子网,这些方法可能不涉及网络掩码但达到相同的结果:将多个设备分组到一个“虚拟”网络中。

插入设备的路由器甚至可能对同一设备具有不同的网络掩码定义:只要路由器正确路由数据包,这并不重要。网络掩码主要用于自动计算一些众所周知的地址:例如,用于udp广播数据包的广播地址是根据设备的IP地址及其网络掩码计算的。

在您的具体情况下:

没有物理路由器,但您的计算机是路由器(它在内部将数据包路由到不同的网络接口(interface))。你的计算机包含一个路由表,它告诉特定数据包应该使用哪个传出接口(interface)(在 Windows 上,尝试 route print,在 linux 上,作为 root,尝试 route) .

通常,路由表的设置使得数据包从与目标设备位于同一子网的接口(interface)发出。计算机在每个接口(interface)上使用上述逻辑表达式来确定目标是否与该接口(interface)位于同一子网上。如果表达式为真,则数据包发出。每个条目都有一个参数(称为度量),允许在可能存在多个路由的情况下选择看似最佳的接口(interface)。

你应该注意到路由表是动态的:它可以手动修改,添加一个特定的路由(例如,如果你知道一个特定的设备可以通过一个接口(interface)访问,但该设备的 IP 地址是与此接口(interface) ip 地址/网络掩码无关)。还有一些协议(protocol)(arp、dhcp...)用于广播路由信息的本地网络,这些信息由您的系统自动处理以修改路由表。

关于sockets - 在子网掩码和路由方面的主机设备通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575857/

相关文章:

java.net.SocketException : Unconnected sockets not implemented 异常

sockets - 如何监听 ICMP 数据包?

c - 使用阻塞 I/O 通过套接字读取所有可用字节

c - 与 iperf UDP 性能相比,UDP 吞吐量较低

c - 如何找出套接字的传输/接收字节数

java - linux后台进程

java - Log4j 记录到单独的文件

perl socket编程连续写入socket后的问题

linux - 在不修改应用程序的情况下将数据包重定向到用户空间 TCP 堆栈

c# - 用于 HTTP 基本身份验证的 UnityWebRequest 嵌入用户 + 密码数据在 Android 上不起作用