5.2 协议簇和地址簇
协议簇就是不同协议的集合。在Windows中,用宏来表示不同的协议簇,这个宏的形式是以PF_开头的,比如IPv4协议簇为PF_INET,PF的意思是PROTOCOL FAMILY。在WinSock2.h中定义了不同协议的宏定义:
/* * Protocol families, same as address families for now. */ #define PF_UNSPEC AF_UNSPEC #define PF_UNIX AF_UNIX #define PF_INET AF_INET #define PF_IMPLINK AF_IMPLINK #define PF_PUP AF_PUP #define PF_CHAOS AF_CHAOS #define PF_NS AF_NS #define PF_IPX AF_IPX #define PF_ISO AF_ISO #define PF_OSI AF_OSI #define PF_ECMA AF_ECMA #define PF_DATAKIT AF_DATAKIT #define PF_CCITT AF_CCITT #define PF_SNA AF_SNA #define PF_DECnet AF_DECnet #define PF_DLI AF_DLI #define PF_LAT AF_LAT #define PF_HYLINK AF_HYLINK #define PF_APPLETALK AF_APPLETALK #define PF_VOICEVIEW AF_VOICEVIEW #define PF_FIREFOX AF_FIREFOX #define PF_UNKNOWN1 AF_UNKNOWN1 #define PF_BAN AF_BAN #define PF_ATM AF_ATM #define PF_INET6 AF_INET6
大家可以看到,各个协议宏由定义成了以AF_开头的宏,那么以AF_开头的宏又是哪路神仙呢?其实,它就是地址簇的宏定义。地址簇就是一个协议簇所使用的地址集合(不同的网络协议所使用的网络地址是不同的),也是用宏来表示不同的地址簇,这个宏的形式是以AF_开头的,比如IP地址簇为AF_INET,AF的意思是ADDRESS FAMILY。在ws2def.h中定义了不同地址簇的宏定义:
#define AF_UNSPEC 0 // unspecified #define AF_UNIX 1 // local to host (pipes, portals) #define AF_INET 2 // internetwork: UDP, TCP, etc. #define AF_IMPLINK 3 // arpanet imp addresses #define AF_PUP 4 // pup protocols: e.g. BSP #define AF_CHAOS 5 // mit CHAOS protocols #define AF_NS 6 // XEROX NS protocols #define AF_IPX AF_NS // IPX protocols: IPX, SPX, etc. #define AF_ISO 7 // ISO protocols #define AF_OSI AF_ISO // OSI is ISO #define AF_ECMA 8 // european computer manufacturers #define AF_DATAKIT 9 // datakit protocols #define AF_CCITT 10 // CCITT protocols, X.25 etc #define AF_SNA 11 // IBM SNA #define AF_DECnet 12 // DECnet #define AF_DLI 13 // Direct data link interface #define AF_LAT 14 // LAT #define AF_HYLINK 15 // NSC Hyperchannel #define AF_APPLETALK 16 // AppleTalk #define AF_NETBIOS 17 // NetBios-style addresses #define AF_VOICEVIEW 18 // VoiceView #define AF_FIREFOX 19 // Protocols from Firefox #define AF_UNKNOWN1 20 // Somebody is using this! #define AF_BAN 21 // Banyan #define AF_ATM 22 // Native ATM Services #define AF_INET6 23 // Internetwork Version 6 #define AF_CLUSTER 24 // Microsoft Wolfpack #define AF_12844 25 // IEEE 1284.4 WG AF #define AF_IRDA 26 // IrDA #define AF_NETDES 28 // Network Designers OSI & gateway
现在,地址簇和协议簇的值其实是一样的,说到底都是用来标识不同的一套协议。那为何会有两套东西呢?在很早以前,UNIX有两种风格的系统,即BSD系统和POSIX系统:对于BSD,一直用的是AF_;对于POSIX,一直用的是PF_。Windows作为晚辈,不敢得罪两位“大哥”,所以索性都支持它们了,这样两位“大哥”的一些应用软件稍加修改就都可以在Windows上编译了,说到底就是为了兼容。
既然这里说到“大哥”,必须雁过留名,否则就是不尊重,毕竟都是网络编程界的前辈。很早以前,Bell实验室的Ken Thompson开始利用一台闲置的 PDP-7计算机开发了一种多用户、多任务操作系统。很快,Dennis Richie加入了这个项目,在他们共同努力下诞生了最早的UNIX。Richie受一个更早的项目—MULTICS的启发,将此操作系统命名为UNIX。早期UNIX是用汇编语言编写的,但其第三个版本用一种崭新的编程语言C重新设计了。C是Richie设计出来并用于编写操作系统的程序语言。通过这次重新编写,UNIX得以移植到更为强大的DEC PDP-11/45与11/70计算机上运行。后来发生的一切,正如他们所说,已经成为历史。UNIX从实验室走出来并成为操作系统的主流,现在几乎每个主要的计算机厂商都有其自有版本的UNIX。随着UNIX成长,后来占领了市场,公司多了,懂的人也多了,就分家了。后来UNIX太多太乱,大家编程接口甚至命令都不一样了,为了规范大家的使用和开发,就出现了POSIX标准。典型的POSIX标准的UNIX实现有Solaris、AIX等。
BSD代表“Berkeley Software Distribution,伯克利软件套件”,是20世纪70年代加州大学伯克利分校对贝尔实验室UNIX进行一系列修改后的版本,最终发展成一个完整的操作系统,有着自己的一套标准。现在,有多个不同的BSD分支,并且“BSD”并不特指任何一个BSD衍生版本,而是类UNIX操作系统中的一个分支总称,典型的代表就是FreeBSD、NetBSD、OpenBSD等。