Visual C++ 2017网络编程实战
上QQ阅读APP看书,第一时间看更新

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等。