前言
本章讲述网际协议(IP)。第1章讨论到,要通过 Winock 建立通信,必须了解如何针对特定协议(已在第1中以IPv4为例作了说明)为工作站寻址本章要讨论IP4 和IPV6,第4 章将叙述 Windows平台上最常见的协议。
IPv4 是一种用于Internet 的网络协议,已经广为人知。IP 可广泛用于人多数计算机操价系统上也可用于大多数局域网(LAN,例如办公室小型网络)和广域网(WAN,例如Internet)。
随着Interet中计算机数量的爆炸式增长,IPv4 的局限性越来越明显。自然而然地,下一代IP 被开发出来,称为IPv6
。
本将讨论IPv4 及IPv6 的背景、寻址方案、名称解析及 Winsock 细节。然后讨论怎样编写在两个版本的 IP中都能够无缝运行的应用程序。
3.1 IPv4
IPv4 由美国国防部ARPA(Advanced Research Project Agency,高级研究计划局)开发,该局在20世纪 60 年代建立了一个试验性的数据包开关网络。最初的网络协议很麻烦,这致使在 70 年代中期开发出了一种较好的协议。这项研究最终不仅发展到 TCP,还进一步发展到 IPv4。
3.1.1 寻址
IPv4 中,计算机都分配有–个 IP 地址,IP 地址用一个32 位数来表示,式的称呼是“IP4 地业”。IPv4 地址通常表示为点分上进制格式,地址中的每8位字节被转换为一个十进制数值,并由句点分隔。
IPv4 地址被分为几个种类,分别描述地址被分配到网络的部分及分配到端点的部分。表3.1 列出了各种不同的种类。
指定·个I 地址时,表明网络部分位数的数字可以在反斜线““后附加到点分十进制地址后边例如,地址 172.31.28.120/16 表明,地址的前面 6 位数字组成了地址的网络部分。这相当于使255.255.0.0子网掩码起到的作用。
表3.1 中的最后两项是IPv4 地址的特殊种类。D 类地址是为P4 多播预的, 类地为试验性地址。另外,有几块地址是为专门用途预留的,不能被 Intermt 中的系统使用,这些地址如下所示
- 10.0.0.0-10.255.255.255(10.0.0.0/8)
- 172.16.0.0-172.31.255.255(172.16.0.0/12)
- 192.168.0.0-192.168.255.255(192.168.0.0/16)
最后,还有一个环回地址(127.0.0.1),该地址为特殊地址
,指向本地计算机。
要列出分配给本地接口的IP4 地址,可以使用 IPCONFIC.EXE 命令,该命令用来列出每个网络适配器及其分配到的 IPv4 地址。如果应用程序需要通过编程获取 IP4 地址的列表,可以使用SIO ADDRBSS LIST QUERY 命调用 WSAIoctl 函数,这在第7章有所叙述。另外,IP 助手API提供这个函数,这在第 16 章中叙述。
我们已讨论了 IP4v 地址空闻的细分类,在这些互不相同的地址种类中,又有3 种类型的PV4地址;
- 单播
- 多播
- 广播。
随后的几个小节将对每种类型的地址展开叙述。
3.1.1.1 单播
分配到单个计算机接口上的地址称为单播地址
。该地址仪可以分配到一个接口上。如果网络上其他计算机也配置了该地址,就会发生错误,导致数据的错误传输。A、B、C3 类地址成 IPV4 的单地址空间。
一般说来,为主机上的接口分配 IPv4(单播)地址时,要么静态地配置,要么由配置协议分配,例如用DHCP(Dynamic Host Confguration Protocol,动态主机配置协议)。如果不能访 DHCP 服务器则系统将使用APIPA(Automatic PrivateP Addressing,自动专用卫导址)自动分配一个169.254.0.0/16范围内的地址
为了避免记忆大量的IP 址,可以使用DNS(Domain Name System,域名系统)
将IP4 地址和主机计算机名称相关联。稍后将讨论如何将主机名称解析为其 Pv4 地址(以及其 Pv6 地址)。
3.1.1.2 多播(组播)
多播地址未被分配到某个特定接1。相反,多个计算机可以“加入”一个多播组,监听某个特定的多播地址。加入该组的每个计算机都将收到发往该多播地址的任何数据。多播地址是D 类地址。多播最大的一个好处是,能够将多播数据仅传送到对该数据感兴趣的那些计算机。IP 多播将在第 9 章详细讨论。
3.1.1.3 广播
IPv4 支持数广播。这意味着发送到受限广播地址 255.255.255.255 的广播数据将被局城网内的每个计算机接收并处。因为即使是那些对广播数据不感兴趣的计算机,也必须处理数据包,所以通常认为这种做法不好。
如果应用程序需要进行广播,最好使用子网直接广播的方式。这种方式也是广播数据,但顾名思义,这种方式仅将数据直接广播到某个特定子网内的计算机。例如,发送到172.31.28.255 的一个数据报将只被同一个子网内的计算机接收到。
拓展
组播和广播常常用于服务发现协议,比如ssdp协议。而airplay协议, dlna协议等都有不同程度上实现类似组播和广播的功能
3.1.2 IPv4 管理协议(ARP,ICMP,IGMP)
IPv4 需要依赖几个其他的协议才能实现其功能。其中我们感兴趣的3 个支持协议为:
- ARP(Address Resolution Protocol,地址解析协议)、
- ICMP(Intemet Control Message Protocol,Internet 控制消息协议)
- IGMP(Internet Group Management Protocol,Intemnet 组管理协议)。
ARP
ARP 用来将一个32 IPv4 地址解为一个物理地址或地址,使得IPv4 数据能够被包装在适当的媒体帧(如以太网)中。在线路上发送数据之前,主机必须将下个跃点的 IP4 地址解析为对应的硬件地址。如果目标地址位于局域网内,则 ARP 请求将针对目的地的物地址。如果一个或多个路由器将源和目的地分离开来,则 ARP 请求将针对缺省网关,数据包也将发往该网关。第 16章叙述的IP 助手 API包含了一些 ARP例程。
简单说,查路由表,把IP地址解析为MAC地址。
RARP协议则是MAC地址转为IP
ICMP
设计 ICMP 的目的是为了在IPv4 主机之间发送状态信息和错误信息。
信息类型包括回应请求和答复、目标不可抵达以及超时。
ICMP 也被用来搜寻邻近路由器。第 11 将对ICMP 展开详细讨论并说明如何发送ICMP 信息。
IGMP
IGMP 用来管理多播组的成员。土机上的应用程序加入多播组后,土机就会向外发送IGMP 成报表,通知该网络段的路由器,应该由哪些多播组来接收数据。路由器需要这种信息,以伴将发往这些多播组的数据包向前发送一-如果某网络段有对该数据感兴趣的接收者,则发往该网络段,否则不
以上就是今天要讲的内容,本文仅仅简单介绍了linux命令行的使用。
3.1.3 Winsock 中的IPv4 寻址
在Winsock中,应用程序通过 SOCKADDR IN结构来指定IPv4 地址和服务端口信息,该结构的定义为:
struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zerol8]; }
子段必须设为 AP_INET,以告知 Winsock 我们此时正在使用IP 地址族。sin port 字段定义了用来标识服务器服务的 TCP 或UDP 通信端口。应注意到,口号其实没有应用到IPV4 协议中而是封装在 IPv4 头内的传输层协议(如TCP UDP)的一个属性。
因为有些可用端口号是为已知的服务(例如 FTP 和 HTTP)保留的,所以应用程序选择端口时,必须特别小心。已知服务使用的端口是由IANA(Internet Assigned Numbers Authority,Internet 编号授权委员会)分配的,这些端口列举在网页 http://www.ianaorg/assignments/port-numbers 上。实质上,端口号分为下述3类:已知的、已注册的、动态和(或)专用端口。
- 0-1023:由ANA控制,为已知服务所保留。
- 1024~49151:由IANA 列出的已注册端口,中普通用户执行
的普通用户进程或程序可以使用这些端口。 - 49152~65 535:动态和(或)专用端口。普通用户应用程序应在1024-49151 范围内选用已注册端口,以避免可能使用其他应用程序或系统服务正在使用的端口。因为IANA 没有在49152-65 535 范围内的端口上注册服务,所以这些端口也可随意使用。
如果使用 API 函数 bind 时,应用程序绑定到了主机上另一个应用程序正在使用的端口上,则系统将返回 Winsock 出错信息 WSAEADDRINUSE。另外,即使没有显式地绑定到一个本地地址和端口上,客户机的发送或连接操作也会有效。在这种情况下,系统将把套接字隐式地绑定到1024~5000 范围内的一个本地端口上。如果应用程序显式地绑定套接字,但指定一个为0 的本地端口时,系统也会采取同样的行为。
SOCKADDR_IN 结构的 sin_addr 字段用于把 Ipv4 地址保存为4字节的以网络宁节顺序排列的数值,它是一个无符号长整数的数据类型。根据不同的用法,这个字段还可表示一个本地或远程 IP 地址。IP 地址一般是用“Internet 标准点分表示法”像“a.b.cd”一样指定的,其中每个字母代表一个字节数,并从左到右分配了一个4字节的无符号长整数。最后一个字段 sin_zero,只起到充当填充项的作用以使 SOCKADDR IN 结构和 SOCKADDR 结构的长度一样。
这个套接字及其他套接字地址的结构中,所有字段都得按照网络子节顺序排列。然而,如果应片程序使用本章稍后将讨论到的名称解析和分配的 API,则所需的排序转换将自动实行,当应用程序从结构成员中显式地分配或获取数值时,才需要进行字节排序转换。字节排序已在第 1 章中进行了介绍。
3.2 IPv6
随着 Internet 中计算机数量的爆炸式增长,IPy4 的局限性越来越明显。首先,可用 IPV4 地址的数月不断地被消耗掉,这就导致了NAT(network addrcss translators,网络地址转换器)的使用。NAT将多个专用地址映射到单个的公共 IP 地址上。对客户机一服务器应用程序而言,NAT 是有用的,不过九连接两个使用与用地址公间的组织时,NAT 就能会出现问题。另外,有时 NAT 必须注意到下层协议,以便执行适当的地址转换
其次,IPv4寻址并非完全分等级的,这意味着 Internet 中枢路由器必须保留大量的路由表,以便将IPy4 数据包正确地发送到Internet 中任何地点。
开发 IPv6 的另一个诱因,是为了提供更简单的配置过程。用IPv4 时,地址必须被静态地分配或通过配置协议如 DHCP 进行分配。比较想的情况是,主机不必依赖 DHCP 结构的管,而应该能基于其所在的网络段对自身进行自动配置。
Windows XP提供了 IPv6的 developer-release 版本。对于Windows 2000,可以从http://www.microsoft.com/ipv6 下载IPv6协议的技术预览版。对于Windows NT 4.0,也可从该网址获取“微软研究IPv6 协议”。
本节将讨论IPv6 地址的不同类型、IPY6 使用的支持协议,以及IPv6 地址在 Wsock 中是被如何处理的。尽管我们将讨论寻址和名称解析,但并不会涉及 PV6 的所有方面,如并没有讲述路由和建立IPv6网络。要了解更多的信息请查阅 Windows XP 联机帮助或Joseph Davies 的著作《UnderstandingIPv6》(微软出版社,2002)
3.2.1 寻址
IPv4 和IPv6之间最显著的区别是,IPv6 地址是128位的,其大小是IPy4 地址的四倍。使用这样大的地址空间,中·个原因是需要将可用地址细分为一个路由域体系。路由域反映了 Inlernet 的布局。表 3.2 列出了地址空间的部分分配方法,同时也给出了每个部分的地址前级。地址前缓指示了 IPV6地址的高阶位。IPv6 寻址在 RFC2373 有所叙述。
典型的 IPv6 地址由 16 字节分段表示,显示为冒号分隔的十六进制数。
下面是一个 IPV6 地址不例:
21DN:00D3:0000:2F3B:02AA:OUFF:FE28:9C5A
每个 16 位块内部前面的零都可以去掉,如下所示:
21DA:D3:0:2F3B:2AA:FF:FE28:9CSA
很多IPv6地址包含一长中零,可以压缩这些零块,用两个冒号代替。
例如,下述地址:
FE80:0:0:0:12:0:34:56
可以压缩为:
FE80::12:0:34:56
注意,只有单个邻近的一系列 16 位零块小可以压缩。
根据所在平台的不同,可以使用两种方江来获取分配到一个让算机上各个接口的 IPV6 地址列表从网上下载的“微软研究”及 Windows 2000 技术预览版,以及Windows XP 家庭版和 Wndows XP专业版,都使用IPV6 EXE 命令。
要列举IPv6 接口,在启动命令行提示符之后执行IPV6.EXE 即可对所有版本的 Windows 2000 和 Windows XP(包括未来的 Windows)版本,以使用 NETSHEXE令,这个命令的语法为:“NETSHEXE 接口 IPV6 显示接口”。要编程获取本地接的配置,可以使用I/0 控制命令 SIO ADDRESS LIST QUERY(第7章)及IP 助手API第 16 章)
IPv6 地址有3 种基本类型:
- 单播
- 任播
- 多播。
应注意到,IPv6 并未定义广播地址(而是使用多播)。
随后的儿个小节将讨论每种地址类型。
3.2.1.1 单播
单播地址标识单个接口。然而,对于 IPv6 而言,一个接口往往分配有多个单播地址。一般会遇到下列 4 种单播地址:
- 链接——本地地址(link-local)
- 站点——本地地址(site-local)
- 全球地址(global-address)
- 兼容地址
链接——本地地址(link-local)
每个接口始终分配有一个链接一个地址一每个物理网络接口都自动配置了,一个这样的地址链接一本地地址用来仅和在一个链接上的节点通信,并总是以 fe80::/64 为前级。另外,由于链接本地地址未持有路由信息,所以接口索引经常和地址一起显示。系统中的每个物理接口都分配到一个适配器索引号(也叫范围 ID),当链接一地地址破分配到某个口时,链接号会被附加到该地址后边。
下面的地址就是分配到物理适配器的一个链接——本地地址,该适配器的接口索引号为 5
fe80::250:8bff:fea0:92ed5
在 Winsock 中,如果使用链接——本地地址建立了一个连接,则必须给出接口索引,以指明从那个链接可以访问远程机。IPv6 链接——本地地址和本前面讨论的 IPV4 APIPA 地同义
站点——本地地址(地点——本地地址)(site-local)
例如,考虑具有链接一本地地址 fe80::250:tt:tea0:92ed35的主机A与具有链接——本地地址fe80::250:daff:fc3:9e3%4 的主机B如果主机A发出,一个到主机B 的连接,则它会将自己的能够到达主机 B 的范用ID 和B 的标地址一起使用。即要连接的址是: 80::250:daffec3:9e34%5
IPv6 地址中,只有在本地网络环境中才能抵达地点一本地地址,例如在一个特定地点的公司网中。因为不能从其他地点或 Internet 中访问这些地址,而且专用网络中的路器不会将通信转发到本地地点之外,所以它们和 Pv4 用地址空间相似。地点一本地地址使用 fec0.:/48 作为前,必须用IPv6 路由器或通过 DHCPv6 进行分配。目前,微软实的 IPv6 还支持 DHCPV6。支持IPV6的路由器将发送 RA(Router Advetisement,路由器告)信息,这些信息将公布该地址的网络部分(例如,地址的前 64 位由 48 位地点一前级与 16 网D成),然后机这些信息把地点——本地地址分配给接收到 RA 的接口。
全球地址
全球地址就足在 IPv6 互联网中都可访问的地址。该地址以 001 始,前 64 的其61 位用来建立路由体系,后 64 位组成接口的标识符,用以性一标识子网中的网络接口。今球地址也通过路占器广告或使用 DHCPv6 进行分配。