学习TCP/IP(1):分类的Internet地址
一个互联网主机可由名字(Names), 地址(Address), 路由(Route)来进行标识。Shoch 是这样定义这三个术语的:
Names,即名字,标识这个对象是什么;
Address,即地址,标识它在哪里;
Route,即路由,指出如何到达哪里。
首先,让我们把互联网想象成由众多物理网络构成的大网络,每个物理网络有若干个主机。我们依次给物理网络编上号(即网络号),然后再给物理网络里的主机编上号(即主机号,注意,主机号是相对于物理网络而言的;比如说我们有两个物理网络,每个物理网络各有2台主机,那么第一个和第二个物理网络中包含的主机号都是1,2。并非1,2,3,4。)
这样组成的互联网地址就能分为网络号和主机号两部分,网络号标识了是哪个物理网络,主机号则指明了这个主机是这个物理网络的第几台主机。但请注意,IP地址并非唯一地标识互联网上的主机。事实上,存在一种特殊的多归属主机,这种主机具有1个以上的物理连接,同时归属于不同的物理网络,这个主机自然就拥有多个IP地址。最为典型的例子是路由器,路由器是用于连接两个或多个物理网络的设备。
在IPv4地址最初的分类(classful)编址方案中,IP地址(在本系列文章中若无特别说明IP地址均指IPv4地址,下同。)可分为如下5类:
ABC类地址
前3类可用于一般的网络编址,后两类有特殊用途。
类别 | 前导bit | 网络号部分 | 主机号部分 | 可容纳网络数 | 单网络可容纳主机数 | 点分十进制记法首位数字范围 |
---|---|---|---|---|---|---|
A类 | 0 | 7bits | 24bits | 27 | 224 | 0~127 |
B类 | 10 | 14bits | 16bits | 214 | 216 | 128~191 |
C类 | 110 | 21bits | 8bits | 221 | 28 | 192~223 |
D类地址
D类地址的前导bit为1110,是多播地址。点分十进制记法首位数字范围:224~239
E类地址
保留为今后用.点分十进制记法首位数字范围:240~255
特殊地址
网络地址和定向网络地址
按照约定,主机号全0的地址被用于指代网络本身。总而言之:
互联网地址可以用来指向单个主机,也可以用来指向网络。按照约定,主机号的所有比特都为0的地址是保留给该网络本身的。
受限广播地址(Limited Broadcast Address) 或本地网广播地址(Local Network Broadcast Address)
注: LBA和LNBA本质上是同一个地址,只是叫法不同而已.(不确定,待查证)
地址组成: 32比特位全1,点分十进制记法为255.255.255.255
用途:给本网段所有主机广播
全零地址
该地址用于下面的情况:(请参见DHCP协议,DHCP Wikipedia)
一个主机需要通信,但是该主机还没有一个有效的IP地址。于是它会用全零地址标示自己,给本地网广播地址(上述的全1地址)发送一个特殊的数据包,当接收方收到数据包之后,知道该主机还没有一个IP地址,就会发送一个特殊的数据包给该主机以分配给该主机一个有效的IP地址.
环回地址(loopback address)
环回(loopback)地址指网络前缀为127.0.0.0的所有地址,该地址用于测试TCPIP以及本地进程之间的通信。如果某个程序以该地址作为目的地址发送数据包,那么该数据包永远都不会通过网卡发送到任何网络上。此外,主机和路由器应该永远不为网络号为127.0.0.0的地址传播路由或可达性信息,它不是一个网络地址.
特殊地址小结
地址比特位组成 | 用途 |
---|---|
比特位全0 | 启动时的原站地址1 |
比特位全1 | 受限广播(本地网)2 |
主机位全1 | 对网络的定向广播2 |
主机位全0 | 对网络的受限广播2 |
127.0.0.0/8 | 环回地址3 |
注1:
1.永远不是有效的目的地址
2.永远不是有效的源地址
3.不应该在网络上出现
注2:对网络的定向广播区别于受限广播地址,虽然完成的功能类似,但是对网络的定向广播是针对于某一个网络而言的(通过指定网络号),该方式为网络通信提供了便利,但也存在一定的风险,出于安全考虑,大多数路由器和主机都配置为拒绝该类型的数据包.
注3:对网络的受限广播这个地址一般用于指代该网络本身.
IP地址的点分十进制记法
IP地址是一个4个八位组组成的32比特互联网地址。
注意,从技术上讲,术语“字节”是指一个硬件无关的字符大小;但是术语八位组在所有的计算机上都是指8个比特。
将IP地址写成以小数点分隔的4个十进制整数,即为IP地址的点分十进制记法。
例如:IP地址 127.0.0.1
用二进制表示就是:01111111 00000000 00000000 00000001
换成十进制就是2130706433。甚至你可以验证这是记法不同的同一个地址:
网络字节序
由于各个平台的字节序不同,所以TCPIP协议定义了一种网络标准字节序,英文叫Network Standard Byte Order.网络上发送的任何二进制字段都必须使用这些顺序。在主机或路由器发送数据之前,都必须将二进制数据项从本地字节序转换为网络字节序。在分组抵达目的站之后,再由网络字节序转换回本地字节序。这样就解决了不同主机对于字节序差异而导致的通信问题。
只有字段需要转换字节序。这些字段通常以整形或浮点数表示,若字节序错误会导致接收端解码出完全不一样的结果;用户自定义二进制数据则完全不用转换字节序。一方面,二进制数据是由应用程序定义的,对于TCPIP协议来说是完全透明的,另一方面,用户二进制数据是以字节为单位进行传输的,自然就没有字节序的问题。(当然,若你需要将整形数据之类的编码为二进制还是需要考虑字节序的)
网络标准字节序是大端表示法,即最高有效字节在最前面;而我们现在常用的x86架构处理器则是小端法表示:最低有效字节在最前面。
比如说x86表示的32位无符号数1用十六进制表示为:
01 00 00 00
转换到网络字节序就变成了:
00 00 00 01