《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构
第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址。连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址。
路由器(见 IP 协议 一章)转发是用 IP 地址来识别流量去向的。IP 在某些方面与电话号码相似。但大多数用户不需要记住一位位的数字,而是被 DNS 屏蔽在视线之外。当用户自建网络或 DNS 失效,就需要直接处理 IP 地址。
当一台设备被连接到全球性的 Internet 时,分配 IP 地址需要经过协调。这项工作由一个管理实体来帮助用户和服务提供商来分配地址。个人用户一般向 Internet 服务提供商(ISP)支付费用,由 ISP 分配地址,用户获得地址以及路由。
IP 地址表示
IPv4
- 点分四组(点分十进制)表示法。
例如 165.195.130.107
。四个用点分隔的十进制。每个数字是范围 [0, 255] 的整数,代表 8 个 bit。即每个数字是 IP 地址的四分之一,使用简便的十进制表示。完整的 IP 地址是 32 位。
IPv6
地址长度 128 位,是 IPv4 的 4 倍。写法是 8 个块,一个块是 4 个 16 进制数。例如:5f05:2000:80ad:5800:0058:0800:2023:1d71
- 一个块的前导零可以不写。
5f05:2000:80ad:5800:58:800:2023:1d71
- 全零块可以省略,用符号
::
代替。但为了避免出现歧义,这个符号只能在一个地址中用一次。例如2001:0db8:0:0:0:0:0:2
可以写成:2001:db8::2
- IPv6 的低 32 位经常用 IPv4 的点分四组表示法,表示 IPv4 兼容的 IPv6 地址。
以上规则带来的灵活性,但要规避不必要的混淆,有如下规则:
- 前导零必须压缩。
::
用于压缩最多的零,如果多个连续块包含等长度的零,则顺序靠前的用::
替换。- 十六进制 a - f 用小写。
IP 地址结构
大多数 IPv4 最终被细分到一个地址,用于识别连接 Internet 或某些专用内联网的计算机网络接口。这种地址叫单播地址。其他类型包括广播、组播、任播地址,还有其他的特殊类型的地址。
分类寻址
每个单播 IP 地址都有一个网络号(Network ID),标识该接口使用的地址在哪个网络中可以被发现。还有一个主机地址(host ID),标识由网络号给出的网络中的特定主机。
- 最初的地址划分方法有五大类,主要是由地址中的头几位来定义:
类 | 开头 | 网络号 | 主机号 |
---|---|---|---|
A类 | 0 | 8位,除去开头一个1(下同),其余7位自由 | 24位 |
B类 | 10 | 16位,14位自由 | 16位 |
C类 | 110 | 24位,21位自由 | 8位 |
D类 | 1110 | 组播地址 | 32位,28位自由 |
E类 | 1111 | 保留 | 32位,28位自由 |
类 | 地址范围 | 用途 | 网络数 | 主机数 |
---|---|---|---|---|
A | 0.0.0.0 ~ 127.255.255.255 | 单播/特殊 | 128 | 16777216 |
B | 128.0.0.0 ~ 191.255.255.255 | 单播/特殊 | 16384 | 65536 |
C | 192.0.0.0 ~ 223.255.255.255 | 单播/特殊 | 2097152 | 256 |
D | 224.0.0.0 ~ 239.255.255.255 | 组播 | N/A | N/A |
E | 240.0.0.0 ~ 255.255.255.255 | 保留 | N/A | N/A |
可以看出来 A 类的网络数比较少,但主机数非常多。C 类相反。从这里就可以看到,这种固定的网络地址分类,固定的网络数和主机数势必会让分配 IP 地址产生困难,协调很不方便。A 类容易浪费很多主机号,而 C 类不能提供足够的主机号。B 类地址比较折中,但很快就会耗尽。
上述数字并不是准确的。例如,对于一个子网来说,第一个地址(主机号全为0)一般用来表示这个子网。最后一个地址(主机号全为 1)用来将数据报广播给该子网的所有主机。
子网寻址
针对之前的分配新网段的网络号的棘手问题,人们很自然想到一种方式,在一个站点接入 Internet 之后,为其分配一个网络号,站点管理员再进一步划分本地子网数。很重要的一点是:Internet 的其余部分依然只看得到 A、B、C 类部分。而对于站点本身,进一步进行更加精细的分配。,这种方法叫做子网寻址(subneting)【RFC0950】。子网寻址为 IP 地址结构增加了额外的灵活性,没有增加地址的真实长度。借此,站点管理员可以在子网数和每个子网的预期主机数中寻找一个折中。
图是一个 B 类地址被划分子网的例子。一个基础地址在站点内部进一步划分为一个子网号和一个主机号。这个 B 类地址使用 8 位作为子网 ID,这样,这个特殊配置的站点允许 256 个子网,每个子网最多包含 254 个主机。
站点之中的所有路由器和主机需要确定地址中的子网部分和主机部分。而 Internet 其他部分仍将其作为普通的 B 类地址看待。IP 协议中的 IP 转发操作,路由器需要区分网络中的不同子网,这需要额外的配置参数,具体例子看 CIDR 和聚合。
子网掩码
子网掩码(mask)用于确定一台主机对应的 IP 地址中的网络和子网信息。
- 子网掩码中,设为 1 的部分,表示 IP 地址中对应的部分表示子网部分。设为 0 的部分,表示对应的是主机部分。
长度与 IP 地址相同。配置方法可以是静态的(路由器中),也可以是动态的(DHCP)。写法可以是点分十进制。也可以用一种容易记忆的前缀长度写法:斜杠带上连续的 1 的个数。
例如 子网掩码:255.255.255.192
可以写成 /27
广播地址
主机部分所有位置设置为 1。
例如,对于子网 128.32.1.0/24
,广播地址就是 128.32.1.255
,这种广播作为一个单播包通过路由器到达子网后,再作为广播数据报发送给子网中的所有主机。从安全的角度来说,定向广播至今仍在 Internet 中被禁用。
特殊用途地址 255.255.255.255
称为本地网络广播,将被连接在同一网络中的计算机收到,除非终端主机明确禁用。这种本地广播不会经过路由器。广播地址经常出现在协议中,例如 UDP、ICMP。
IPv6 没有任何广播地址,仅使用组播地址。
CIDR 和聚合
使用子网掩码稍微缓解了连入 Internet 的设备增多的痛苦后(隔靴搔痒),Internet 立马又面临了更严重的两个问题:
- IP 地址的耗尽。主要是 B 类地址。
- 路由表条目的不断增长。由于每个网络号需要对应一条,随着规模不断增长,路由性能要受到严重影响。
- A、B、C类的划分方法太固定,因此效率低下。
下面介绍解决方案:CIDR 和聚合
前缀
分类寻址方案由子网掩码采取了一个类似于可变长度子网掩码的概念(可将不同长度的子网掩码用于相同的网络号),叫做 CIDR(classless interdomain routing,无类别域间路由)
- 提供一种方便的连续分配地址范围的方式。不只是单个 B 类或多个 C 类网络号可以分配给站点,使用 CIDR,任何未经过预定义的地址范围都可以作为一个类的一部分,只需要一个类似于子网掩码的掩码,称为 CIDR 掩码。
- CIDR 掩码不像 subnetting mask 只对一个站点局限,而对全球路由系统都是可见的。
- 网络号和 CIDR 掩码的数字组合称为网络前缀(prefixes)
- 消除 IP 地址中网络和主机号的分隔定义,将更细粒度的 IP 地址分配范围成为可能。
- 前缀 n 的范围是 0~32 (IPv4),追加在 IP 地址后,跟着一个 / 字符。
- 例如 C 类网络号 192.125.3.0 写成前缀形式:
192.125.3.0/24
。A 类和 B 类网络号用前缀/8
和/16
表示。
更精细地分配 IP 地址的例子:
192.32.136.0/21
min address:11000000 00100000 10001000 00000001
mask: 11111111 11111111 11111--- --------
IP prefix: 11000000 00100000 10001--- --------
max address:11000000 00100000 10001111 11111110
8 C networks: 192.32.136.0/24 to 192.32.143.0/24
通过使用前缀,分配 192.32.136.0/21 相当于分配了 8 个 C 类地址
- 可以看到,CIDR 允许根据对地址空间的不同需求,将不同大小的地址块分配给某个组织。
聚合
路由器要找出一个跨网段的数据报往哪发送,具体就是找到一条匹配的路由表条目,然后将其中的“下一跳”作为目的地,将包发送出去。
CIDR 能分配各种尺寸的地址块,但没解决路由表不断增长的问题。接下来这个聚合(Aggregation)方法解决了这个问题。
先举一个简单的例子 :
一家公司分配到以下后缀为 /24 的四个连续网络号。
在路由器上,四个网络中通常都使用相同的出口,
可以进行 CIDR 聚合,以减少路由表的数量。
128.56.24.0/24; 10000000 00111000 00011000 00000000
128.56.25.0/24; 10000000 00111000 00011001 00000000
128.56.26.0/24; 10000000 00111000 00011010 00000000
128.56.27.0/24. 10000000 00111000 00011011 00000000
进行按位与 &
128.56.24.0/22 10000000 00111000 00011000 00000000
用聚合的思想,最后一行代替路由表中的 4 个条目
以这个前缀开头的任何目的地都将显示这个下一跳,只需要一个条目就足够。
- 聚合的方法是对两个 IP 地址进行按位与。
- 分层路由思想:
- 路由聚合思想。相邻的多个 IP 地址前缀合并成同一个短前缀,以覆盖更多地址空间。
- 这个行为是递归的。即使越来越多的路由器加入整个网络拓扑,这个良好的属性也会保持不变。
例如某台路由器的路由表中有三个条目:
190.154.27.0/26 10111110 10011010 00011011 00000000 …… entry 1
190.154.27.64/26 10111110 10011010 00011011 01000000 …… entry 2
190.154.27.192/26 10111110 10011010 00011011 11000000 …… entry 3
entry 1 与 entry 2 合并(按位与 &)结果:
190.154.27.0/25 10111110 10011010 00011011 00000000 …… entry 4
entry 3 目前不能合并,因为并不是相联的 IP 地址。
此时路由表中新加入了一个条目:
190.154.27.128/26 10111110 10011010 00011011 10000000 …… entry 5
entry 5 可与 entry 3 合并,因为是相邻的:
190.154.27.192/26 10111110 10011010 00011011 11000000 …… entry 3
结果:
190.154.27.128/25 10111110 10011010 00011011 10000000 …… entry 6
此时,entry 6 就可与 entry 4 合并了:
190.154.27.0/25 10111110 10011010 00011011 00000000 …… entry 4
190.154.27.128/25 10111110 10011010 00011011 10000000 …… entry 6
结果:
190.154.27.0/24 10111110 10011010 00011011 00000000
当在路由表条目中又遇到了相邻的 C类地址(递归):
190.154.26.0/24 10111110 10011010 00011010 00000000
又可以合并成:
190.154.26.0/23 10111110 10011010 00011010 00000000
…………
- 可以说 CIDR 开发和部署是 Internet 核心路由系统的一个根本性变化,CIDR 成功地为分配地址空间提供了更多灵活性,聚合提升路由的可扩展性
- IPv6 在 20世纪 90年代受到重视,这是出于很快就需要更多地址的想法。当时没有预见的是,NAT 的广泛使用显著推迟了 IPv6 的使用。
- 但是,由于可用于路由的 IP 地址数量最终将减少到 0 ,因此未来将会出现一些变化。
IP转发行动:
简单的例题:
路由器在其路由表中具有以下CIDR条目:
地址 / 掩码 下一跳
128.56.24.0/22 interface 0
128.56.60.0/22 interface 1
default router 2
数据包的IP地址为 128.56.63.10。 路由器的转发行为是什么?
128.56.63.10 and mask 22 bits
IP address = 10000000 00111000 01111111 00001010
Mask = 11111111 11111111 11111100 00000000
By Per-bit &
Prefix = 10000000 00111000 01111100 00000000
result: 128.56.60
路由器表查找和匹配,应该去 interface 1
最长前缀匹配 Longest Prefix Match
当路由器的 IP 层需要向下一跳发送数据包时,检查目的 IP 地址,执行 最长前缀匹配 Longest Prefix Match。 IP 协议中的一个重要内容。
因为使用了 CIDR ,对于一个给定的 IP 地址,可以有多个条目匹配。
- 匹配是指:目的 IP 地址与掩码按位与之后,和转发条目中的目的地字段值相同。
数据包必须使用最具体、最匹配的那条路由。
- 最匹配就是在所有匹配的条目中,掩码中 1 最多的那个条目。
考虑下面这个IPv4的路由表:
192.168.0.0/16
192.168.20.16/28
在要查找地址192.168.20.19的时候,这两个表项都“匹配”。
192.168.20.19 = 11000000 10101000 00010100 00010011
匹配过程1:
dst IP = 11000000 10101000 00010100 00010011
mask 16bit = 11111111 11111111 00000000 00000000
per-bit and = 11000000 10101000 00000000 00000000
192.168.0.0 = 11000000 10101000 00000000 00000000 match!!
匹配过程2:
dst IP = 11000000 10101000 00010100 00010011
mask 28bit = 11111111 11111111 11111111 11110000
per-bit and = 11000000 10101000 00010100 00010000
192.168.20.16 = 11000000 10101000 00010100 00010000 match!!
也就是说,两个表项都包含着要查找的地址。
这种情况下,前缀最长的路由就是192.168.20.16/28,因为它的子网掩码(/28)比其他表项的掩码(/16)要长,使得它更加明确。
特殊用途地址
不全部列举:
地址 | 用途 |
---|---|
0.0.0.0/8 | 本地网络中的主机 |
10.0.0.0/8 | 专用网络、内联网的地址,不会出现在公共 Internet 中 |
192.168.0.0/16 | 同上 |
224.0.0.0/4 | 组播地址 |
255.255.255.255/32 | 本地网络受限广播地址 |
专用地址空间管理由本地决定,在家庭网络、企业内部网络很常见,与此相关的话题是 NAT(网络地址转换)。
分配
IP 地址被分为大的块,这由一些权威机构完成。权威机构是为各种“所有者”分配地址空间的组织。所有者就是 ISP 或其他较小的权威机构。
IANA:the Internet Assigned Number Authority 互联网数字分配机构,将分配权限分配给几个地区性 Internet 注册机构(RIR),它们未一些国家的小型机构、ISP 分配地址空间。ISP再给自己的客户提供地址空间。
单播地址分配
- 最简单的 Internet 服务:DSL 连接到 Internet,分配一个暂时的 IP 地址到 PPP 链路的一端。
- 家庭局域网、无线局域网,使用一台路由器或一台主机作为路由器连接 Internet,执行 NAT。从 ISP 的角度来看,只有一个 IP 地址被使用。大部分操作是自动的 (DHCP)
- 多个网络地址:需要固定的 IP,多个局域网、需要网络管理员确定需要多少地址、怎么划分子网、内外网(防火墙、NAT)
组播
- 用到在写
《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构的更多相关文章
- 【TCP/IP详解 卷一:协议】第二章:链路层
2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...
- tcp/ip详解 卷1 -- 协议概述
第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...
- 《TCP/IP详解 卷1:协议》读书笔记
第一章 概述 协议栈 应用层 HTTP,FTP 运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层 帧(Frame) 物理 ...
- 【TCP/IP详解 卷一:协议】第一章概论 学习笔记
第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...
- TCP/IP详解 卷1 第十九章 TCP的交互数据流
19.1 引言 成块数据:比如ftp.电子邮件.Usenet新闻 交互数据:Telnet.Rlogin 成块数据的报文段基本上都是满长度(full-size)的,而交互数据小的多(Telnet和Rlo ...
- 《TCP/IP详解卷1:协议》第1章 概述-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第2章 链路层-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第3章 IP:网际协议(2)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
- 《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
随机推荐
- 高并发面试必问:分布式消息系统Kafka简介
转载:https://blog.csdn.net/caisini_vc/article/details/48007297 Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成 ...
- C++实现tar包解析
tar(tape archive)是Unix和类Unix系统上文件打包工具,可以将多个文件合并为一个文件,使用tar工具打出来的包称为tar包.一般打包后的文件名后缀为".tar" ...
- 1997: [Hnoi2010]Planar
1997: [Hnoi2010]Planar 链接 分析: 首先在给定的那个环上考虑进行操作,如果环内有有两条边相交,那么可以把其中的一条放到环的外面去.所以转换为2-sat问题. 像这样,由于1-4 ...
- Java虚拟机笔记(四):垃圾收集器
前言 前一篇文章介绍了内存的垃圾收集算法,现在介绍下内存回收的具体实现--垃圾收集器. 由于Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集 ...
- Direct2D处理几何图形之间的碰撞检测(上)
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D中支持以下几种类型的几何图形: a.简单几何图形(Simple Geometry):矩形.圆角矩 ...
- C# 通用树形数据结构
前言 树在图论中是一种重要的图,由于其自身的许多特殊性质,也是一种重要的计算机数据结构,在很多地方都有用.但是这些树大多都是作为其他应用的内部数据结构来使用.我们无法了解这些树的详细信息,而 .Net ...
- python图像处理(1)图像的打开与保存
使用python进行图像处理时有三种库可以使用分别是:PIL.matplotlib.pyplot.opencv(opencv未接触) 注意:matplotlib读取进来的图片是unit8,0-255范 ...
- python包管理工具pip
你可以使用一个名为 pip 的程序来安装.升级和移除软件包.默认情况下 pip 将从 Python Package Index <https://pypi.org> 安装软件包.你可以在浏 ...
- [Codeforces-888C] - K-Dominant Character
C. K-Dominant Character time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Appium 安装详细版教程
1.安装Appium Python Client包 输入命令 pip install Appium-Python-Client
- 【TCP/IP详解 卷一:协议】第二章:链路层
- 用到在写