IP协议相关技术终极详解
写文章的时间是理解这个知识点时间的n倍,但是通过文章,我们可以理清自己的逻辑,进一步加深理解
DNS域名解析协议
概述
我们在上网时,通常使用的都是域名来访问网站,因为域名更容易记住,总不可能记住一串ip地址吧。
那么网络如何将域名转换成对应的ip地址呢?这就需要我们的DNS域名解析协议了
域名的层级关系
DNS中的域名都是靠句点来进行分割的,越靠右的层级越高,因为外国人的思维都是跟中国人相反的。
根域在最顶层,它的下一层就是.com顶级域,如图所示:
根域的DNS服务器信息保存在互联网中所有DNS服务器中,所以任何DNS服务器都可以访问根域DNS服务器了。
因此,客户端只要找到任何一台DNS服务器,就能够找到根域服务器,从而找到该域名对应的DNS服务器。
域名的解析流程
浏览器首先查看自己浏览器的缓存里有没有,没有就查看操作系统的缓存里,还没有的话,就检查本机域名解析文件hosts,最后没有就访问本地的DNS服务器进行查询:
- 客户端会首先发出一个DNS请求,询问该域名的ip地址,并且发送给本地DNS服务器
- 本地DNS服务器收到后,会检查该缓存里有没有域名对应的ip,有的话就返回,没有就向DNS跟域名服务器询问该域名的ip地址。根域名服务器不用于解析,但是可以告诉你访问哪个DNS服务器
- 根域名服务器收到后,发现是属于com域名,就把com域名的服务器地址给你,让你去访问它
- 本地DNS服务器收到后,又会去访问根域名给定的com顶级DNS服务器地址
- 顶级域名com收到后,发现是属于哪个DNS区域的域名,就把该DNS服务器的地址给它
- 如此反复,本地DNS最后向权威DNS服务器询问,它是该域名解析结果的出处,所以是权威DNS服务器,它将对应的ip告诉本地DNS服务器
- 本地DNS服务器收到后,将ip地址返回客户端,并且自己将其加入缓存
ARP地址解析协议
概述
为什么需要ARP协议?
因为存在网络层地址(IP地址)和链路层地址(MAC地址),我们需要对它们进行转换,这便是地址解析协议ARP的作用
ARP协议是属于哪一层呢?
我想看到这个问题,很多人都一直以为是属于网络层的协议,但其实并不完全正确。我在了解ARP协议时,也一直保持困惑:我们的MAC地址不是加在帧头中的吗?那为什么好多的资料都说是属于网络层的协议呢?找了网上一些资料,但各有各的说法!!我也只能保持中立,因为并没有一种解释能够说服我!!直到我翻看《计算机网络自顶向下》时,这个解释让我臣服。
那我们来解释一下,它到底属于哪一层呢?
一个ARP分组是封装在链路层帧中的(ARP模块构造分组,一个ARP分组有几个字段,包括发送和接 收IP地址及MAC地址。ARP查询分组和响应分组都具有相同的格式。然后将ARP分组交给链路层封装
),因而在体系结构上是位于链路层之上的。
然而一个ARP分组包含链路层的地址字段,因而可以认为是链路层的。再然而它也包含了网络层的地址字段,因而也可以认为是网络层的协议。所以:我们最好把ARP协议看成是位于网络层和链路层中间的协议。但有些同学认为这样不就不符合我们分层的思想了吗??只能说:现实中的网络协议就是这么复杂
ARP协议和DNS协议的区别
DNS协议是将一个域名解析为IP地址,而ARP协议则是将IP地址解析为MAC地址。他们之间其实是很相似的。
他们之间有个重要区别就是:DNS可以为世界上任何一个地方的域名进行解析,但ARP只能为同一个子网的主机或者路由器接口解析IP地址
ARP协议工作流程
在同一个子网发送数据包
现在假设我们的ip地址为220的要向ip地址为222发送数据包,发送方需要给定IP地址的目的主机的MAC地址。如果在发送方的ARP表中有该表项,则直接封装就ok。如果没有该表项呢?那么发送方会构造一个ARP分组,一个ARP分组有发送方IP和接受方IP以及发送方的MAC地址。ARP查询分组的目的是询问子网上所有主机和路由器,确定其MAC地址
。
之后我们的220主机向它的适配器传递一个ARP分组,并指示适配器应该用MAC广播地址来进行发送,这样一个子网中所有主机都可以收到。
每个主机收到后,ARP模块都会查看该ARP的目的IP和本机IP是否一致,一致的话则响应自身的MAC地址给发送方。
发送方收到后,则更新自己的ARP表,得到了接受方的MAC地址,便可以发送数据包啦!!!
这里其中有一个有趣的事情:
- 发送方发送ARP分组时通过广播帧中发送,而响应时则是在一个标准帧中发送。为什么是这样呢??其实很好理解,因为一开始发送方并不知道它到底应该发送给谁,所以只能广播,而响应则知道这个ARP包是谁发的,就响应给谁就好了
- ARP是即插即用的,并不需要管理员配置,表可以自动维护
在不同子网发送数据包
假设我们现在主机111.111.111.111要向主机222.222.222.222发送数据包
我们主机111要向主机222发送数据,那么肯定要先转发到路由器接口为111.111.111.110上,那么此时ARP的目的ip则是这个路由器接口的IP,最终获取的是这个接口的MAC地址。(注意这里的目的IP是数据包下一跳的IP地址,并不是真正数据包要到达最终的主机IP)
终于!终于!数据包达到了路由器,路由器通过路由表,来确定转发的接口,转发后,此时数据包终于到达了另一个子网,那么此时又需要ARP协议来获取MAC地址了。最终到达目的主机,结束任务!
小提一下RARP
ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是已知 MAC 地址求 IP 地址
。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到,因为他们内部没有地方可以存放自己的IP地址,只有一个MAC地址,故而需要外部提供自己的IP地址
要实现这种协议:通常需要架构一台RARP服务器,保存对应的MAC地址和IP地址
DHCP动态IP配置协议(动态主机配置协议)
概述
在日常中,有了DHCP,使我们省去了配置IP的繁琐步骤,DHCP直接动态帮我们获取IP
DHCP工作流程
DHCP客户端监听的是68号端口,DHCP服务端监听的是67号端口
DHCP一个可以分为4个步骤:
- DHCP服务发现:
客户端发送DHCP发现报文,由于客户端没有IP地址,也不知道DHCP服务器的ip地址,所以它使用的是UDP广播通信
。广播地址是255.255.255.255,端口是67.源ip地址是0.0.0.0,源端口是68。DHCP客户端生成包含DHCP发现报文的IP数据包,发送给数据链路层,从而转发给所有网络中的设备 - DHCP提供报文:
DHCP收到DHCP发现报文后,继续用255.255.255.255的广播地址向客户端做出响应。DHCP提供报文包括:可租用的IP地址,子网掩码,IP地址租用期,默认网关,DNS服务器等等 - DHCP请求:
客户端收到一个或者多个DHCP提供报文后,选择一个服务器,发出DHCP请求报文发送其配置的参数 - DHCP ACK报文:
服务端说道DHCP请求报文后,发送ACK报文,应答该报文
一旦客户端收到ACK报文后,该IP地址就可以使用了
如果IP租约到期了,则会向服务器发送DHCP请求报文,如果同意继续租用,则回答ACK报文,如果不同意,则回答NACK报文
在DHCP交互中,都是使用UDP广播进行通信的
由于路由器并不会转发广播包,那么如果一个子网没有DHCP服务器怎么办呢??
中继代理便可以解决这个问题,所以一个DHCP服务器可以管理多个子网
工作流程:
- DHCP客户端广播DHCP服务发现包时,DHCP中继接收到这个包,则会以单播的形式传给DHCP服务器
- DHCP服务器处理后,又会给DHCP中继发送,DHCP中继又广播给DHCP客户端
NAT和 NAPT
概述
ipv4是32位的,大约总共可以容纳40多亿左右,但我们的人口就已经70多亿了,每台主机可能还不止一个ip地址,那为什么我们现在还可以使用呢??其实就是用到了我们的NAT网络地址转换协议,当我们同一个公司,教室对外通信时,把私有ip转换为公有ip地址
。这样就可以很大程度缓解我们ip地址不够的问题了。当然使用我们128位的ipv6也是可以解决ip地址不够的问题的,只不过ipv6的普及还需要一段时间
简单来说,就是把一个私有ip转换为一个共有ip。说实话,这样没有什么用,一个私有ip对应一个共有ip,那还要它干啥呢???
由于我们传输层大多数都是使用的TCP或者UDP协议,所以我们可以把网络地址加端口一起转换了,这样多个私有ip就可以共用一个公有ip了。这种技术就叫做网络地址与端口转换协议NAPT
如下图:
NAT和NAPT的缺点
- 外部无法主动和内部主机建立联系,因为在NAT服务器上并没有对应的转换表
- 过于依赖NAT服务器,如果服务器重启,则所有连接都将重置
缺点解决办法
- 使用ipv6,最简单的办法。管他三七二十一,梭哈
- NAT穿透技术:
客户端主动获取公有ip地址,自己建立映射,直接对外通信,这样就不需要NAT服务器来转换了,不用太过于依赖NAT服务器
ICMP互联网控制报文协议
概述
当我们的IP包在网络中没有达到主机时,就会通过ICMP报文负责通知。
ICMP主要作用就是:确认ip包是否送达,报告发送过程中遇到的故障
ICMP类型
- 查询报文协议
- 差错报文协议
IGMP组管理协议
组播地址,也就是D类地址。也就是发送一个消息,只有一个组的可以收到,其他组的收不到。那么久如何管理是否是一组的呢??这就是我们的IGMP组管理协议
了。
IGMP报文封装在IP数据报里,协议字段对应的值为2,TTL值为1,因为IGMP是工作在主机和连接的路由器之间的。
- 主机使用IGMP报文来向路由器申请加入和退出组播组。当主机通过IGMP加入组播组时,路由器会记录IGMP表,这样以后转发到该组的数据包就会转发了。默认是不会转发组播包的。
- 多播路由器用IGMP报文来了解网络中多播主机的情况。
IGMP工作流程
-
查询与响应机制
1) 路由器会周期性的发送ICMP常规查询报文,目的地址是同一网段的所有主机和路由器
2)组成员收到常规查询报文后,会启动一个延时计时器,计时器超时后就会发送ICMP组成员关系报告,目的地址是组播地址。如果没有超时就收到了ICMP组成员关系报文,那么就不发送了,减少网络中ICMP包的数量。
3)路由器收到后,就会在ICMP表中加入该组播组,下次有数据包来时,就转发给该组播组 -
离开组播组流程
1)如果一个主机1要离开组播组了,就发送ICMP离组报文,目的地址是网段中所有主机路由器
2)IGMP路由器收到后,间隔1s发送一个特定组的查询,一共发送两个,用来检测该网段中是否还有该组播组中的主机
3)如果网段中没有主机属于该组播组,则两个数据包都没有主机响应,那么路由器以后便不会往这里转发该组的组播包了;如果网段中还有主机输入该组播组,那么该主机收到路由器的查询报文后,就会响应这个查询,表示该网段中还有主机属于该组播组。
(重点)Ping的工作原理
概述
相信各位都一定知道什么是Ping,也一定都使用过ping,一般都用来看这个网络是不是畅通的
比如上面这个,我ping了一下我网站的地址,它返回了四个回复,表示可以连通。虽然我们经常用ping命令,但你知道ping的原理是什么吗??它是如何工作的呢??下面就带你来了解一下:
Ping的工作流程
Ping命令是基于ICMP协议工作的,前面我们提到了一点ICMP的内容。它是封装在IP数据包里的,工作在网络层,是IP协议的助手
开始执行ping命令:
- 当我们的ping命令执行后,源主机首先会构造一个icmp请求报文,其中请求报文中类型字段为8,序列号主要用于区别多个ping发送的数据包,为了计算时间,也会在数据部分加上发送时间。
- 然后由icmp协议将这个数据包和ip地址一起交给IP层,IP层将ip地址作为目的地址,本机ip作为源地址,协议字段设置为1,表示ICMP报文,最后构建一个IP数据包。
- 接下来需要加入MAC地址,如果在本地的ARP映射表中发现了其IP对应的MAC地址,那么就直接使用,否则通过ARP协议获取到MAC地址,并由链路层封装一个数据帧,目的地址为MAC地址,并附加一些信息。通过物理层发送出去
- 对方主机收到这个ICMP请求报文后,先在链路层检查其目的MAC地址和本机MAC地址是否相同。接收后给IP层,IP层提取出ICMP报文。然后会构建一个ICMP回送响应报文,发送给主机A
- 在规定时间内,如果主机A没有收到ICMP响应报文,则认为该主机不可达;接收到了则认为该主机可达,然后计算出来回时间
可以看出ping这个命令使用了ICMP的为8和0的两种查询报文类型
traceroute(tracert)
作用:
- 故意设置特殊的TTL,追踪经过的路由器
- 故意设置不分片,从而确定路径的MTU
在发送端主机发送IP数据包时,将IP包首部的分片禁止标志位设置为1。有了这个标志位,途中路由器对大于MTU的数据不会进行分片,而是将包丢弃。随后通过一个ICMP的不可达消息将数据链路上MTU的值一起发送给主机。不可达消息类型为[需要进行分片但设置了不分片位]