网络协议-网络层协议-IP协议
⽹络协议-⽹络层协议-IP协议
宽带上⽹是如何实现的
⽹络层是 TCP/IP 的⼼脏,主要负责终端节点之间的通信,把⽹络包从源主机发送到⽬标主机,所以这种通信也叫点对点的通信。这⼀层主要包含两个协议:IP 协议和 ICMP 协议,我们先来介绍 IP 协议。
⽹络层的作⽤
我们上⼀篇介绍的数据链路层只能在同⼀种数据链路上的节点之间进⾏通信,⽽⼀旦跨越多种数据链路,就需要借助⽹络层才能通信,⽹络层可以跨越不同的数据链路,实现两个节点之间的数据包传递,⽽这些不同的数据链路通常通过路由器来连接:
或者简单来说,在局域⽹内部需要数据链路层进⾏通信,⽽不同的局域⽹之间(互联⽹其实就是将多个不同的局域⽹连接起来实现互联)需要借助⽹络层才能通信,完整的计算机⽹络需要借助这两个分层才能最终完成通信。
IP地址
在计算机⽹络通信中,为了识别通信对端,需要⼀个类似于地址的识别码对节点进⾏标识,就好⽐⼀
个⼈需要门牌号⼀样,MAC 地址⽤于标识同⼀链路上的不同计算机,⽽⽹络层⽤于表⽰地址信息的是 IP 地址。
IP 地址⽤于在连接到⽹络的所有主机中识别出进⾏通信的⽬标地址,因此,在 TCP/IP 中所有主机或路由器必须设定⾃⼰的 IP 地址。IP 地址是 TCP/IP 通信的基⽯。
公⽹ IP 与私有 IP
起初,互联⽹中任何⼀台主机和路由器都必须配置⼀个唯⼀的 IP 地址,然⽽,随着互联⽹的发展,IP 地址不⾜的问题⽇趋显著,于是就有了⼀种新技术,它要求不为每⼀台主机或路由器分配⼀个固定的 IP 地址,⽽是在必要的时候只为相应数量的设备分配唯⼀的 IP 地址。
尤其对那些没有连接到互联⽹的独⽴⽹络中的主机,只要保证在这个⽹络内地址唯⼀,可以不⽤考虑互联⽹即可配置相应的 IP 地址。不过,即使两个独⽴⽹络各⾃随意设置 IP 地址,也可能会出问题,⽐如两个独⽴⽹络互连时地址冲突,或者由于某种原因,需要连接到互联⽹,于是⼜出现了私有⽹络的 IP 地址,它的范围如下:
包含在这个范围内的 IP 地址都属于私有 IP,⽽在此之外的 IP 地址称为全局 IP,也叫公⽹ IP。
私有 IP 最早没有准备连接互联⽹,⽽只⽤于互联⽹之外的独⽴⽹络,不过当⼀种能够互换私有 IP 与
公⽹ IP 的 NAT 技术诞⽣以后,配有私有地址的主机与配有全局地址的互联⽹主机实现了通信。
现在,每个学校、公司、家庭内部采⽤的正是在每个终端设置私有 IP 地址,在路由器或必要的服务器上设置公⽹ IP 地址,配置私有 IP 地址的主机连⽹时,通过 NAT 进⾏通信。美国的文化
公⽹ IP 地址基本要在整个互联⽹内保持唯⼀,但私有 IP 地址不需要,只要在同⼀个域内保持唯⼀即可。在不同的域内出现相同的私有 IP 地址不影响使⽤。
家⽤宽带上⽹实现
有了上⾯的知识储备,想必你已经对我们平时公司、学校、家庭如何实现宽带上⽹有些眉⽬了,下⾯学院君就来给⼤家捋⼀下。
在世界范围内,全局 IP 地址由 ICANN(互联⽹名称与数字地址配置机构)管理,在中国,由其下属 CNNIC 这个机构负责分配国内的公⽹ IP 地址分配。
在互联⽹⼴泛商⽤之前,⽤户需要直接向 CNNIC 申请公⽹ IP 地址才能上⽹,随着 ISP(互联⽹服务提供商,⽐如电信、联通、移动、华数)的出现,在向 ISP 申请接⼊互联⽹的同时还会申请公⽹ IP 地址,这种情况下,ISP 其实充当了⽤户与 CNNIC 之间的代理。
对于 FTTH(光纤到户)和 ADSL 宽带服务(⽬前⽐较常见的两种宽带服务),⽹络服务提供商会直接给⽤户分配公⽹ IP 地址,并且每次⽤户重新连接互联⽹时,该 IP 地址都可能发⽣变化,这时的 IP 地址由提供商维护,不需要⽤户⾃⾏申请。当然这个公⽹ IP 地址是分配到路由器上的。
⽽我们通过有线或⽆线⽅式连接到路由器的计算机和⼿机的 IP 地址,则是由 DHCP 动态分配的私有 IP 地址。关于 DHCP 动态分配 IP 地址我们后⾯会单独介绍。
现在,⼀般只有在需要固定 IP 的情况下才需要申请公⽹ IP 地址,⽐如服务器、云主机等托管⽹站的主机节点。
好了,有了上⾯的介绍,想必你应该对笔记本、台式机等计算机终端以及⼿机如何通过 IP 地址连接上互联⽹进⾏通信有了⽐较清楚的了解了吧,当然,这还只是⼀个⽐较感性的了解,我们继续从技术层⾯来理性分析基于 IP 协议的⽹络层通信是如何实现的。
IP 地址详解
我们将深⼊探讨 IP 地址的格式、组成、分类、⼴播以及⼦⽹掩码等技术细节。
IP 地址的格式
IP 地址⽬前分为 IPv4 和 IPv6 两种类型,⽬前主流的还是 IPv4 地址,后⾯的分享也主要基于 IPv4。秋分诗句
在计算机内部,IPv4 地址由 32 位⼆进制数字表⽰,为了⽅便⼈类识别,通常将其按照 8 位⼀组,分为 4 组,每组⽤ . 分隔,并将每组内的⼆进制数转化为⼗进制数,这样就有了我们常见的 IP 地址(IPv4)格式:
同时,这也是⼀个私有 IP 地址。
注:后⾯的分享中,我们默认约定 IP 地址就是代指 IPv4 地址。
IP 地址⼀般配置在⽹卡上,⼀般⼀块主机⽹卡会配置⼀个 IP 地址(也可以配置多个),⽽⼀台路由器通常会配置两块以上的⽹卡(因为路由器连接的是两个⽹段):
IP 地址的组成
IP 地址由⽹络标识(⽹络地址)和主机标识(主机地址)两部分组成。
⽹络地址⽤于标识节点所属的数据链路,⼀般不同的局域⽹之间⽹络地址必须不同,⽽同⼀个局域⽹内的主机必须有相同的⽹络地址;主机地址则⽤于标识同⼀个局域⽹内的不同主机,它们的主机地址不能重复。这样综合起来,我们就可以通过设置⽹络地址和主机地址来确保在相互连接的⽹络中每个节点的 IP 地址都不会重复。
以上⾯图⽰的 IP 地址为例,192.168.31 是⽹络地址,218 则是主机地址。起初,我们通过 IP 地址分类来区分⽹络地址和主机地址,现在通常通过⼦⽹掩码区分它们。下⾯我们就分别来介绍下 IP 地址分类和⼦⽹掩码。
IP 地址的分类
按照⽹络层次和规划的⼦⽹⼤⼩,通常将 IP 地址分为以下4类:
A 类地址:⾸位以 0 开头,第 1-8 位是⽹络地址,后24位是主机地址,0.0.0.0~127.0.0.0 是 A 类的⽹络地址,可容纳 16777214(224-2)个主机地址;
B 类地址:前两位以 10 开头,第 1-16 位是⽹络地址,后 16 位是主机地址,128.0.0.0~191.255.0.0 是 B 类的⽹络地址,可容纳 65534(216-2) 个主机地址;
C 类地址:前三位以 110 开头,第 1-24 位是⽹络地址,后 8 位是主机地址,192.168.0.0~239.255.255.0 是 C 类的⽹络地址,可容纳 254(28-2) 个主机地址;
D 类地址:前四位以 1110 开头,第 1-32 位是⽹络地址,没有主机地址,224.0.0.0~239.255.255.255 是 D 类的⽹络地址,常⽤于多播;
要⽤⽐特位标识主机地址时,不可以全部为 0 或 1,因为全部为 0 只有在表⽰对应的⽹络地址或 IP 地址不可获知的情况下才⽤,⽽全部为 1 的主机地址通常作为⼴播地址。因此,在分配的时候,要去掉这两种情况(这就是为什么上⾯都做了-2的处理)。
⼦⽹掩码
很显然,如果以上⾯ A、B、C 三类来划分⼦⽹的话,存在着 IP 地址的浪费,全世界 IP 地址的上限是 43 亿(2的32次⽅),如果按照 A 类来划分,全世界只能划分出 128 个⼦⽹(2的7次⽅),这显然不够;如果是办公室、学校这样的局域⽹来说,B 类地址的主机承载容量显得太⼤;如果是在家庭这种⼩型的局域⽹,即使是 C 类地址都有着极⼤的浪费。
因此,为了解决上述问题,我们通过⼀种叫做「⼦⽹掩码」的识别码将⼦⽹⽹络地址细分为⽐ A、B、C 类粒度更⼩的⽹络。这种⽅式会将原来的 A、B、C 类主机地址的⼀部分也作为⽹络地址,从⽽让 IP 地址的⽹络地址和主机地址不再受限于 IP 地址的分类,将原有⽹络划分为更多的⼦⽹。
引⼊⼦⽹以后,原始的 IP 地址就要通过两部分来识别,⼀种是 IP 地址本⾝,⼀种是标识⽹络地址部分的⼦⽹掩码:
⼦⽹掩码和 IP 地址⼀样也是由 32 位⼆进制数表⽰,格式和 IP 地址类似,只不过其对应 IP 地址⽹络
地址部分的位都是 1,主机地址部分的位都是 0,我们将IP 地址与⼦⽹掩码做按位与运算,就可以计算出该 IP 地址的⽹络地址部分。
对于⼦⽹掩码,⼀般常见的有两种表⽰⽅式,⼀种是上⾯这种分两⾏的表⽰⽅式,还有⼀种是在 IP 地址后⾯追加⽹络地址位数,并通过 / 分隔开:
192.168.31.218/24
有了⼦⽹掩码,我们就可以按照需要将⼦⽹按照任何维度进⾏划分了。
在此基础上,为了解决全世界 IPv4 地址数量有限的问题,还诞⽣了 CIDR(⽆类型域间选路)和 VLSM(可变长⼦⽹掩码)技术,但是 IPv4 地址绝对数本⾝有限的事实⽆法改变,因此⼜有了 IPv6 地址。
公⽹ IP 和私有 IP,诞⽣的初衷也是为了解决 IPv4 地址不够⽤的问题,不同局域⽹之间的私有 IP 可以重复。
IPv6 地址简介
IPv6 是为了从根本上解决 IPv4 地址耗尽的问题⽽被标准化的⽹际协议。
IPv4 的长度是 4 个 8 位字节,总共 32 位,IPv6 的长度是其 4 倍,即 128 位,⼀般写成 8 个 16 位字节:
其中 inet6 后⾯就是 IPv6 的地址。
IPv6 地址可以容纳的设备数是个天⽂数字(2的128次⽅),⾜以满⾜可预见的未来⼈类对 IP 地址的需求。但是从 IPv4 切换到 IPv6 是⼀件极其耗时的事情,需要将所有主机和路由器的 IP 地址进⾏重新设置。因此,现在主流的 IP 地址还都是 IPv4 地址。
⼴播地址和环回地址
⼴播地址⽤于在同⼀个局域⽹中相互连接的主机之间发送数据。IP 地址中的主机地址部分全部设置为 1,就成为了⼴播地址。本地⼴播会被路由器屏蔽,不会到达外部⽹络。
环回地址是在同⼀台计算机内部的程序之间进⾏⽹络通信时所使⽤的默认地址,⼀般使⽤⼀个特殊的 IP 地址 127.0.0.1 作为环回地址,该地址还有⼀个与之具有相同意义的主机名 localhost,使⽤这个 IP 地址或主机名,数据包不会流向⽹络。
路由控制详解
IP 地址是⽹络层的基础,要真正将数据包从发送端成功发送到⽬标主机,还需要通过路由控制。现在我们来介绍路由控制的概念及其跳转流程。
路由控制定义
发送数据包时使⽤的地址就是 IP 地址,然⽽仅仅有 IP 地址还不⾜以将数据包发送到⽬标地址,在数据包发送过程中还需要指明下⼀跳路由器或主机,以便发往最终⽬标地址。
在这⾥我们需要先了解「跳」的概念,「跳」是⽹络中的⼀个区间(⽹段),IP 数据包正是在⽹络中⼀个个跳之间转发,因此 IP 路由也叫多跳路由,在每⼀个区间内决定着包在下⼀跳被转发的路径:
在以太⽹等数据链路中使⽤ MAC 地址传输数据帧,此时的⼀跳指的是源 MAC 地址到⽬标 MAC 地址之间传输帧的区间。也就是说它是主机或路由器⽹卡不经其它路由器⽽能直接到达相邻主机或路由器⽹卡之间的⼀个区间。
为了将数据包发送给⽬标主机,所有主机和路由器都维护着⼀张路由控制表,该表记录 IP 数据在下⼀步应该发给哪个路由器,IP 数据包将根据这个路由表在各个数据链路上传输。
该路由控制表有两种⽣成⽅式,⼀种是管理员⼿动设置,⼀种是路由器根据与其他路由器相互交换信息时⾃动刷新。前者叫静态路由控制,后者叫动态路由控制。为了让动态路由及时刷新路由控制表,
在⽹络上互连的路由器之间必须设置好路由协议,保证正常读取路由控制信息(关于路由协议后⾯我们会单独介绍)。
路由控制流程
我们在上⼀篇介绍的 IP 地址的⽹络地址部分将会⽤于路由控制,根据⽹络标识选择下⼀跳的路由器。具体的跳转逻辑如下图所⽰:
要从源主机 10.1.1.30 发送⼀个数据包到⽬标主机 10.1.2.10,由于 10.1.2.10 的⽹络地址与源主机 10.1.1.0/24 的⽹络地址不匹配,所以数据包被转发到路由器,路由器的路由控制表中如果已经存在 10.1.2.0/24 的⽹络地址映射,则直接将请求转发到对应的路由器(关于路由控制表的⽣成逻辑我们后⾯会详细介绍),如果⽬标主机 IP 地址在该路由器所在的数据链路中,再将数据包发送过去,就完成了将数据包发送到⽬标主机的流程。
IP数据包的分⽚与合并
IP 数据包是在数据链路层处理的基础上对数据进⾏打包,不同数据链路的各⾃最⼤传输单位(MTU)不尽相同,但是 IP 协议⼜是可以实现多个数据链路之间通信的协议,所以,意味着它对不同的数据链路差异进⾏了抽象,使得上层⽆需关注底层⽹络构造细节。
在具体实现时,IP 协议采⽤了对数据包进⾏分⽚处理,将较⼤的 IP 包分割成较⼩的包,到了接收端以后再根据分⽚序号重新组合起来传递给上⼀层,通过这种⽅式实现了对数据链路层的抽象。
分⽚会导致路由器处理负荷加重,所以只要允许,都不会让路由器进⾏ IP 数据包的分⽚处理,其次,在分⽚过程中,如果某个分⽚丢失,整个 IP 数据包都会作废。实际实现过程中,为了避免路由器对 IP 数据包进⾏分⽚,还产⽣了⼀种叫做「路径 MTU 发现」的技术,所谓路径 MTU 指的是从发送端主机到接收端主机之间路由器不需要对 IP 数据包进⾏分⽚的最⼤ MTU 的⼤⼩,然后发送端根据这个 MTU 的⼤⼩对数据包进⾏分⽚发送,从⽽避免路由器对其进⾏分⽚处理。感兴趣的同学可以去了解下其实现细节,这⾥就不深⼊展开了。
IP 报⽂头格式
有了前⾯介绍的 IP 地址和路由控制基础理论,继续来看下 IP 报⽂⾸部(有的地⽅称之为报⽂头)的格式,看看前⾯介绍的原理如何落实到具体的数据结构上。我们整个⽹络协议分享还是以 IPv4 为主,所以我们主要来看下 IPv4 报⽂⾸部的格式。
通过 IP 协议进⾏⽹络通信时,需要在数据前⾯加上 IP ⾸部信息(有的地⽅称之为 IP 头,⼀个意思),IP ⾸部中包含着基于 IP 协议进⾏发包控制时所有的必要信息:
下⾯我们看具体看下每个字段表⽰的含义:
版本:⽤于标识 IP ⾸部的版本号,IPv4 的版本号即4,关于 IP ⾸部的版本信息可以参考这⾥:
⾸部长度:IP⾸部的⼤⼩,单位为4字节。
区分服务(TOS):⽤来表⽰服务质量,IP 协议本⾝是⼀种尽⼒服务的协议,⽆法保证通信质量,但是近年来随着⾳视频服务对实时性要求的提⾼,在使⽤ IP 通信过程当中保证服务质量的技术也有了蓬勃发展。DSCP 字段⽤于在通过 DiffServ 控制⽹络质量的时候设置包的优先级;ECN 则主要⽤于⽹络通信中的显式拥塞通知。
总长度:IP⾸部与数据部分结合起来的总字节数,最⼤长度是65535。
标识:⽤于 IP 包分⽚重组,不同分⽚标识值不同。
标志:表⽰包被分⽚的相关信息。
⽚偏移:⽤来标识被分⽚的每⼀个分段相对于原始数据的位置。以上三个字段⽤于 IP 包的分⽚与重组。
⽣存时间:最初设计为⽹络包的有效时间,实际⽤于可以中转多少个路由器,每经过⼀个路由器,TTL值减1,直到为0则丢弃该包。
协议:标识 IP ⾸部的上⼀层⾸部⾪属于哪个协议,⽐如 TCP 或 UDP,具体⽀持的协议信息请参考这⾥:
⾸部校验和:只校验数据报的⾸部,不校验数据部分,主要⽤来确保 IP 数据报不被破坏。
源地址:发送端 IP 地址。
⽬标地址:接收端 IP 地址。
可选项:通常在实验或诊断时才使⽤。
填充:在有可选项的情况下,⾸部长度可能不是32位的整数倍,通过向该字段填充0,将其调整为32位整数倍,以⽅便计算机进⾏处理。
数据:传输的具体数据(并不是⾸部的⼀部分)。
感兴趣的话,可以试试通过 WireShark 对⽹络请求进⾏抓包,就可以看到对应的 IP ⾸部信息了:
可以看到,和我们上⾯介绍的 IP 头格式完全⼀致,只是没有可选字段和填充项。
在实际通信中,仅凭 IP 协议还不够,还要借助众多⽀持 IP 协议的相关技术才能更好地实现最终通信。
IP 地址是如何⾃动分配的
前⾯我们介绍了 IP 地址,那么我们的 IP 地址是怎么分配的呢?
DHCP 的引⼊戏曲作文
我们已经知道 IP 地址分为公⽹ IP 和私有 IP,公⽹ IP ⼀般由运营商维护和分配,⽽私有 IP 是局域⽹内部的 IP,是需要局域⽹内部去管理和维护的,当然,我们可以按照所属⽹段⾃⼰去设置,如果是在家⾥只有⼏台联⽹设备还好,如果是在学校或公司,动辄上百台机器,如果由 IT 管理员去设置每台机器的 IP 地址,不仅繁琐,⽽且容易出现 IP 地址冲突。并且按照我们现有的经验来看,不管是在家⾥、学校还是公司,都不需要⼿动设置 IP 地址,⽽是插上⽹线(台式机),或者接⼊ WiFi(⼿机或笔记本电脑),就可以上⽹了,IP 地址由系统⾃动帮我们分配。
这⾥⾯⽤到了⾃动分配 IP 地址的协议,也就是动态主机配置协议,简称 DHCP,不管是在 Windows 还是 Mac 中都可以看到它的⾝影:
有了 DHCP,计算机或者智能⼿机只要连上⽹络,就能实现 TCP/IP 通信,从⽽实现了 IP 地址的⾃动分配和统⼀管理。
DHCP的⼯作原理
使⽤ DHCP 之前,需要先在局域⽹内假设⼀台 DHCP 服务器(⼀般由路由器充当),然后将 DHCP 所要分配的 IP 地址设置到服务器上,此外,还需要将⼦⽹掩码、路由控制、DNS 服务器地址等信息也设置到服务器上。
新加⼊的机器或设备(DHCP 客户端)使⽤ IP 地址 0.0.0.0 (此时还没有分配IP地址)发送了⼀个⼴播包,⽬标 IP 地址为 255.255.255.255(⼴播地址)。⼴播包⾥包含了该机器的 MAC 地址,请求 DHCP 服务器为其分配 IP 地址。
DHCP 服务器收到⼴播后会通知新加⼊机器可⽤的⽹络设置(通过 MAC 地址唯⼀确定),包括 IP 地址、⼦⽹掩码、⽹关等信息,这个通知仍然以⼴播形式发送,因为这个时候新机器还没有分配 IP 地址。此时,DHCP 就已经将这个 IP 地址标记为已分配,其它机器将⽆法获取到这个 IP。
新机器拿到 IP 地址后,会给 DHCP 服务器发送⼀个 DHCP 请求,表⽰接受这个 DHCP 服务器分配的 IP 地址,此时还是使⽤⼴播包,DHCP 服务器收到请求后,会返回给新机器⼀个 DHCP ACK 消息包,新机器收到消息后,由操作系统完成 IP 地址分配。
当新机器离开这个⽹段时,会发送 DHCP 解除包让这个 IP 地址回到 DHCP IP 地址池,以便其他新接⼊设备使⽤。
注:之所以分成两个阶段,是因为当有多台 DHCP 服务器时,新机器只会选中其中⼀个服务器分配的 IP 地址,⼀般是最先到达的那个,客户端发起第⼆次⼴播请求,还会告知其他服务器,我已经选择了某⼀台 DHCP 服务器分配的地址,其他服务器分配的 IP 地址可以回收给其他客户端使⽤。
⼀般在家⾥,⼤多只有⼀个以太⽹/⽆线局域⽹⽹段,连接的机器和设备不多,⼀台 DHCP 服务器(路由器)就够了。⽽对于学校或公司来说,可能存在多个⽹段,如果针对每个⽹段都设置⼀台 DHCP 服务器管理和维护起来⽐较⿇烦,这个时候,我们可以借助 DHCP 中继代理对 DHCP 进⾏统⼀管理,我们还是假设⼀台 DHCP 服务器,⼦⽹⽹段上的服务器使⽤ DHCP 中继代理来替代,DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,⽽ DHCP 中继代理在收到这个⼴播包后再以单播的形式发送给 DHCP 服务器,服务器收到这个包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包转发给 DHCP 客户端。
域名与 IP 地址是如何映射的
DNS 的引⼊
根据前⾯的介绍,通过 IP 地址就可以实现主机之间的连接和通信,对机器来说这没有什么问题,但是对于使⽤⽹络的⼈来说,尤其是普通⽤户,如果需要输⼊⼀串莫名其妙的 IP 地址才能访问对⽅主机,不仅⿇烦,⽽且难以记忆,因此,就诞⽣了 DNS。
DNS 是英⽂名 Domain Name System 的缩写,顾名思义,它是域名管理系统,专门⽤于将域名解析为对应的 IP 地址。这样⼀来,我们只需要输⼊⽹站的域名,如 ,底层 DNS 就会帮我们检索与之映射的 IP 地址,拿着这个 IP 地址就可以访问对⽅主机了,这也是⽇常我们上⽹的正常操作⽅式。DNS 的前⾝
在 DNS 诞⽣之前,为了解决主机与 IP 地址的映射,会为每个主机设置⼀个主机识别码,或者叫主机名,在⽹络通信时可以直接使⽤主机名⽽不是 IP 地址,通过主机名访问对端主机时,底层也会将其转化为对应 IP 地址,⽽实现这⼀映射功能的解决⽅案就是在每个主机存储⼀个 hosts ⽂件:
在互联⽹诞⽣的混沌之初,为了实现与外部⽹络的连接,互联⽹信息中⼼会统⼀管理⼀份 hosts ⽂件,如果⽹络中新增⼀台机器或更新已有机器的 IP 地址,需要更新中⼼的这份 hosts ⽂件,并且其它计算机要经常定期从中⼼下载最新的 hosts ⽂件才能保证⽹络的畅通。
显然这种⽅式⽆法应对⽇益扩⼤的⽹络规模,尤其是现在这种数⼗亿乃⾄百亿台设备连接到⽹络的场景,但是这种⽅式也没有完全从我们的视野中消失,在局域⽹内部或者⽤于测试的本地机器,我们还在使⽤ hosts ⽂件存放虚拟域名,以⽅便本地的开发测试:衣带渐宽终不悔 为伊消得人憔悴什么意思
127.0.0.1 localhost
255.255.255.255 broadcasthost
装修除甲醛127.0.0.st
在浏览器中输⼊域名发起访问后,系统会先从 hosts ⽂件中读取记录,如果输⼊的域名在 hosts ⾥⾯做了映射,则直接拿到对应的 IP 地址发起请求,如果没有的话才会启⽤ DNS 做域名映射。
DNS 服务器
在介绍 DNS 服务器之前,我们先来看看域名的组成结构。
以 Laravel 学院为例,域名是 ,其中 laravelacademy 表⽰ Laravel 学院的固有域名,org 表⽰顶级域名,固有域名和顶级域名通过.分隔,有的⽹站还细分出⼆级域名,⽐如腾讯视频的⽹站是 v.qq,我们可以将 v 称作⼆级域名。
注:域名⼀般通过在域名服务商那⾥注册获取,然后域名与 IP 地址的映射也是在域名服务商那⾥完成。映射之后,就可以通过域名与对应的主机通信了。DNS 服务器指的是管理域名的主机或软件,它可以管理所在分层的域名信息:
根 DNS 服务器:返回顶级域 DNS 服务器的 IP 地址
顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
权威 DNS 服务器:返回固有域名对应主机的 IP 地址
每⼀个分层都设有 DNS 服务器,各层 DNS 服务器都了解该层以下分层中所有 DNS 服务器的 IP 地址,所有 DNS 服务器⼜都了解根 DNS 服务器的 IP 地址,以便在当前分层不到映射的 IP 地址时,跳转到根 DNS 服务器从上往下继续查。
进⾏ DNS 查询的主机或软件叫做 DNS 解析器,⽤户所使⽤的计算机或⼯作站就属于解析器,⼀个解析器⾄少需要注册⼀个以上 DNS 服务器的 IP 地址,通常,它⾄少包括组织内部的本地 DNS 服务器的 IP 地址:
DNS 查询原理
以下是⼀个 DNS 查询流程图:
⽤户在浏览器中输⼊ www.baidu 访问百度⾸页,计算机会先从本地 hosts ⽂件或 DNS 缓存解析器中查询有⽆相应的 IP 地址映射记录,如果有的话直接返回,否则进⼊下⼀步;
将域名发给本地 DNS 服务器(通过 DHCP 配置,⼀般由宽带运营商⾃动分配)进⾏查询,如果缓存中有记录则返回对应 IP 地址,否则进⼊下⼀步;
将域名发给根 DNS 服务器进⾏查询,根 DNS 服务器不会直接解析域名,但是会返回查询域名对应顶级域名 DNS 服务器的 IP 地址,⽐如这⾥是 ;
然后本地 DNS 服务器会到 顶级域名服务器查询,顶级域 DNS 服务器会根据查询域名返回 baidu 对应的权威 DNS 服务器的 IP 地址;
接下来,本地 DNS 服务器根据返回的权威 DNS 服务器的 IP 地址去对应的服务器(域名解析出处)进⾏查询,这⼀次就可以获取到 www.baidu 域名对应的 IP 地址了,拿到这个 IP 地址,就可以将其返回给对应的计算机。
上述流程⾛下来,还是很费劲的,所以不管是 DNS 解析器还是 DNS 服务器,都会将最新了解到的信息暂时缓存起来,这样,可以减少每次查询时的性能消耗。
好了,这样下来,你应该对域名与 IP 地址之间是如何映射的很清楚了吧。
IP 地址与 MAC 地址是如何映射的
ARP 的引⼊
通过前⾯的介绍,我们已经知道在计算机⽹络中,只要确定了 IP 地址就可以向⽬标主机发送 IP 数据
包。不过,在数据链路底层进⾏通信时,却有必要了解每个IP 地址对应的 MAC 地址。这样才能完成「最后⼀公⾥」的通信,把数据包发送给⽬标主机。
⽽通过 IP 地址获取 MAC 地址就需要借助 ARP,ARP 是⼀种地址解析协议,以⽬标 IP 地址为条件,来定位下⼀个应该接收数据包的⽹络设备的 MAC 地址,如果对应 MAC 地址不存在,意味着⽬标主机不在该⽹段内,接着通过 ARP 查下⼀跳路由器的 MAC 地址。
ARP 的⼯作原理
ARP 协议借助 ARP 请求和响应两种类型的包来确定 MAC 地址,以下是 ARP 请求和响应的⼀般流程:
主机 A 为了获取主机 B 的 MAC 地址,⾸先要通过⼴播发送⼀个 ARP 请求包,这个包中包含了想要了解其 MAC 地址的对应主机 IP 地址(即主机 B 的 IP 地址),由于⼴播包可以被同⼀链路上的所有主机或路由器接收,因此 ARP 的请求包就会被这个链路上的所有主机和路由器进⾏解析,如果 ARP 请求包中的⽬标 IP 地址与⾃⼰的 IP 地址⼀致,这个节点就将⾃⼰的 MAC 地址塞⼊ ARP 响应包返回给主机 A。有了 IP 地址和 MAC 地址,就可以完成链路内的 IP 通信。为了降低⽹络流量,提⾼通信效率,发送 ARP 请求包的主机会把获取到的 MAC 地址缓存⼀段时间,IP 地址与 MAC 地址映射关系表叫 ARP 缓存表,每执⾏⼀次 ARP,对应的缓存表内容就会被清除。
反之,接收 ARP 请求的那个主机⼜可以从这个 ARP 请求包获取发送端主机及其 MAC 地址,这时候,它也可以将这些 MAC 地址信息缓存起来,从⽽根据MAC 地址发送 ARP 响应包给发送端主机。
IP 地址与 MAC 地址对⽐
整个互联⽹其实就是通过路由器将⼀个个⽹段连接起来,同⼀个⽹段(链路)内通过 MAC 地址即可通信,但是跨⽹段的通信需要通过 IP 地址,如果没有 IP 地址,仅仅通过 MAC 地址⽆法知道节点所处的位置(没有⽹络地址部分),就需要向全⽹发送数据包,可想⽽知这将会造成多⼤的⽹络流量,⽽且维护这个MAC 地址的缓存表也⾮常庞⼤。
所以,在互联⽹通信中,IP 地址和 MAC 地址缺⼀不可,于是就有了将这两个地址相关联的 ARP 协议。另外,有些时候我们可能还需要反过来通过 MAC 地址获取 IP 地址,相应的协议是 RARP。梦见有人给我钱
下⾯是⼀个跨⽹段的⽹络请求根据 IP 地址和 MAC 地址最终到达⽬标主机的流程图:
如上所述,在整个过程中,IP 头没有变动,⽽数据链路帧头(MAC头)⾥的⽬标 MAC 地址随着链路的变动⽽变动,从⽽将⽹络包⼀步步转发到⽬标主机,完成整个通信。
聊聊 ping 和 traceroute 的底层⼯作原理
ping 与 ICMP
⽇常⼯作中,我们在测试是否可以连接到某个域名或 IP 时,通常会使⽤ ping 命令:
ping 是基于 ICMP 进⾏⼯作的,ICMP 全称 Internet Control Message Protocol,意为互联⽹控制报⽂协议。
ICMP 的主要功能包括,确认 IP 包是否成功送到⽬标地址,通知在发送过程中 IP 包被废弃的具体原因,改善⽹络设置等。
在⽹络通信中如果某个 IP 包因为某种原因未能到达⽬标地址,那么这个具体的原因将由 ICMP 负责通知。ICMP 这种通知报⽂会使⽤ IP 进⾏发送,ICMP 报⽂也是封装在 IP 包⾥⾯的。
ICMP 报⽂类型
ICMP 报⽂⼤致分为两类:⼀类是通知出错原因的错误消息(差错报⽂),另⼀类是⽤于诊断的查询消息(查询报⽂)。所有的报⽂类型如下:
其中最常见的就是类型 8 和 0,两者都是回送消息,⽤于进⾏通信的主机和路由器之间,判断所发送的数据包是否已经成功到达对端,可以向对端主机发送回送请求消息(类型 8),也可以接收对端主机发回来的回送应答消息(类型 0),常⽤的 ping 命令就是利⽤这个消息实现的。
ping ⼯作原理
ping 命令执⾏的时候,源主机⾸先会构建⼀个 ICMP 请求数据包,ICMP 数据包内包含多个字段。最重要的是两个,第⼀个是类型字段,对于请求数据包⽽⾔该字段为 ``8;另外⼀个是顺序号,主要⽤于区分连续 ping 的时候发出的多个数据包。每发出⼀个请求数据包,顺序号会⾃动加 1。
然后,由 ICMP 协议将这个数据包连同地址 220.181.57.216 ⼀起交给 IP 层。IP 层将以 220.181.57.216 作为⽬的地址,本机 IP 地址作为源地址,加上⼀些其他控制信息,构建⼀个 IP 数据包。
接下来,需要加⼊ MAC 头,最后将它们传送出去。
主机 B 收到数据帧后,先检查它的⽬的 MAC 地址,并和本机的 MAC 地址对⽐,如符合,则接收,否则就丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有⽤的信息提取后交给 ICMP 协议。
主机 B 会构建⼀个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明⽬标主机不可达(类型 3);如果接收到了 ICMP 应答包,则说明⽬标主机可达。
为了安全起见,某些机器和设备是禁⽌被 ping 的,所以,ping 不通并不意味着⼀定是⽹络不通,对于禁⽌ ping 命令的主机,需要通过 telnet 命令测试是否可以连接。
通过 traceroute 诊断⽹络
前⾯提到的 ping 使⽤的是 ICMP 的查询报⽂,下⾯我们再来介绍⼀个使⽤ ICMP 差错报⽂的⼯具 —— traceroute。
前⾯我们介绍过,IP 包中有⼀个字段叫 TTL,它的值随着每经过⼀个路由器减 1,直到为 0 时该 IP 包被丢弃。此时 IP 路由器会发送⼀个 ICMP 超时消息给发送端主机,并通知该包已丢弃。
traceroute 正是基于这⼀原理,它的参数指向某个⽬的 IP 地址,它会发送⼀个 UDP 的数据包。将 TTL 设置成 1,也就是说⼀旦遇到⼀个路由器或者⼀个关卡,就表⽰它“牺牲”了,于是,返回⼀个 ICMP 包,也就是⽹络差错包,类型是时间超时。接下来,将 TTL 设置为 2。如此反复,直到到达⽬的主机。这样,就拿到了所有的路由器 IP(不显⽰指定 TTL 默认返回所有中间路由器 IP):
注:中间某⼀跳路由器不返回 IP 地址⽽是 ***,说明在这⼀跳的路由器设置了不应答 ICMP。
在⽹络发⽣问题时,traceroute 是⼀个强⼤的诊断⼯具。
如何通过 NAT 技术实现公⽹ IP 与私有 IP 地址间的转换
为了解决 IPv4 地址即将枯竭的问题,会在本地⽹络使⽤私有 IP 地址,然后在连接互联⽹时使⽤ NAT 技术将其转化为公⽹ IP 地址(全局 IP 地址),那
么,NAT 技术是如何实现这个转化的呢?
下⾯我们来看⼀张图:
在 NAT 路由器(即本地⽹络与外部⽹络连接的路由器)内部有⼀张⾃动⽣成的⽤来转换地址的表,当 10.0.0.10(私有IP)向 163.221.120.9(公⽹IP)发送第⼀个包时⽣成这张表,并按照表中的映射关系进⾏处理。
当私有⽹络内的多台机器同时都要与外部通信进⾏通信时,仅仅转换 IP 地址,⼈们不免担⼼公⽹ IP 地址是否够⽤,这时采⽤包含端⼝号⼀起转换的⽅式可以解决这个问题:
即在通过 NAT 路由器做 IP 地址转化时将本地⽹络中不同主机转化为同⼀个 IP 地址,⽽将端⼝号转化为不同端⼝号,以⽰区别。
这⾥需要注意的是,在使⽤ TCP 或 UDP 的通信中,只有当⽬标地址、源地址、⽬标端⼝、源端⼝以及协议类型(TCP或UDP)五项内容都⼀致时才被认为是同⼀个通信连接。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。