目前在读卷二,中文版为主,英文版作为参考。也不知道读完之后效果如何。
第三章 接口层(这章我准备分两次看完)
根据卷一的说明,这层称为数据链路层或网络接口层。是Tcp/IP协议的最底层。
它提供以下支持:
接口函数;
统计与控制标志;
与设备无关的存储协议地址方法;
一个标准的输出分组的排队方法;
SNMP(简单的网络管理协议)
ifnet结构:结构ifnet中包括所有接口的通用信息,在系统初始化期间,分别为每个网络设备分配一个独立的ifnet结构。每个ifnet结构有一个列表,它包含这个设备一个或多个协议地址。
ifnet结构比较复杂,可将其分为下面五个部分:
实现信息;
硬件信息;
接口统计;
函数指针;
输出队列;
ifaddr结构:每个接口维护一个ifaddr结构的链表,因为一些数据链路支持多于1个的协议,一个单独的ifaddr结构描述每一个分配给接口的地址,通常是每个协议一个地址。(例如知名的ip协议的协议地址就是ip地址)
ifaddr结构的定义如下
-------------------------------------------------------------------if.h
struct ifaddr
{
struct ifaddr *ifa_next;
struct ifnet *ifa_ifp;
struct sockaddr *ifa_addr;
struct sockaddr *ifa_dstaddr;
#define ifa_broadaddr ifa_dstaddr
struct sockaddr *ifa_netmask;
void (*ifa_rtrequest) ();
u_short ifa_flags;
short ifa_refcnt;
int ifa_metric;
}
-----------------------------------------------------------------------if.h
sockaddr结构
一个接口的地址信息不仅仅是一个主机地址,
struct sockaddr{
u_char sa_len;
u_char sa-family;
char sa_data[14];
};
一共是十六个字节。sa_data定义为14字节的数组,但是当sockaddr结构覆盖更大的内存空间时,sa_data 可能会扩展到更大253字节。(这是C语言的一种通用技术,它允许程序员将结构中的最后一个成员看成是可变长的。??其实这句话我还是不是很理解,sockaddr结构什么时候覆盖更大的空间??)
存储在sa_data中的地址是一个传输地址,它包含足够信息来标识同一台主机的多个通信端点。
}