OSI模型
描述网络中各协议层的一般方法是国际标准化组织(ISO)的计算机通信开放系统互连(open systems interconnection,OSI)模型。这是一个七层模型,如图1.14所示,图中同时给出了与网际协议族的近似映射。
网络层由IPv4和IPv6协议处理。传输层可以选择TCP或UDP。图1.14中的网际协议族,在TCP与UDP之间留有一个间隙,指出应用程序可以绕过传输层而直接使用IPv4或IPv6。这称为原始套接口(raw·socket)。
OSI模型的上面三层合并成一层,称为应用层。这就是Web客户(浏览器)、Telnet客户.Web服务器、FTP服务器或其他应用进程所在的层。对于网际协议,OSI模型的上三层协议没什么区别。
套接口和XTI是上三层(应用层)到传输层的接口。
为什么套接口和XTI都提供OSI模型上三层与传输层的接口?
有两条理由,它们已标在图1.14的右侧。第一条理由是上三层处理应用程序(如,FTP,Telnet或HTTP)的细节,不大知道通信细节,下四层则不大知道应用程序,但能处理所有的通信细节;发送数据,等待确认,给无序到达的数据排序,计算与验证校验和等等。第二条理由是上三层通常形成用户进程,而下四层通常作为操作系统内核的一部分提供。Unix与其他现代操作系统都提供分隔用户进程与内核的机制。因此,在第4层和第5层之间的接口很自然成了应用程序编程接口(API)。
BSD发展史
网络拓扑发现
图1.16所用的网络拓扑,大多数Unix系统都有两个命令可用来了解网络细节:
netstat和ifconfig
下面举一些不同于图1.16系统的例子。通过阅读系统上这些命令的手册页面,就可以获悉有关它们的输出信息的详情.你还必须注意,有些厂商把这些命令存放于/sbin或/usr/sbin等管理目录,而不是普通目录/usr/bin,因此这些目录可能不在通常的shell搜索路径(PATH)中。
- netstat -i提供接口信息,也可用标志-n输出数值地址而不是试图找出网络名字。下面例子显示接口和它们的名字。
其中回馈(loopback)接口称为lo,以太网接口称为eth0。下面例子显示支持IPv6的一台主机的信息。
netstat-r输出路由表,这是另一种确定接口的方法。一般使用-n标志输出数值地址。本命令还输出缺省路由器的IP地址。
给定接口名字,执行ifconfig可获得每个接口的详细信息。
这里输出了IP地址、子网掩码和广播地址。MULTICAST标志通常指示主机支持多播。
查找本地网络中多个主机P地址的方法之一是针对广播地址执行ping命令。
64位体系结构
90年代中期到未期倾向于64位体系结构和64位软件。理由之一是进程内部可使用更大的编址长度(即64位指针),以允许进行大内存寻址(超过2字节)。已有的32位Unix系统上的一般编程模型称为ILP32模型,表示整数(I、长整数(L)和指针§都占用32位;64位Unix系统上最为流行的编程模型称为LP64模型,它表示长整数(L)和指针§都占用64位。
ANSIC创造了size_t的数据类型,它用于诸如malloc的参数(分配的字数),read和write的第三个参数(读或写的字节数)等地方。在32位系统中size_t是32位值,但在64位系统中它必须是64位的值,以发挥大寻址模型的优点。这意味着64位系统中也许含有把size_t定义为unsigned long 的typedef 语句。网络API的问题是Posix.1g 的某些草案说明,存放套接口地址结构大小的函数参数具有size_t的数据类型(如.bind和connect的第三个参数)。
同样,某些XTI结构也含有数据类型为long的成员(如,t_info和.t_opthdr结构)。当Unix系统从ILP32改变成LP64模型时,两者都将从32位的值变成64位的值。上述两例实际并不需要使用64位的数据类型:套接口地址结构的长度最多也不过是几百个字节,给XTI结构成员使用long数据类型也是错误的。
我们将见到的是创造新的数据类型来处理这些情况.套接口API使用socklent数据类型作为套接口地址结构的长度。XTI则使用t…scalar…t和t…uscalar…t数据类型。不把这些值由32位改为64位的理由是,这将使那些已在32位系统编译的应用程序的二进制代码兼容于新的64位系统。