《TCP/IP详解 卷2:实现》 —3.4 ifaddr结构
3.4 ifaddr结构
我们要看的下一个结构是接口地址结构ifaddr,它显示在图3-15中。每个接口维护一个ifaddr结构的链表,因为一些数据链路(如以太网)支持多个协议。用一个独立的ifaddr结构描述每个分配给接口的地址,通常每个协议一个地址。支持多地址的另一个原因是很多协议(包括TCP/IP)支持为单个物理接口指派多个地址。虽然Net/3支持这个特性,但很多TCP/IP实现并不支持。
图3-15 结构ifaddr
217-219 结构ifaddr通过ifa_next把分配给一个接口的所有地址链接起来,它还包括一个指回接口的ifnet结构的指针ifa_ifp。图3-16显示了结构ifnet与ifaddr之间的关系。
220 ifa_addr指向接口的一个协议地址,而ifa_netmask指向一个位掩码,它用于选择ifa_addr中的网络部分。地址中表示网络部分的比特在掩码中被设置为1,地址中表示主机的部分被设置为0。两个地址都存放在sockaddr结构中(3.5节)。图3-38显示了一个地址及其掩码结构。对于IP地址,掩码选择IP地址中的网络和子网部分。
221-223 ifa_dstaddr(或它的别名ifa_broadaddr)指向一个点对点链路上的另一端的接口协议地址或指向一个广播网中分配给接口的广播地址(如以太网)。接口的ifnet结构中互斥的两个标志IFF_BROADCAST和IFF_POINTOPOINT (图3-7)指示接口的类型。
224-228 ifa_rtrequest、ifa_flags和ifa_metric支持接口的路由查找。
ifa_refcnt统计对结构ifaddr的引用。宏IFAFREE仅在引用计数降到0时才释放这个结构,例如,当地址被命令SIOCDIFADDR ioctl删除时。结构ifaddr使用引用计数是因为接口和路由数据结构共享这些结构。
如果有其他对ifaddr的引用,IFAFREE将计数器加1并返回。这是一个通用的方法,除了最后一个引用外,它避免了每次都调用一个函数的开销。如果是最后一个引用,IFAFREE调用函数ifafree来释放这个结构。
- 点赞
- 收藏
- 关注作者
评论(0)