目录
DNS
DNS背景
域名的层级关系
域名解析过程
使用dig工具分析DNS过程
ARP
DHCP
NAT
NAT IP转换过程
NAPT
NAT技术的缺陷
如何解决NAT潜在问题
ICMP
ICMP功能
ICMP协议格式
ping命令
traceroute命令
IGMP
跟 IP 协议相关的技术也不少,接下来说说与 IP 协议相关的重要且常见的技术。
- DNS 域名解析
-
ARP 与 RARP 协议
-
DHCP 动态获取 IP 地址
NAT 网络地址转换
IGMP 因特网组管理协
DNS
我们在上网的时候,通常使用的方式是域名,而不是 IP 地址,因为域名方便人类记忆。
那么实现这一技术的就是 DNS 域名解析 , DNS 可以将域名网址自动转换为具体的 IP 地址。
DNS背景
TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts文件夹来描述主机名和IP地址之间的对应关系。
最初,这个hosts文件是由互联网信息中心(SRI-NIC)来管理的。
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件。
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网。
- 当用户通过域名访问互联网服务时,会先通过域名在本地的hosts文件中找到其对应的IP地址,然后再用这个IP地址去访问对应的服务。
但这样太麻烦了,于是产生了DNS系统。
- 由一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。
- 如果新计算机要接入网络,或者某个计算机IP变更,就需要将对应信息注册到数据库中。
- 当用户通过域名访问互联网服务时,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址。
至今,我们的计算机上仍然保留了hosts文件,这个hosts文件当中一般存储的是主机名与IP地址之间的映射,用户也可以在hosts文件中自主添加域名和IP映射关系,在域名解析的过程中会优先查找hosts文件的内容。
通过cat /etc/hosts
可以查看hosts文件当中的内容。
域名的层级关系
DNS 中的域名都是用 句点 来分隔的,比如 www.server.com ,这里的句点代表了不同层次之间的 界限 。
在域名中, 越靠右 的位置表示其层级 越高 。
毕竟域名是外国人发明,所以思维和中国人相反,比如说一个城市地点的时候,外国喜欢从小到大的方式顺序说起(如 XX 街道 XX 区 XX 市 XX 省),而中国则喜欢从大到小的顺序(如 XX 省 XX 市 XX 区XX 街道)。
根域是在最顶层,它的下一层就是 com 顶级域,再下面是 server.com 。
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。
因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器
域名解析过程
浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts ,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:
1.客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 TCP/IP 设置中填写的 DNS 服务器地址)。
2.本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com ,则它直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器: “ 老大, 能告诉我 www.server.com 的IP 地址吗? ” 根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
3. 根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com ,说: “ www.server.com 这个域名归
.com 区域管理 ” ,我给你 .com 顶级域名服务器地址给你,你去问问它吧。 ”
4. 本地 DNS 收到顶级域名服务器的地址后,发起请求问 “ 老二, 你能告诉我 www.server.com 的 IP 地址吗? ”
5. 顶级域名服务器说: “ 我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该 能问到 ” 。
6. 本地 DNS 于是转向问权威 DNS 服务器: “ 老三, www.server.com 对应的 IP 是啥呀? ” server.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
7.权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS 。
8. 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。
至此,我们完成了 DNS 的解析过程。现在总结一下,整个过程我画成了一个图。
DNS 域名解析的过程蛮有意思的,整个过程就和我们日常生活中找人问路的过程类似,只指路不带路。
使用dig工具分析DNS过程
我们可以使用dig工具来查看域名解析的过程,例如查看百度域名www.baidu.com
的解析过程。
dig工具的分析结果如下:
说明:
- 开头位置是dig工具的版本号。
- 第二部分是服务器返回的详情,其中status参数为NOERROR表示查询成功。
- QUESTION SECTION表示待查询的域名。
- ANSWER SECTION表示查询的结果,首先
www.baidu.com
被查询成了www.a.shifen.com
,而最终www.a.shifen.com
被查询成了两个具体的IP地址。
- 最下面是一些结果统计,包含查询时间和DNS服务器的地址等。
ARP
在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP 数据包下一跳。然而,网络层的下一层是数据链路层,所以我们还要知道「下一跳」的 MAC 地址。
由于主机的路由表中可以找到下一跳的 IP 地址,所以可以通过 ARP 协议 ,求得下一跳的 MAC 地址。
那么 ARP 又是如何知道对方 MAC 地址的呢?
简单地说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址。
不过, MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
RARP 协议你知道是什么吗?
ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。
通常这需要架设一台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:
最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。
DHCP
DHCP 在生活中我们是很常见的了,我们的电脑通常都是通过 DHCP 动态获取 IP 地址,大大省去了配IP 信息繁琐的过程。
接下来,我们来看看我们的电脑是如何通过 4 个步骤的过程,获取到 IP 的。
先说明一点, DHCP 客户端进程监听的是 68 端口号, DHCP 服务端进程监听的是 67 端口号。
这 4 个步骤:
1.客户端首先发起 DHCP 发现报文( DHCP DISCOVER ) 的 IP 数据报,由于客户端没有 IP 地
址,也不知道 DHCP 服务器的地址,所以使用的是 UDP 广播 通信,其使用的广播目的地址是
255.255.255.255 (端口 67 ) 并且使用 0.0.0.0 (端口 68 ) 作为源 IP 地址。 DHCP 客户端将该IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。
2.DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文( DHCP OFFER ) 向客户端做出响应。该报文仍然使用 IP 广播地址 255.255.255.255 ,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 IP 地址租用期 。
3.客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 DHCP 请求报文( DHCP REQUEST 进行响应,回显配置的参数。
4.最后,服务端用 DHCP ACK 报文 对 DHCP 请求报文进行响应,应答所要求的参数。
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的IP 地址。
如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文
可以发现,DHCP 交互中,全程都是使用 UDP 广播通信。
咦,用的是广播,那如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个 DHCP 服务器?
所以,为了解决这一问题,就出现了 DHCP 中继代理 。有了 DHCP 中继代理以后, 对不同网段的 IP 地 址分配也可以由一个 DHCP 服务器统一进行管理。
因此, DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理 IP 地址。
NAT
IPv4协议中, IP地址数量不充足的问题;
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
- 一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
- 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
- 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
- 子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
NAT IP转换过程
电脑产生http报文,向下交给传输层TCP协议。TCP封装时,源端口在49152~65535间随机选择一个,如60128,目的端口为80。
TCP封装后,交给网络层IP协议,IP封装源地址为内网电脑的私网地址192.168.1.10,目的地址为公网服务器的地址98.76.54.32,协议号为6。
链路层的封装和前面文章所述一样,这里我们省略。这个报文发到NAT设备后,NAT设备将源地址修改为12.34.56.78,做好记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,然后将报文发到公网。
公网根据报文中的目的地址98.76.54.32,将报文准确送达服务器。
服务器返回的信息,数据是这样封装的:
源和目的端口号、IP地址互换位置,公网会根据目的地址12.34.56.78,把报文送达NAT设备。NAT根据记录“内网地址192.168.1.10映射到外网地址12.34.56.78”,把目的地址12.34.56.78换回192.168.1.10,然后根据内网地址192.168.1.10把报文送达电脑。
但这样的转换方式并不妥当,因为一个内网地址需要对应转换为一个外网地址,内网电脑数量多就会消耗大量外网地址,并没有起到节省地址的作用。
因此,我们所使用的NAT,叫做NAPT(Network Address Port Translation,网络地址端口转换)
NAPT
NAT只转换IP封装中的IP地址,而NAPT则把传输层的端口号和IP地址一起转换,可以实现一个公网地址的复用。
假设内网有两台电脑,地址分别为192.168.1.10和192.168.1.20,NAT设备地址和服务器地址和上例相同。假设两台电脑同时访问外网服务器,电脑A发出的报文封装是:
电脑B发出的报文封装是:
两个数据报文到达NAT设备后,NAT设备做个记录:
然后,NAT把电脑A的报文修改为:
而电脑B的报文也被NAT修改为:
可以看到,NAT把两台内网电脑发出去的报文转换后,仅传输层的源端口号不同,IP的封装完全相同。这样一来,就可以实现同一个公网地址被不同内网电脑重复使用,只需通过端口号区别开就可以。外网返回的数据报文回到NAT设备后,NAT根据之前记录的信息再转换回内网地址和内网端口号,即可把报文送达不同的内网电脑。
谈谈路由器
路由器是工作在网络层的一个设备,负载将数据包从一个网络转发到另一个网络,但不能狭义的认为路由器只能工作在网络层。
- NAT路由器在进行数据转发时,不仅有能力替换数据包的源和目的IP地址,而且在必要的情况下还可能会替换数据包的源和目的端口号,而端口号实际是传输层的概念。
- 为了对IP地址进行动态管理,大部分路由器都带有DHCP功能,而DHCP实际是应用层的一个协议。
因此现在的路由器其实并不仅仅提供网络层相关的服务,网络协议栈中的各层路由器可能都有涉及。
NAT技术的缺陷
由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:
如何解决NAT潜在问题
1.是改用 IPv6
IPv6 可用范围非常大,以至于每台设备都可以配置一个公有 IP 地址,就不搞那么多花里胡哨的地址转 换了,但是 IPv6 普及速度还需要一些时间。
2. NAT 穿透技术
NAT 穿越技术拥有这样的功能,它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT 设备的公有 IP ,并为自己建立端口映射条目,注意这些都是 NAT 设备后的应用程序自动完成的。
也就是说,在 NAT 穿透技术中, NAT 设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它外发的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT设备来建立映射了。
说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,就不需要 NAT 设备来进行转换了。
ICMP
ICMP 全称是 Internet Control Message Protocol ,也就是 互联网控制报文协议 。
里面有个关键词 —— 控制 ,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。
当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层。
其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际网络层还有两种协议叫做ICMP和IGMP。
ICMP、IGMP和IP协议虽然都属于网络层的协议,但ICMP协议和IGMP协议属于IP的上层协议。
- 也就是说,IP的上层协议不一定就直接是传输层的协议,IP的上层协议有可能也属于网络层的协议,但就是位于IP的上层。
- 与之类似的,数据链路层当中的ARP协议和RARP协议,这两个协议虽然与MAC帧协议都属于数据链路层,但这两个协议属于MAC帧的上层协议。
ICMP功能
ICMP的主要功能包括:
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包丢弃的原因。
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6。
举个例子
在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将 由 ICMP 负责
通知
如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。
ICMP 的这种通知消息会使用 IP 进行发送 。
因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收
到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。
ICMP协议格式
ICMP协议格式如下:
ICMP大概分为两类报文。
ICMP包常见类型如下:
类型 |
内容 |
0 |
回送应答(Echo Reply) |
3 |
目标不可达(Destination Unreachable) |
4 |
原点抑制(Source Quench) |
5 |
重定向或改变路由(Redirect) |
8 |
回送请求(Echo Request) |
9 |
路由器公告(Router Advertisement) |
10 |
路由器请求(Router Solicitation) |
11 |
超时(Time Exceeded) |
17 |
地址子网请求(Address Mask Request) |
18 |
地址子网应答(Address Mask Reply) |
ping命令
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常。
例如,使用 ping www.baidu.com
命令,测试本地主机与百度服务器之间的通信信道是否正常。
- 注意,此处ping的是百度的域名,该域名会由DNS解析成IP地址。
- ping命令不仅能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存时间)。
- ping命令会先发送一个ICMP Echo Request给对端。
- 对端接收到之后,会返回一个ICMP Echo Reply。
一个值得注意的坑
telnet对应的端口号是23,ssh对应的端口号是22,那ping对应的端口号是多少?
这是问问题的人设的一个圈套,ping命令是基于网络层的ICMP协议,而端口号是属于传输层的内容,因此ICMP协议根本就不关心端口号这样的信息。
因此,ping命令实际是绕过了传输层的,在Linux当中实际也有绕过传输层的一套网络编程接口,叫做原生套接字。
traceroute命令
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器。
例如,使用traceroute www.baidu.com
命令,遍历数据包传送到百度服务器所经过的所有路由器。
原理简述:
- traceroute命令底层实际是通过增加存活时间(TTL)值来实现的。
- 因为每当数据包经过一个路由器,其TTL值就会减1,当TTL值减为0时对应路由设备就会将该数据包丢弃,并传送一个ICMP TTL数据包给发送主机。
- 因此traceroute命令底层可以发出多个数据包,并给这些数据包设置不同的TTL值,最后该主机就能够得到一连串的数据包路径。
IGMP
ICMP 跟 IGMP 是一点关系都没有的,就好像周杰与周杰伦的区别,大家不要混淆了。
在前面我们知道了组播地址,也就是 D 类地址,既然是组播,那就说明是只有一组的主机能收到数据包,不在一组的主机不能收到数组包,怎么管理是否是在一组呢?那么,就需要 IGMP 协议了。
IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间,如上图中的蓝色部分。
IGMP 分为了三个版本分别是,IGMPv1、IGMPv2、IGMPv3。
接下来,以 IGMPv2 作为例子,说说 常规查询与响应和离开组播组 这两个工作机制。
常规查询与响应工作机制
离开组播组工作机制
离开组播组的情况一,网段中仍有该组播组:
1.
主机 1 要离开组 224.1.1.1 ,发送 IGMPv2 离组报文,报文的目的地址是 224.0.0.2 (表示发向网
段内的所有路由器)
2. 路由器 收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个),以便确 认该网络是否还有 224.1.1.1 组的其他成员。
3. 主机 3 仍然是组 224.1.1.1 的成员,因此它立即响应这个特定组查询。路由器知道该网络中仍然存 在该组播组的成员,于是继续向该网络转发 224.1.1.1 的组播数据包。
离开组播组的情况二,网段中没有该组播组:
1.主机 1 要离开组播组 224.1.1.1,发送 IGMP 离组报文。
2.路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个)。此时在该网段内,组 224.1.1.1 已经没有其他成员了,因此没有主机响应这个查询。
3.一定时间后,路由器认为该网段中已经没有 224.1.1.1 组播组成员了,将不会再向这个网段转发该组播地址的数据包。