写在前面
这是1969年10月29日的互联网。这一天的22点30分,在加州大学洛杉矶分校(UCLA)的计算机实验室,Leonard Kleinrock(伦纳德·克莱因洛克)教授发送了人类第一封互联网消息,跨越了数千公里,到达了西北部的斯坦福大学研究院(SRI)。
这条消息的内容是“LO”,含义是“登录”,是用来远程登录SRI计算机的命令。第一次发送时SRI的计算机崩溃了,导致发送失败,修复后第二次才成功登录SRI的远程计算机。至此,人类的互联网开始成型。
时间到了1978年,为了支持实时传输,人们发明了TCP/IP协议。TCP和IP协议的发明,被认为是全球互联网诞生的标志。
时间拨回到今天,当我们回顾互联网为何能发展如此飞速时,通信协议起到了至关重要的作用。下图是在谷歌搜索 who invented IP(谁发明了IP)时,弹出的第一个结果。
IP 协议的位置
IP 协议位于 OSI 七层协议的网络层上,与 IP 协议配套的还有 ARP、ICMP、IGMP。
ARP:地址解析协议,用于将IP地址转为机器 MAC 地址
ICMP:网际控制报文协议
IGMP:网际组管理协议
以前还有一个 RARP(逆地址解析协议),用来与 ARP 配套使用,但现在已经被废弃了。
全球 IP 地址资源如何分配?
RIR 的作用是管理世界上某特定地区的 Internet 资源( IP 地址和用于 BGP 路由中的自治系统号),根据地理位置划分为 5 个。
IANA 的作用是将 Internet 资源委托给 RIR,相当于世界管理员。
由于 IANA 和美国政府关联较大,后来的 ICANN 取代了 IANA 的工作。不过,ICANN 仍要遵循美国法律。
IP地址组成
IP 地址为 32 位的二进制数,由网络号和主机号组合而成。
IP 地址分为网络号和主机号有两个好处:
1)IP 地址管理机构(ICANN)在分配IP地址时只分配网络号,主机号由得到该网络号的单位自行分配,这样方便了对IP地址的管理;
2)路由器仅根据目的主机所连接的网络号来转发分组(而不考虑主机号),这样可以使路由表中的项目数大幅度减少,从而减小路由表的占用空间和查询路由表的时间。
路由器的每个接口都对应一个网络,也对应一个 IP 地址。
IPv4 地址表示与分类
由于 IPv4 地址有 32 位,就像这样下面的A类地址:
10000000 00001011 00000100 00011110
实在反人类,因此,为了方便表示,经常会将其转为<stron>格式。即每 8 位二进制转为十进制后,在后面加一个点,组成人类友好的格式。 </stron>
B类地址的地址空间有 230 地址,占整个 IP 地址空间的四分之一;
C类地址的地址空间有 229 地址,占整个 IP 地址空间的八分之一
A 类地址分配给政府机关单位;
B 类地址分配给中等规模的企业;
C 类地址分配给任何需要的人。
之所以这样划分,是因为不同组织的网络大小不同。政府机关的网络少,每个网络的主机却很多,因此不需要太多的网络号,在申请 IP 时就分配了 A 类 IP。
特殊 IPv4 地址
实际使用 IP 地址过程中,有部分 IP 地址有特殊含义,可见下表。其中,定向广播地址和直接广播地址的区别是:
定向广播只在本网络进行广播,各路由器均不转发;
直接广播是对指定网络号中的所有主机进行广播。
IP 地址的编址方式有哪些?
上面说到的 IP 地址分类实际是 IP 地址编码的一种方式。历史上,IP 地址的编址方式经历了三个阶段:
1)分类的 IP 地址:这是最基本的编址方法,在 1981 年通过了相应的标准协议;
2)子网划分:这是对最基本的编址方法的改进,1985 年通过了它的标准 RFC 950;
3)无类别域间路由(CIDR):这是比较新的无分类编址方式,1993 年提出后很快就得到了推广应用。最新的 IPv6 沿用了 CIDR,本质上也是通过增加子网数量实现更多的编址。
下面主要介绍第二种方式:子网划分,它是CIDR的基础,而CIDR将在下一节谈到。
第一阶段的分类IP地址格式为{网络号,主机号},子网划分的IP地址格式变为{网络号,子网号,主机号}。
当没有划分子网时,IP地址是两级结构,划分子网后IP地址变成了三级结构。划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。
以下图的张家村第一代为例,网络和路由器只能识别到网络号和主机号,一个网络内的所有主机网络号都相同,主机平等。但凡网络144.14.0.0上的路由器R1在收到外来的数据报后,再根据数据报的目的IP地址把它转发到相应的主机。
下面是张家村的第二代,网络和路由器不仅可以识别网络号和主机号,还能识别子网号。但凡网络144.14.0.0上的路由器R1在收到外来的数据报后,再根据数据报的目的IP地址把它转发到相应的子网。
对于张家村第二代,我们直到路由器R1会将抵达的数据报发往对应的子网,那么路由器是怎么知道的呢?答案是路由表中的子网掩码!
子网掩码是一串1和一串0的组合,长度等于IP地址长度。对于两级IP地址,子网掩码由16位1和16位0组成;对于三级IP地址,子网掩码由24位1和8位0组成。如下图所示。
那路由器如何利用子网掩码查找子网的呢?
路由器的路由表结构如下图绿表,其中,前两个字段"目的网络地址"和"下一跳地址"用于路由器之间的分组转发,而"子网掩码"用于最后一个路由器转发到目的主机时,计算目的网络子网的作用。
当一个目的地址为144.14.3.1的IP数据报抵达目的主机所属网络的路由器R1时,路由器找到路由表中对应记录后,将IP地址与子网掩码做与(AND)操作,可以得到目的主机所在的子网地址。知道了主机所在目的网络,又知道了其所在的子网,路由器R1自然能将抵达的数据报发往对应的子网2,即图中的张良家。
当一个目的地址为144.14.5.1的IP数据报抵达目的主机所属网络的路由器R1时,路由器找到路由表中对应记录后,将IP地址与子网掩码做与(AND)操作,可以得到目的主机所在的子网地址。知道了主机所在目的网络,又知道了其所在的子网,路由器R1自然能将抵达的数据报发往对应的子网3,即图中的张飞家。
当在路由表中有不止一个匹配结果时,会从匹配结果中选择具有最长网络前缀的路由。另外,当一个网络不划分子网的时候,路由表中将采用默认的子网掩码。将该默认子网掩码与IP地址相与,也能得到对应的目的网络地址。
-
A类地址的默认子网掩码是255.0.0.0;
-
B类地址的默认子网掩码是255.255.0.0;
- C类地址的默认子网掩码是255.255.255.0。
下面的理解可能跟一些书和博客上的说法不同,但原理本质上是一样的,只是角度不同。有些书上会分路由器从网络外看和从网络内看。
注意!默认子网掩码可以和子网掩码共存,二者的定位不相同。默认子网掩码用于确定目的网络地址,而子网掩码用于确定目的网络内的子网地址。
1)每当分组抵达路由器,路由器首先将默认子网掩码与分组内目的IP地址做"与"操作,如果结果等于路由器所在的目的网络地址,那么将直接交付,否则将分组转给其它路由器;
2)确定了直接交付,接着考虑目的网络地址划分子网的可能。因此将路由表中的子网掩码与IP地址做"与"操作,结果即为子网地址,分组直接交付给目的网络地址的子网。当然了,如果没有划分子网,那运算结果也是目的网络地址,同样是直接交付。
3)如果是间接交付,路由器将默认子网掩码与IP相与后,结果(比如144.0.0.0)可能包含了其它多个路由器的目的网络地址(比如144.1.0.0,144.2.0.0)。这时候也应该用子网掩码与IP相与,再将新的结果与其它路由器的目的网络地址比较。
IPv4 如何缓解地址耗尽?
IPv4 是 32 位二进制,因此仅能提供 42.9 亿个IP位置,而 2018 年,全球上网人数已达 40.21 亿,加上各类设备都要用到 IP,IPv4 早已枯竭。
而 IPv6 的推广较为缓慢,为了临时缓解 IPv4 地址紧张的问题,采用了两种目前广泛使用的措施:网络地址转换(NAT)和无分类域间地址(CIDR)。
网络地址转换(NAT)
NAT 的典型应用就是家用局域网和公司内网,比如 192.xxx.xxx.xxx 就是典型的内网地址,在访问外网时需要经过路由器进行 IP 地址转换。它的原理是将一整块内网通过一个公IP连接互联网,通常是经过路由器转换,因此不需要为每个内网主机申请一个 IPv4 地址。
NAT主要分为 基本网络地址转换(Basic NAT)和 网络地址端口转换(NAPT)。后者应用较为广泛,详细的分类参见下图。
Basic NAT 要求每一个当前连接都要对应一个公网 IP 地址,一对一的通信。但它不允许端口映射,因此无法做到多台主机共享一个公网 IP 地址,因此基本不用。
NAPT 允许地址映射和端口映射,因此允许多个主机共享一个公网 IP 地址。
当内网 IP 节点发起对外请求时,其内网 IP 地址会被重写为路由器的对外 IP,比如下面的 10.11.12.1,并发给公网 IP 节点;
当外网 IP 节点返回请求时,经过路由器时,会根据先前的连接记录,定向转发给内网主机。因此,路由器要维护一个带有 IP 和端口的映射表。
网络地址转换(NAT)有几种穿透策略?
NAT穿透即允许哪些IP进入内网。穿透策略分为穿透方式和穿透协议,
穿透策略:应用层网关、探针技术、中间件技术、中继代理技术、特定协议穿透。
穿透协议:RTMFP、STUN/TURN、ICE。
NAT 可以用于缓解 IPv4 地址不足的窘境,在目前的 IPv4 网络中有广泛应用。但是 IPv6 的地址空间非常充足,因此 IPv6 的网络不需要 NAT。
无分类域间地址(CIDR)
CIDR 是一个用于 IP 地址分配的有效方法,适用于 IPv4 和 IPv6。技术实现上,CIDR 是基于可变长子网掩码(VLSM)来进行任意长度的前缀分配的,它的应用主要为大型企业网络。
CIDR 的格式是在 IP 地址后加一个斜杠和表示前缀位数的数字。如 1.1.1.1/5 表示IP地址的前 5 位是网络号。与子网掩码类似,不过它的掩码是可变长度的。
子网掩码的概念
子网掩码一共有32位,被分为连续的两部分,高位部分的每一位都被设为二进制的1,表示 IP 地址的网络部分,其余部分的每一位均被设为二进制的0。
CIDR 对 IP 地址的分配过程如下:
如下图所示,208.130.29.33 是一个网站:www.freesoft.org 的 IPv4 地址,这个 IP 的分配遵循了 CIDR 的分配流畅。
-
最初,前 11 位子网掩码所属的全部 IP 地址资源属于某组织 A ,组织 A 将其子网掩码进一步扩大到 22 位, 剩下的 IP 地址(10 位的地址资源)资源分配给组织 B;
-
组织 B 将其子网掩码继续扩大到 24 位,剩余的 IP 地址(8 位的地址资源)资源分配给组织 C;
-
最后组织 C 将其子网掩码扩大到第 32 位,此时就只有一个 IP,即 208.130.29.33 ,然后将这个 IP 分配给 freesoft 网站。
可以看出,CIDR 分配 IP 的方式是通过改变子网掩码的长度,从而改变网络号和主机号的位数,进而达到分配不同子网和主机的目的。它跟之前 IPv4 分为五类的方式不同,后者非常粗糙,目前大多采用 CIDR 的方式分配 IP。
MAC 地址(硬件地址)
下图是某路由器标签上的MAC地址,图源自维基百科。
MAC地址又称为硬件地址,MAC地址用于在网络中唯一标示一个网卡。因此一台主机是可以有多个MAC地址的,比如有多个网卡。
MAC地址一共48位(即6个字节),以十六进制表示。第1位为广播地址(0)/群播地址(1),第2位为广域地址(0)/区域地址(1)。前3~24位由IEEE决定如何分配给每一家制造商,且不重复,后24位由实际生产该网络设备的厂商自行指定且不重复。
MAC地址也有特殊地址,比如 ff:ff:ff:ff:ff:ff 作为广播地址,01:xx:xx:xx:xx:xx是多播地址,01:00:5e:xx:xx:xx是IPv4多播地址。
在实际使用中,MAC地址的位置处于数据链路层,在MAC帧的头部会存在MAC源地址和目的地址,这对主机间的路由非常重要。数据链路帧(MAC帧)格式如下,MAC地址就放在 MAC 帧的头部。
IP 地址和 MAC 地址的关系
IP 地址是看不见摸不着的,位于网络的"云"中,是一种逻辑概念。
要想理解这种抽象概念,最熟悉的例子莫过于我们在操作电脑的时候,鼠标点一点画面就会变化,而其中的底层实现对我们用户来说是完全不感知的,这种抽象就非常有用。
路由器等网络连接设备的每个接口都有不同的 IP 和 MAC 地址,比如下图中的"土"字形。
IP 数据报传输过程有几个关于地址的误区,需要澄清下:
1)IP 数据报的源地址和目的地址在传播过程中是不变的,而 MAC 帧头部的源 MAC 地址和目的 MAC 地址则是变化的;
2)IP 数据报中的源地址作用不大,路由器是根据目的地址做路由转发的;
3)IP 数据报传输过程中,从底层 MAC 帧到上层 IP 数据报会“脱衣服”(剥离 MAC 头部和尾部),而从上到下则是在“穿衣服”。
其实,由于全世界存在各种各样的网络,它们可能使用不同的硬件地址,这些异构网络之间的通信就得解决复杂的硬件地址转换工作。而这些工作都是由主机自行完成的,要知道,MAC帧到达每个节点的MAC地址都会变化,因此硬件地址的转换工作可能会非常麻烦。
而使用抽象的IP地址,互联网上的主机便只需要拥有一个唯一的IP地址,主机与主机是平等的,就像在一个大网络中一样,它们之间通信的地址也会变得简单。具体的IP到MAC地址的转换在通信中对上层是不感知的,使得上层应用能更专注于通信内容本身,而非地址的转换。
ARP(地址解析协议)
ARP协议看起来很像一个函数,输入为 IP 地址,输出为硬件地址。
ARP的原理在于维护一张 IP 地址到硬件地址的映射表,而且这张表还得动态更新。而这张表就放在每台主机的ARP高速缓存中。
IPv4 数据报格式
上面讲了IP数据报会携带地址和数据等信息,用于在网络中传输数据,那么对它的格式就有必要仔细了解。其中有个字段很有意思:生存时间。它给出了IP数据报在互联网中所能经过的最大路由器数,可防止IP数据报在互联网中无限制地兜圈子。
聊完了 IP 数据报的格式,就到了它如何传输的问题了。这一过程由网络层和数据链路层共同负责,下面会深入浅出的介绍。
IP 层转发数据报的过程
IP数据报的分组转发特别像我们平时的问路!假设你人在国际大都市,刚下机场,想去大学城中著名的国际语言大学,但是手机没电了,用不了地图,只能问路人们。每到一个街头,你都得找一个路人问接下来怎么走,这里的"你"就是IP数据报,路人就是一个个的路由器。
国际大都市自然有各个国家的人,你遇到的第一位是英国女郎,她先用肢体语言向你比划方向,然后在纸上用英语写下这句话:“往前直走一百米往右转,你将会看到一家超市”,你跟着她的指示到达超市门口后;
遇到第二位路人,是位日本高中生,她先用肢体语言向你比划方向,然后在纸上用日语写下这句话:“往前直走三百米,向左转,你将会看到一家日料店”;
到了日料店,遇到了第三位路人,是位法国模特,她先用肢体语言向你比划方向,然后在纸上用法语写下这句话:“往前走五百米,遇到红绿灯后往右转,继续走五百米,你将会看到一家LV专柜店”;
到了LV线下店,遇到了第四位路人,是位阿拉伯妇女,她先用肢体语言向你比划方向,然后在纸上用阿拉伯语写下这句话:“往前走七百米,然后左转,遇到一个岔路口再往右转,你将看到一家希尔顿酒店”;
到了希尔顿酒店,遇到了最后一位路人,是位中国小姐姐,她说已经到国际语言大学不远了,于是边比划边带你走到国际语言大学的门口。
从问路的例子中,我们可以发现,互联网中的分组转发,强调的是IP数据报从一个路由器转发到下一个路由器。因此,我们并不关心某个网络的具体拓扑,也不关心网络内的任何主机。
知识储备:
为了减小路由表所占用的空间,同时为了减小搜索路由表所用的时间,路由表的格式采用:(目的网络地址,下一跳IP地址)。而目的网络地址是唯一不变的,可以从目的IP地址中全网唯一的网络号看出来!
上面问路的例子中,每个路由器的路由表如下。值得注意的是最后一个路由器的路由表,不是(目的网络地址,下一跳IP地址),而是(目的网络地址,直接交付)。因为最后一个路由器并不需要转发给其它路由器,只需要将IP数据报直接交付给目的网络的目的主机即可,就像中国小姐姐(最后一个路由器)会直接带你(IP数据报)到国际语言大学的门口(目的主机)一样。
在实际使用中,直接交付会被记作 0.0.0.0,即(目的网络地址,0.0.0.0)。
因此,在IP数据报分组转发的过程中,查找路由表、使用ARP得到MAC地址、将MAC地址写入MAC帧的首部这三个操作会重复执行,直至分组转发到目的主机。对应的路由算法也早被计算机科学家写出来了。
这里有两个容易误解的问题:
1)在从路由表查出下一跳路由器IP地址后,不写入IP数据报的原因是:为了保持目的网络地址的不变。因此每到一个路由器,都能根据不变的目的网络地址,找到下一跳的IP地址。
IPv6 组成与表示
早在 1990 年,人们就意识到 IPv4 资源将在不久的将来耗尽,ITEF 也开始着手规划 IPv6,且于 1998 年开始推广。但由于早期的路由器、***、企业的企业资源计划系统等相关应用程序都依赖于 IPv4,因此目前仍以双架构并存居多。
IPv6 与IPv4 的最大区别是采用了128位的地址,从而拥有比 IPv4 大得多的编码地址空间,这个天文数字在可预期的未来是不会用尽的。
由于地址空间实在太大,IPv6 也不再依赖 网络地址转换(NAT),也没有分类 IP的说法,但仍旧保留了目前流行的 CIDR(无类别域间路由)。
在表现形式上,IPv6 地址由两个逻辑部分组成:一个 64 位的网络号和一个 64 位的主机号。主机号通常由物理地址(MAC地址)自动生成,称为 EUI-64 。
为了方便表示 128 位的 IPv6,通常将其每 16 位拆分为一组,并以十六进制表示。即冒号十六进制计法。
上图是一个 IPv6 地址的转换图,值得注意的是,IPv6 允许用双冒号::表示一组0或多组连续的0,但只能出现一次。因此 fe80:0000:0000:0000:74f9:1af5:79ca:ea98 可以表示为 fe80::74f9:1af5:79ca:ea98。
IPv6 地址分为几种?
IPv6 地址可分为三种:单播地址、任播地址 和 多播地址。每种地址都有对应的格式。
单播地址:单播地址表示特定的某个目标地址,从而在来源和目的地间直接进行通信,属于一对一通信。单播地址包括可聚类的全球单播地址、链路本地地址等。其中,链路本地地址的 IPv6 格式为:fe80::主机号/10。
任播地址:任播会有一组接收节点的地址列表,但指定为任播的数据包,只会发送给距离最近或发送成本最低(根据路由表来判断)的其中一个接收地址。
当该接收地址收到数据包并进行回应,且加入后续的传输。该接收列表的其他节点,会知道某个节点地址已经回应了,它们就不再加入后续的传输作业。
多播地址:多播就是群发,其 IPv6 地址的前缀是 ff00。请求端在数据包中指定一个多播目标地址列表,通过路由器发给每个节点地址。
注意多播和广播的差别:多播是发给目标地址列表的所有节点,而广播是发给所有的节点。
IPv6 数据包
我们知道,IPv4的数据单元被称为数据报,而IPv6的数据单元被称为分组,不过它们之间经常可以混用。IP数据报在整个OSI分层结构中的位置如下图所示,可以看出不同层次的消息间关系。
IPv6数据报由两大部分组成:基本首部+有效载荷。有效载荷又分为扩展首部+数据部分。可以看出基本结构和IPv4差别不大。
IPv4 和 IPv6 地址分配的区别?
IPv4 和 IPv6 的地址分配稍有不同,IPv4可以通过静态分配或动态分配方式获取 IP 地址;而 IPv6 主要通过无状态地址自动配置(SLAAC)获取IP地址。
IPv4
IPv4 的静态分配时通过主机硬件/软件的配置永久分配给主机的;动态分配是通过网络使用 DHCP(动态主机配置协议)分配的,在现代的台式计算机操作系统中,默认情况下会启用动态IP地址分配。
对于动态分配的方式,计算机在连接网络之前是没有IP地址的,只有接通网络的那一瞬间,IP地址才会被分配给当前节点主机。比如我本地断开网络连接后,用 ipconfig 显示都是断开连接。
DHCP 分配的地址是有租期的,如果主机在到期前未能续订租约,当前的 IP 地址将被分配给其它主机。某些 DHCP 实现会在主机每次加入网络时根据其 MAC 地址尝试将相同的 IP 地址重新分配给该主机。网络管理员可以通过基于 MAC 地址分配特定的IP地址来配置 DHCP。
IPv6
IPv6 的主机连接到 IPv6 网络上时,可以使用邻居发现协议对自身自动配置。这个过程称为 无状态地址自动配置(SLAAC)。
IPv4 到 IPv6 的过渡方案有哪些?
要知道IPv4网络的规模相当大,不可能一夜之间将互联网的地址全部更改为IPv6,只能通过一种逐步演进的方式。同时,新安装的IPv6网络必须能够向前兼容,能够识别和转发IPv4数据报。目前广泛使用的两种过渡方案为:双协议栈、隧道技术。
双协议栈的原理是,某些主机(包括路由器)同时具备IPv4和IPv6地址,在与IPv6目的主机通信时采用IPv6地址,而在与IPv4目的地址通信时则采用IPv4地址。这里有个问题,双协议栈的主机如何知道目的主机采用哪一种地址?答案是域名系统DNS。当DNS给双协议栈源主机的返回为IPv6地址时,双协议栈源主机就使用IPv6地址,反之亦然。
在IPv4和IPv6的转换中,会存在IPv6部分首部无法丢失的问题,并且不可避免。
如下图所示,路由器B不能向C转发IPv6数据报,因为C采用的是IPv4协议。因此,路由器B会将IPv6数据报首部地址转为IPv4首部地址后,发送给C。
同理,当IPv4数据报途径D到达E时,路由器E通过域名系统查到下一个节点采用IPv6协议,不能将IPv4数据报发送它。因此E将IPv6数据报首部地址转为IPv4地址后发送给IPv6主机F。在IPv6->IPv4->IPv6的过程中,数据报的首部有部分字段会缺失,这是双协议栈的缺点之一。
隧道技术
隧道技术的原理比较形象,它是在IPv6数据报进入IPv4网络前,将IPv6数据报包装为IPv4数据报。这样,IPv6数据报就成为IPv4数据报的数据部分了。
这种裹挟了IPv6数据报的IPv4数据报(很绕口)在IPv4网络中畅通无阻。直到离开IPv4网络后,再将IPv4数据报的外衣剥离,露出内部的IPv6数据报。下面是隧道技术的原理图,其中的“隧道”箭头就很明显。
好了,手已经很酸,就先写-到这里了。如果觉得不错,欢迎<stron>,我会更有动力写更多更好的技术文章。谢谢~ </stron>
全部评论
(0) 回帖