网络层IP详细分析+数据链路层详细分析(java开发)+应用层DNS协议

IP报头的内部结构
- 4位版本
由IPV4和IPV6两种选择,4位bit - 4位首部长度
表示IP报头的长度,4位bit,最小是45等于20个字节,最大时因为这里的单位时4个字节,1111,2的4次方减1等于15,154等于60个字节 - 8位服务类型
由四种类型,最小延时,最大吞吐量,最高可靠性,最小成本,用0和1的排列表示其中一种,8位只有4位有效,其中一个为1,其余的为0,之后的数据用该基准传输 - 16位总长度
表示IP的总长度,即载荷和头部,限制单次传输长度大小 - 16位标识 3位标志 13位片偏移
需要放在一起作用于传输时拆包组包,如果一次传输的数据超过IP载荷的长度,就要把数据拆成多个数据包传输。- 16位标识
用于标识一个数据包是属于同一段数据,最后组包时依靠标识判断 - 3位标志
用于标志一个数据包是不是这段数据的结束位置,告诉接收方是否传输完毕 - 13位片偏移
用于记录一个数据包在一段数据的位置,作为判断最后组包组成的顺序
- 16位标识
- 8位生存时间
一个数据包在网络的最大存活时间和最大转发次数,每次从路由器转发出去就减1(交换机不算),防止数据包在环路网络无线转发。
对于一些需要出入国境的网关,会延长时间或者加大转发次数(实际上64次已经可以覆盖全球网络的设备了) - 8位协议
标识IP载荷上层是什么协议,如UDP和TCP - 16位首部检验和
用于检查IP报头的正确,之后的载荷即UDP和TCP已经在传输层检验过了
在路由器转发时,需要检验IP头部,只有到目的地址就会把后面的载荷检验 - 32位源IP地址 32位目的IP地址
标记发送方和接收方的IP,路由靠这两个地址转发 - 选项
和UDP、TCP报头的选项一样,可选可不选,一些属性 - 数据
通信时传输的数据,这里的是传输层传过来的数据
地址管理
虽然32位IP地址已经是非常大的数字 0-42亿9千万(用来表示一个设备的地址,需要唯一性)但42亿这个数字已经不足以满足现在上网的设备数量了,那么如何解决这个IP分配的问题呢?程序员们想到了三个方案:
动态分配IP地址
本质上来说就是当有设备上网时,就分配IP地址,下线了不使用网络就把IP地址给其他的设备。
虽然这样的想法看起来可以解决,但是只能是无法真正的把隐患消除,只是缓解这个问题带来的压力。
NAT网络地址映射(面试不考,但是重要,有价值)
这个解决方法是目前互联网模型的基本规则。
- 公网IP 是唯一的,即公共网络,还有外网
- 私网IP 不是唯一的,但是在同个局域网的私网IP不能重复,不同局域网的私网IP可以重复
(私网IP只有三类:1. 10.* 2. 172.16 - 172.31.* 3. 192.168.*)
简单来说整个流程:使用在同一个局域网的设备在转发数据时,通过公网时把IP地址都改成同一个,返回时就根据IP地址定位到局域网,再根据端口号再定位到具体一台设备,还要把IP地址换成原来的IP地址,怎么来的怎么回来。
最核心的要点就是把一个局域网的上千台的设备不再需要分配同样数量的IP地址,当数据需要转发到不同的局域网时,增加公网网关,把IP地址改成统一的公网IP地址。
还有接收数据如何准确的把数据转发到目的地址?其实每次公网网关把IP地址修改时,都会记录原来的IP地址和端口号,当作一个映射关系,所以当需要接收时,匹配IP地址和端口号正确就会把数据转发出去。
也许有个疑问——IP地址在同个局域网不能相同,但是要是使用了同一个端口号呢?会不会无法正确的传输数据?
公网网关早就留了一手,当检查到这次放进“记录映射关系表”的端口号有重复时,就会在这个重复的端口号的数值上加一,防止之后的转发出现问题。
IPV6
使用IPV6这个方法原理是增大IP地址的范围。简单来收就是IPV4不够用是吧,那给你IPV6,包你用的。
IPV4在IP协议中使用32位4个字节来表示。
IPV6是使用16个字节来表示IP地址,4个字节的IP范围是232,但是这16个字节的范围不是232*4,而是232*232*232*232,是个天文数字,这个数字对于我们来说根本用不完。(所以IPV6的范围非常大)
但是在实际情况下,IPV6的普及非常低,为什么呢?
因为IPV4和IPV6不兼容,而且软件基本都是用IPV4的,想要使用IPV6就需要更新设备,但是带来的效果并没有那么大。相比NAT不需要更新设备,只需要更新软件版本,加入这个功能就行。所以企业都不会选择这个方案。
但是在中国,IPV6的普及率达到了80%,为什么呢?
因为IPV4是美国人发明的,而且美国人在2018年还用这个来控制我们,俗称“掐脖子”。当时我们国家意识到这个问题很严重,毕竟要是美国人再次搞我们,我们没了网络,后果不堪设想。于是就下发命令中国的企业都要升级设备,让设备支持IPV6,所以就到了目前的情况。
网段划分
一段IP地址由网络号和主机号组成。如:192.168.100.21,这一段的前三个数字就是网络号,后面的一个数字是主机号,也是用来区别同个局域网中不同主机的部分。要是不同的局域网,就是前三个数字有所不同,而且不同局域网的主机号可以一样。
还有子网掩码,通常我们在电脑上见到的是255.255.255.0,用二进制数字来表达就是 1111 1111 1111 1111 1111 1111 0000 0000,和IP地址配合使用。比如192.168.20.22/24,这里的24就是子网掩码的24个1,其中1的位置个数表示了网络号占IP地址的多少。这样可以用于区分不同的IP地址是否在同一个局域网中,要是同个网络,直接发本机;要是不同,要走转发。
现在再从这个方面了解路由器。路由器由LAN和WAN这两个不同的连接口。LAN口用来连接同一个局域网,算是“内部口”,这里的设备和路由器的一端组成一边的局域网,就是“内部网”。WAN口算是“外部口”,连接外网,另一个路由器的LAN口,也连接到另一个局域网。从而能看到路由器只有当两边是不同的局域网时,路由器才能起作用。
特殊的IP地址
- 主机号全是0
此IP表示网络层,表示整个网段,不应该分配给具体的设备。 - 主机号全是1
此IP表示该网段内的广播地址,往这个IP上发送数据,就会把数据转发给局域网中的所有设备。 - 环回IP
127.*这一大类都是环回IP,如127.0.0.1就是发送给自己本身。
路由选择
进行IP数据报转发的时候,如果进行“路径规划”呢?
IP协议的路由选择,无法做到“全局”,每个路由器无法看到整个网络结构的“全貌”,但是他只能够知道相邻设备的情况,就可以在自己能看到的范围内做出“较优解”。那么具体是怎么做到路径的选择呢?
简单来说,路由选择在路径选择上就是“问路”过程。当你要从你的学校去一个地方,但是你只知道那个地名和无法导航到全局路线,那么你只能靠“问路”了。当你走到你的学校门口,你可以问问学校门卫,门卫可能也不太清楚你要去的地方的具体位置,但是他给你指了一个方向。你接着往下走,接着“问路”,慢慢靠近目的地,直到问到最后一个人,因为你已经到目的地的附近,那个本地人告诉你那个地方的具体位置,你最后如愿到了目的地。而路由选择就是这样,路由器只知道相邻的设备,不知道你要找到IP地址,所以就给你一个正确的大致方向;但要是这个IP地址是相邻的,就是知道你要找到具体位置,就把具体位置给你。总结就是一直“问路”,不知道给方向,知道给具体位置。
但是在实际情况下,路由器的组织是不统一的,很复杂,就需要路由表。在路由器选择路径时,不是我们真实问路的临时思考再给一个方向,而是每个路由器都有一张路由表,每当被“问路”时,都会查询这张表,要是地点在表中,就是直连网段,直接交付;要是表中查不到精准路由,就给方向,有LAN和WAN内外逻辑方向之分;要是全都匹配不上,就走默认路由,发送给上层路由器(小区域查不到,说明不在这一个小区域,那就往大区域查,能定位到新的小区域,再往细了查)。
网络层决定走哪个网络接口,数据链路层决定具体走哪个网口。
这句话怎么解释呢?网络层只能决定数据在转发时,选择走哪个逻辑出口,选择一个大方向,比如LAN和WAN,但是当选择具体方向时,会交给数据链路层,进行包装,发送到具体走哪个物理网口。
数据链路层(以太网协议)
既然已经提到了数据链路层的相关知识,就把其中包装的具体实现方式体现出来:
目的地址,源地址
这里的地址指的是MAC地址,什么是MAC地址呢?其实是和IP地址打配合的地址,作用在数据链路层上,但是和IP地址有所不同。首先MAC地址每次在路由器转发时,都会更新到最新的源地址和目的地址。还是用问路的方式举例,IP地址就是拿到最原始的起点和终点,一直不变;但是MAC地址是表示现在的两个据点,就是现在的起点和相邻的终点,表示现在的一段路程的起始点,那么就代表需要不停的更新。
MAC地址通常在设备出厂的时候(网卡出厂),都会直接分配一个MAC地址,那么每次更新MAC地址时,都可以准确规划每一步的起始点。
而且MAC地址经常被用作身份标识,把账号和设备绑定,具有唯一性,每个设备中网卡都是不同的MAC地址。
MAC地址都是6位十六进制的数字组成,一个十六进制的数字,表示4个bit,2个十六进制的数字,表示8bit => 1字节,所以MAC地址的存储大小非常够用,无需和IP地址一样,甚至可以给每台设备都添加一个固定的MAC地址。
类型
表示所携带的数据属于什么类型,如果上层传下来的是IP报文,就是IP类型。还有两种类型,表示ARP和RARP两种类型,数据链路层和硬件强相关,MTU取值和硬件特性相关,使用不同的介质,使用不同的数据链路层协议,MTU会不同。
ARP的作用是从IP地址告诉MAC地址,在转发中作用很大,网络通信必须要从ARP知道MAC地址。拿到一个IP地址,会发送一个ARP广播,寻找这个IP地址,于是把MAC地址返回给ARP,存入ARP缓存表,再发包时需要把MAC地址包装进去。
RARP就是反向ARP,在后端开发中,很少起作用。
MTU表示一次能发送的最大数据帧长度(数据+头),只有1500,这样拆分会让传输效率降低,丢包率上升和TCP重传率上升。如果超过MTU会发生IP切片,把数据拆分,这样让网络性能下降。
数据
就是从网络层传来的报文,有很多类型,现在我们只了解到IP报文。
需要注意的是 1500 ,这个数字表示传来的数据包只有这个大小,说明一个数据包不仅需要在网络层进行拆包组包,还需要在数据链路层进行更细的拆分。针对IP协议来说,拆包组包不是按照64KB,而是按照这里的1500,再放进数据链路层的帧格式中就无需重复的步骤。
CRC
属于数据链路层中的校验和,除了这里的数据把帧格式中的所有数据都进行数学公式计算的结果存在这里,每次传输时起始点都进行计算,要是计算结果相同,就说明没问题。
路由器以及三层交换机工作流程与三个通信层的关系
- 物理接口接收到一个数据帧格式数据
- 拆分数据链路层帧头帧尾,帧头中类型部分,如果类型为IP协议,就继续拆分到网络层;如果类型为ARP,就停止拆分,更新MAC地址就可以。帧尾部分有校验和,进行检验,如果计算结果一样就继续。
- 网络层处理报文,TTL减一,如果TTL减到零,就丢弃,说明该报文已经超过转发次数。
- 拆分到网络层,获取到IP报头,在路由表中查询下一跳的路径(知道就具体,不知道就方向)。
- 对比出接口MTU,超过就需要IP分片,进行转发。
- 此时拿到IP地址,就需要知道MAC地址,IP地址中先利用子网掩码判断该IP是否在同一个网段下,若在同一个网段,就发送到本机就行,若不在同一个网段,就需要发送到网关,前者需要查询路由器的MAC地址,后者需要查询网关的MAC地址,然后先在ARP表中查询,要是查询不到,就需要先发送一个ARP类型的数据帧,让相应的IP地址返回MAC地址。
- 有了MAC地址,就可以封装,其中有IP地址,MAC源地址,MAC目的地址,IP数据包载荷。
- 从选定的物理网关发送出去。
- 之后的路由器再次重复该流程,直到转发到目标主机。
核心要点
- IP类型负责传输数据,ARP类型负责找到映射的MAC地址
- TTL机制和MTU出接口保证转发的有效
- 每次进行下一跳,路由器都会筛选出唯一一条逻辑出口之后再筛选出一条具体的物理网口。
- 注意内网和外网的MAC地址, 内网是路由器的IP地址设备中的MAC地址,外网统一的IP地址中的统一MAC地址。
- IP地址不用更行,MAC地址需要更新。
- 只有路由器和三层交换机需要拆分到网络层(区别于ARP和IP类型)。
数据链路层中的协议
除了以太网,还有什么协议。
WIFI,蓝牙,5G,这些都是属于数据链路层中的协议。
应用层DNS协议
应用层是面向用户的一层,需要便于用户使用和操作,不需要专业知识就可以进行上网。、
其中DNS协议就是最重要的协议之一。DNS协议,也是域名解析协议,顾名思义就是我们上网使用的.com一系列域名,使用这些英文拼音就可以登录到相应的网站。其实我们输入的域名在计算机看来就是IP地址,但是用户不需要记忆繁琐的IP地址,就可以进入。而把这些IP地址转成域名的逻辑,就是DNS协议做到的。
其实DNS协议就是简单的把IP地址和域名做了映射。
DNS服务器就是在用户输入域名后,不是直接访问网站,而是先访问DNS服务器,进行IP地址的映射,再进入网站。
那么现在能够上网的设备很多很多,太大的并发量为什么没有把DNS服务器搞崩溃?
有两种应对方法:
- 对域名进行了缓存,每当有重复的域名访问时,如果有映射关系的记录,就不会重新访问DNS服务器,而是直接映射到IP地址就行。(但是这样的方法,只能治标不治本)
- 分布式访问 维护原始数据的DNS服务器称为“根域名服务器”,大概只有十几台最原始的“根域名服务器”。所以为了减轻压力,很多运营商和企业都会搭建镜像服务器(直接粘贴复制根域名服务器),就只需要访问就近的DNS服务器就行,这样压力被分散到很多台不同的DNS服务器上,也就是分布式访问的解决方法。
而且DNS服务器存储了各种一级域名(.com .org .cn .us)再分支到二级域名,三级域名,这样查询起来不用遍历所有域名,只需要根据后缀来查询。
更多推荐




所有评论(0)