作为一名Wi-Fi研发工程师,断网断流问题的拆解可谓是家常便饭,那么如何练就一身手到擒来的操刀本领呢,跟着小编一点点解开它的面纱,我计划将从协议基础知识、协议规范、协议栈源码分析、debug手段、日志分析......一点点开搞~
接上一篇TCP/IP(五)- 我确定可以说清楚IP, 我们继续分享;
5 IP协议相关技术
IP,网络协议,其目的是将数据包传递到目标主机,思考一个问题,想要完成这个过程,需要哪些必不可少的步骤呢?(1、2、3时间到)
(1)需要完成目标主机IP&MAC地址的解析;
(2)数据包传输过程中异常处理的功能;
5.1 IP协议是否可以完成以上所有工作
很显然不可以,根据前四篇文章的介绍,我们知道,应用发送一个数据包,需要经过传输层、网络层、数据链路层以及物理层层层封装,而不同的层次都负责了不同的任务,例如传输层的是按照端口传输,网络层是按照IP地址传输、数据链路层是通过MAC地址传输,物理层主要负责数字信号和电信号/光信号的转化,因此仅仅依靠IP协议是根本无法完成传输的,我们举一个非常通俗易懂的例子,我们在终端发起一个ping www.baidu.com的命令,是如何得到服务器回复的(1、2、3时间到)~ (1)会话层:首先,服务器并不能识别字符串代表什么,因此需要通过DNS解析一个IP地址,发送端发送一个HTTP会话到这个IP地址;
(2)传输层:添加传输层首部,系统为这个数据包分配一个端口号,发送端使用该端口号向接收端发起请求,建立socket连接,然后发送给网络层;
(3)网络层:添加网络层首部,网络层收到这个数据包之后,查找路由表将数据包转发给接收端,这里可能需要很多次转发,当然这个路由表是在路由侧维护的,然后发送给数据链路层;
(4)数据链路层:添加数据链路层首部,通过邻居协议ARP(arp request/reply)/ipv6邻居协议(NS/NA)查找接收/发送端对应的MAC地址;
(5)物理层:通过传输媒介将数据包发送到空口当中,直到到达接收端;
涉及到的协议:
(1)应用层
http - www访问协议;
(2)传输层
TCP - 为HTTP提供可靠的数据传输;
UDP - 传输音频、视频流,包括DNS也是基于UDP实现;
(3)网络层
Icmp - 链路传输质量控制,延时、MTU路由发现、差错检查、链路可达等;
DNS - 实现域名&IP之间的转换、网络校验;
ARP - 实现IP地址&MAC地址之间的转化;
......
可以看到一个数据包的传输是需要经过多种协议协同配合的,因此本章我们简单整理下各个协议细节;
5.2 DNS
DNS request:
DNS response:
DNS的主要作用就是实现将由罗马字和点组成的字符串转化为计算可以识别的IP地址;DNS协议同时适用于IPV4&IPV6;
5.2.1 为什么需要DNS协议
试想一下,如果没有DNS协议,我们想要访问一个服务器或者主机时,都需要输入对应的IP地址,在现代网络中,一个网络拓扑结构中存在大量的机器,如果我们想要实现互相的通信,就必须人手一本IP”新华字典“,显然这样是不现实的,这个时候我们如果只需要输入主机名/域名,就比较方便了;
5.2.2 DNS域名系统的作用
在端到端的通信过程中,目前无非两种方式,通过IP地址或者主机名,IP地址不方便记忆,通过我们会使用主机名进行通信,DNS服务器可以将这个主机域名转换为IP地址;
Linux系统上通常可以使用nsloopup查询IP地址
-MT:~$ nslookup www.baidu.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 220.181.38.150
Name: www.a.shifen.com
Address: 220.181.38.149
Name: www.a.shifen.com
Address: 240e:83:205:58:0:ff:b09f:36bf
Name: www.a.shifen.com
Address: 240e:83:205:5a:0:ff:b05f:346b
5.2.3 Internet DNS域名的树形结构
上图展示了 DNS 服务器的部分层次结构,从上到下依次为根域名服务器、顶级域名服务器和权威域名服务器。域名和IP地址的映射关系必须保存在域名服务器中,供所有其他应用查询。显然不能将所有信息都储存在一台域名服务器中。DNS使用分布在各地的域名服务器来实现域名到IP地址的转换。
域名服务器可以划分为以下四种不同的类型:
-
根域名服务器
:根域名服务器是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器的域名及其IP地址。因特网上共有13个不同IP地址的根域名服务器。当本地域名服务器向根域名服务器发出查询请求时,路由器就把查询请求报文转发到离这个DNS客户最近的一个根域名服务器。这就加快了DNS的查询过程,同时也更合理地利用了因特网的资源。 -
顶级域名服务器
:这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时就给出相应的回答(可能是最后的结果,也可能是下一级权限域名服务器的IP地址)。 -
权限域名服务器
:这些域名服务器负责管理某个区的域名。每一个主机的域名都必须在某个权限域名服务器处注册登记。因此权限域名服务器知道其管辖的域名与IP地址的映射关系。另外,权限域名服务器还知道其下级域名服务器的地址。 -
本地域名服务器
:本地域名服务器不属于上述的域名服务器的等级结构。当一个主机发出DNS请求报文时,这个报文就首先被送往该主机的本地域名服务器。本地域名服务器起着代理的作用,会将该报文转发到上述的域名服务器的等级结构中。本地域名服务器离用户较近,一般不超过几个路由器的距离,也有可能就在同一个局域网中。本地域名服务器的IP地址需要直接配置在需要域名解析的主机中。
5.2.3 DNS域名解析过程
DNS域名解析有两种方法:递归查询 & 迭代查询;
递归查询:
递归查询就是,如果本地主机想要访问一个服务器资源,本地域名服务器并不知道这个服务器域名对应的IP,那么本地域名服务器将携带这个请求向上一级域名服务器查询,直到查询到目标IP为止,用一张图来说明就是:
迭代查询:
相比递归查询,迭代查询不同的地方在于,每一级DNS域名服务器并不会抓发dns请求,当一个DNS请求到达一个DNS服务器后,如果这一级DNS服务器找不到目标IP地址,将会返回给上一级一个推荐的DNS域名服务器,接下来主机则会向这个推荐的DNS服务器发起请求,直到查询到这个目标IP地址,用一张图来说明就是:
5.2.4 DNS主要记录
IP以及域名的对应关系只是DNS系统的一部分,DNS域名系统管理的信息还包含如下部分:
5.3 ARP
ARP,又称Address Resolution Protocol地址解析协议,用来获取设备IP对应的MAC地址,ARP只适用于ipv4,IPv6对应的寻址协议是ICMPv6;
5.3.1 ARP报文格式
ARP包含两种包类型:arp request、arp response;
//arp request
//arp response
5.3.2 ARP是如何获取到对端MAC的
这里使用一张图来说明:
值得注意的是arp request是广播包,arp reply是单播包;
5.3.3 ARP缓存
通过上文我们知道,ARP协议是为了发送数据包之前获取到接收端的MAC地址,那么,如果每次发送一个数据包就需要发送一次arp,这显然增大了网络流量,传输效率也会很低,因此,我们通常会把获取到的IP地址 - MAC地址映射关系保存到缓存表里一段时间,下次发送数据包的时候就需要重新发起请求,不过,这个缓存表只能保存一段时间,超过这个期限将会重新请求;
发送端发送arp时,如果接收端没有回复时将会重新尝试,重新尝试的次数一般写在设备这个节点
cat /proc/sys/net/ipv4/neigh/wlan0/ucast_solicit(广播)
cat /proc/sys/net/ipv4/neigh/wlan0/mcast_solicit(组播)
5.3.4 ARP协议的必要性
ARP作为IP - 数据链路层的纽带,用来实现IP - MAC的查找,我们解读其必要性通过解释这么一个问题来说明;
问题 - 如果我们发的数据包没有IP或者MAC,数据包是否可以到达目标主机?
我们用这个图来解答这个问题;
首先,如果PC1向PC2发送数据包不需要IP地址,当设备PC1向PC2发包时,在路由学习MAC地址之间,并不知道这个数据包应该发给谁,这个时候路由可以选择向全世界所有的设备发包,在学习到所有MAC地址之后维护到路由表里,这样将造成极大的流量浪费&系统资源;
其次,如果PC1向PC2发送数据包不需要MAC地址,PC1向PC2发送数据包时,只有IP地址,当这个数据包到达Route1之后,其并不知道下一路由是谁(下一路由就是MAC地址中的DA mac),或许也可以向所有设备发包,但是这样就同样会导致流量浪费;
所以IP&MAC缺一不可;
我们按照上图实际抓空口包来看一下这个过程:
5.4 ICMP
5.4.1 ICMP扮演的角色
基于此前的文章分析,我们知道ICMP可以用来进行MTU路由发现,这一章就集中整理下ICMP都用来做什么;
(1)MTU路由发现,具体功能我们在4.4.3已经分析了,忘记的同学可以回去再看看;
(2)确认IP数据包是否正确发送,如果未正常达到,发送ICMP包通知具体原因;
(3)网络质量探测,通过ping延迟判断网络是否是通的以及干扰程度;
(4)设备软件是否存在问题,例如通过ping入测试设备软件RX性能的健壮性,关于这个话题-如何定位ping入问题本后的软件原因,小编想了想后边还是单独拉一个专题出来整理(Wi-Fi兼容性);
(5)工具刀,如果我们把一个网络结构想象成一个庞大的电路设计,如果其中某处供电有问题,我们都可以使用ICMP包进行检查,小编做这个比喻的目的就是为了提醒大家,ICMP包的作用并不是一两句话可以陈列完毕,在日常开发过程中,它可以做到方方面面,开发者脑洞有多大,他的作用就有大多,所以我们拿到一份网络报文,如果看到ICMP包,请先尝试解读一下他的上下文,在为的功能定性;
这里例举一种IP包没有正常送达目标机器的错误通知机制:
5.4.2 ICMP消息类型
-
ICMP目标不可达消息(类型3)
当路由器无法将IP数据包发送给目标地址时,会给发送端返回这个消息,我们实际当中遇到最多的就是代码1(Host Unreachable),它是指路由表里没有目标主机,或者目标主机没有接入网络;消息4(Fragmentation Needed and Don't Fragment was Set)就是4.4.3节提到的路径MTU发现;
还有一些其他的消息类型如下,这里不一一描述,小伙伴可以在实际开发当中遇到时在临时抱佛脚:
5.5 DHCP
DHCP,即Dynamic Host Configuration Protocol动态地址分配协议,可以实现为每一台主机分配IP地址的协议,它同时适用于IPV4、IPV6;
5.5.1 DHCP优势 - 即插即用
DHCP server可以主动为每一台主机分配IP地址:
5.5.2 DHCP工作机制
客户端设备如何从DHCP服务器上获得IP地址,一般来说DHCP分配IP地址有两种方式:
(1)DHCP server选出一个特定的IP分配给IP;
(2)为某个MAC地址分配固定的MAC;
//DHCP整体流程
如果读到这里,你觉得有所收获,就关注下小编的公众号,未来一起进步