网络层的个人见解(目前不全)

网络层

两个平面

数据平面: 转发 将数据从路由器的一个端口输入 并 在核实的端口输出 通过路由表或者流表对数据进行处理

控制平面 :路由 确定 分组从源到目标的路径 传统方式下形成路由表 SDN模式下从形成流表

IP数据报的格式

固定头部 32bit * 5 = 20B

首部

固定头部

4bit 的版本号 代表是ipv几 ipv4 就是 0100 ipv6 就是0110

4bit 的首部长度 代表到哪里是 data 部分(Tcp的段 或者 UDP的数据报)首部长度的一个值当 32bit使用 所以首部长度最少是5(0101) -- 这个5 是因为固定头部

8bit 的 区分服务 (已经废弃 不使用了); 为何废用 因为这个字段是用来区分 数据包的优先级的 但是如果厂家都把优先级设置的很高,这个就不起作用了

16bit 数据报总长度


16bit的 标识 和 4个bit的 标志 和 12bit的 片移量 这个三个是和分片相关的


8bit 的 生存时间 (这个数据包的有效时间) : 简单的实现 每过一个路由器就减一 到0了 就抛弃了 通过ICMP给源主机一个信号 8bit 的 上层协议 是交给 TCP 还是 UDP

16bit 的首部校验和 用来校验数据报的头部 不校验数据部分 判断这个分组在传输过程中头部有没有出现问题


32bit 的源ip

32bit 的目的ip

可选部分

数据部分

分片 和 重组

FDD1 -》 路由器 -》 局域网 假如 FDD1的 最大的(IP)data 是 3000 局域网 最大的IP(data) 只有 1400

所以就要对 FDD1的 ip数据报进行分片 但是又不能直接分 , 直接分的话 只有第一个分片有 头部

分片

20字节的头 3000的data

分成如下两部分

20字节(copy原来的) 1400 data 我自己定义为A段 20字节(copy原来的) 1400 data B段

20字节(copy原来的) 200 data C段

接收端 如何判断 这三个是一部分 如果过来的时候是乱序的怎么办

片移量 A的为 0 B的为1400 C段的是 2800

但是为了节省空间 和方便计算 固定头部的一个片移量 当 8 用 所以 A 的是 0 B的是175 C的是700

会不会出现小数 ?不会 因为切的肯定是8的倍数

为啥不是 下一个路由器 进行合并? 因为路由器很忙 这样会加大路由器的负担

目标主机来进行合并 ; 如果收到的不全 就会直接全部丢了

对上面三个字段 做一个解释

16bit的 标识 和 4个bit的 标志 和 12bit的 片移量

标识 就类似是一个 id号唯一标识 一个内容 被分片后的标识id是一样的 标志段 代表这个片后面是否还有其他片 1有 0没有

片移量 就是算出来的 顺便还可以排序 由小到大

举例 A x 1 0

B x 1 175

c x 0 700

IP到底指的是什么

IP地址 32位

对 主机 或者 路由器的接口编纸

接口 主机/路由器 和 物理链路的连接处

一个IP地址 和 一个接口相关联

主机1(192.168.1.1)

主机2(192.168.1.2)

主机3(192.168.1.3)

(192.168.1.4)

路由器

(192.168.2.4) (192.168.3.4)

主机1(192.168.2.1) 主机1(192.168.3.1)

主机2(192.168.2.2) 主机2(192.168.3.2)

主机3(192.168.2.3) 主机3(192.168.3.3)

路由器 一定有 两个及两个 以上的ip地址

主机 也可以 有 多个ip地址 可以插多个网卡

子网

纯子网

必备条件: 具有相同前缀,而且主机与主机之间通信不需要借助路由器(一跳可达)可以借助交换机

局域网采用多点链接 (都连接到交换机)

长途链路(我们不希望绕) 采用点到点

IP分类

32位

0000 0000 0000 0000 0000 0000 0000 0000

A类 网络(巨大的网络)-单播地址

0 000 0000 0000 0000 0000 0000 0000 0000

网络号有 2的7次方减二 全0和全一的 不用(ip规范)

每一个网络内的主机个数位 2的24次方 减一

还有一位 是 第一位 规定为0(为了区分类型)

B类网络 -单播地址

10 00 0000 0000 0000 0000 0000 0000 0000

以10 开头

网络号有 2的14次方减二

每一个网络的主机号 为 2的16次方减二

C类网络 -单播地址

* 0000 0000* 0000 0000 0000 0000

以110 开头

网络号有 2的21次方减二

每一个网络的主机号 为 2的8次方减二

D类网络 -多播地址(不可以分配为公网ip)

E类网络- 预留地址(不可以分配为公网ip)

特殊的ip地址

约定

子网部分 -- 全为0 本网络

主机部分 -- 全为0 本主机

主机部分 -- 全为1 广播地址

特殊ip

127.X.X.X 回路地址 就是网络层收到这个ip的数据 直接反向朝上

eg: 127.0.0.1 代表的就是本主机

内网ip (永远不会被当做公用地址来分配)

路由器 不对 目标地址是 内网的地址 进行分组转发

A : 10.0.0.0 - 10.255.255.255 子网掩码 8

B: 172.16.0.0 - 172.31.255.255 子网掩码 16

C: 192.168.0.0 - 192.168.255.255 子网掩码 24

互联网的路由

路由是由网络为单位 而不是ip地址为单位 ip地址那么多,太乱了,而且复杂,而且计算压力也很大

举个例子 发快递 驻马店 往我家 洛阳 孟津县发 中途走的时候 会直接导航 孟津县吗,这多复杂

一定是先找到洛阳市,然后在洛阳市内再去找孟津县

路由器的转发表

转发表的字段:目标子网号,子网掩码,下一跳,接口(端口)

目标子网号,子网掩码, 下一跳,接口(端口)

203.38.73.0 255.255.255.192 IPx Lan1

203.38.64.0 255.255.255.192 IPx Lan2

default - IPz Lan0

转发算法

当一个ip到达后

将ip地址 和 子网掩码进行 与操作 拿到对应的子网号,再和转发表的子网号进行对比

如果找到了 就到对应接口的下一跳 拿到其对应的ip地址 再通过ARP协议 转为MAC地址交给下一层封装成贞 如果没找到 就从默认表项 转发出去发出去 就是默认网关

匹配策略 : 最长前缀匹配

当一个ip到达后,发现多个表项都能匹配,就选择子网掩码最大的,因为匹配更精确啊

路由聚集后通告

当 AB两台主机通过查找转发表 发现 下一跳 在同一个子网 先聚集在 向外进行通告

到达目的地后 可以根据转发表 在细致的转发到不同的子网

主机如何获取一个Ip

  1. 网络管理员分配好

  2. 通过 DHCP 服务器 分配

DHCP 过程 一台主机连接过来了 ,想要向DHCP发一个请求, 没有ip地址就用32位全0 ,那目标地址呐,就用32位全1的广播地址

DHCP收到后 就返回一个 ip地址 以及ip地址的租用时间,回应的目标ip地址也是32位全一

这台主机 收到后,会在给DHCP一个响应,DHCP也再给 这个主机一个响应 就分配完了

举个例子 ,相当于 打仗时候,我没有枪,然后大喊一声,谁有枪,分配枪的人听见了,也大喊一声,我有枪,然后我又大喊一声这把枪给我,分配枪的人大喊好的 类似这个过程,但是不太严谨

网络地址转换NAT

由于内网是 不被路由器所转发的 , 所以需要网络地址转换

为啥要用内网 ; 一个机构只用一个 公用的ip地址

为啥只用一个; 就好像你问 大山里的孩子为啥都不买 苹果15promax

很省钱 , 内网ip不要钱

内网ip更改了,不需要通知外部

外网地址变了 但是内网地址可以不变

外网看不到我内网的结构,相对来说比较安全

NAT路由器 的实现

有外网的端口号 来映射 内网的ip

前提 路由器工作在 第三次 网络层,传输层工作在第四层 ,所以是可以修改端口的

模拟一下 发送的过程 138.76.29.7(外网地址)

内网的 10.0.0.1 发送一个数据报到 128.119.40 的 80端口

Sender : 10.0.0.1 3345

D : 128.119.40 的 80端口

到达 NAT路由器 会往NAT的表中添加映射关系

WAN side addr LAN side addr

138.76.29.7 5001 10.0.0.1 3345

经过路由器就变为了

Sender : 138.76.29.7 5001

D : 128.119.40 的 80端口

目标主机收到消息后 会给一个回应

到达NAT路由器前

Sender : 128.119.40 的 80端口

D : 138.76.29.7 5001

经过路由器 查表后

Sender : 128.119.40 的 80端口

D : 10.0.0.1 3345

NAT存在的问题

内网可以主动 向外网发送 并能得到对应的回复

但是如果 外网 主动 给内网的一个主机 就无法走通了 叫 NAT穿越问题

解决办法

方案一:静态的配置,手动把表给写死

方案二:UPNP协议 (动态配置)

方案三:中继(有点类似反向代理),内网启动时,主动联系中继,这样表里面就有映射了,然后外部通过访问中继从而访问到内网

IPv6 了解一下

为啥会出现,因为ipv4 的地址已经被全部分完了,即使有内网和子网 还是被分完了,所以出现了IPv6

还有就是 每经过一个路由器 ttl就会减一 那么check也要变 就会导致 路由器压力过大

固定头部字节为40B 而且不允许分片

最大的改变 是 由32位 变为 128位

128位什么概念 (可以为地球的每一平方米分配1千万的ip地址)

不允许分片,那么来了一个大的 怎么处理 ?

直接返回原主机一个ICMP6的错误报告,你发的分组太大了,让源主机发的小一点;

ipv6的数据报格式

4bit 的版本字段 4bit的优先级字段 24bit的flowlabel

16bit的payload len 8bit的next hdr上层协议(TCP UDP) 8bit的hop limit 就相当于ipv4的ttl

128的源地址 和 128的目标地址 最后的data

V4 过度到 V6 (平滑过渡)

加入现在有两个小岛 (A和B) 在一片汪洋之上

汪洋全部都是v4 小岛全部都是v6

现在 A和B要通信 怎么办 肯定要通过v4

解决方案 A岛的边部路由(通过v4v6协议)将v6的数据报 直接封装到 v4的数据部分 发给B岛

B岛解封装 就实现了 通信

但随着时间的变化,小岛越来越大,海洋越来越小

假如最后 成为了 一片大陆上有 两片海样(C和D)

C的边部路由(通过v4v6协议)将v4的数据报 直接封装到 v6的数据部分 发给D

(这个技术 称之为隧道技术)

完美过渡

通用转发和SDN(软件定义网络)

SDN是一个服务器

前提

垂直集成:比较封闭 私有 创新性小 产业规模也小 简单的来说就是 我这专用硬件上 必须使用专用的操作系统 专用的软件

水平集成:这个硬件可以安装 市面上的软件 操作系统 开放式接口 创新性大 产业也大

控制平面的路由算法 以及 相关的协议

路由算法

分类:链路状态算法(LS)、距离矢量算法(递归算法)

另一种分类为:

全局路由算法(拥有上帝视角,可以看到真个拓扑结构,以及每条边的代价)、
​
分布式的路由算法( 没有上帝视角,只能知道一跳可达的子网的信息,如果说需要到其他的子网,就需要通过这些一跳可达子网(作为媒介)转到目标子网)
​
举个例子:分布式的路由算法 , 就相当于,我一个人住,旁边有三个邻居,我可以对三个邻居知道的信息进行汇总,然后选择,假如我要去北京,这个三个邻居就把他们知道去北京的代价告诉我,例如A邻居告诉我 100 ,B邻居告诉我200,c邻居告诉我300;然后我进行自己选择,例如我到A是50 A到北京是100 那么就代表我通过A到北京是150,其他两个也一样,然后我选择(最小的)即可

还有一种分类是:

静态的:路由随时间变化很慢
动态的:周期性的更新,根据链路的代价变化而变化

原则: 正确性,简单性 (不应该为了让达到最优,而过渡的占用路由的资源,),健壮性(不能太死板,可以哪一个路由被挖断了,需要可以动态的切换,传播时间每次也会发生变化,也需要动态的来选择),稳定性,公平性,最优性(实际上达到是次优的)

路由 : 从源端到目标 怎么走 怎么选择一条合适的路径

第一跳:肯定是给这个局域网的出口路由器(可以通过交换机)

最后一条: 肯定是目标局域网的路由器 通过 交换机 给目标主机

所以 : 路由可以认为是 子网之间的路由,只需要找到 这个子网 怎么 到达目标子网

路由算法就是 选择一个最优(指标较好)的子网 怎么 到达目标子网的路

指标不同算法也不同

如果关心的是跳数,那么边的权都是1

如果关心的是延迟,那么边的权是端到端的延迟

或者 拥塞程度 金钱

路由算法的结果就是 一个聚集树 也就是路由表

LS(链路状态)路由的工作过程

获得网络拓扑和链路代价的信息(获得上帝视角,也就是获得了整个网络拓扑结构和边的代价) -> 使用最短路由算法(Dijkstra)得到路由表(汇集数) -> 使用这个路由表

  1. 怎么获得整个网络拓扑结构?怎么变成上帝视角

    1.发现相邻节点,获得对方网络地址
    2.测量相邻节点的代价(延迟或者开销)
    3.组装成一个链路状态分组(LS组),描述它到相邻节点的代价情况
    4.将分组通过扩散的方法发送到所有的路由器
        就可以让每个路由器获得拓扑和边代价
    ​
    泛洪 有确认的泛洪,可靠的泛洪,如果没有收到确认,就一直发
    ​
    通过  链路状态分组(本身周边有哪些邻居,以及到这些邻居的代价) 在全网泛洪,而且每一个还会给我一个回复,那么延时也知道了(边的代价),然后本身就可以拿到所有链路状态分组,变成上帝了,然后关起们算就完了
    ​
    单对于本身通过一个洪范,其他的路由都已经有了本身的LS组,其他的路由在启动时也会进行洪范,这样每一个路由都有了所以路由的LS组,也就是上帝视角
  2. 泛洪 可能 会存在网络风暴的问题?

    第一个解决办法: LS分组中有一个类似ttl的字段(age字段),每过一个减一,减到0就停止
    第二个解决办法: 版本号(seq的字段) 例如我本身发了个 版本号为4的状态分组,然后为了更新链路状态,又发了个 版本号为5的分组,它的邻居A如果收到了版本号为5了 本身就记录一下,如果再收到版本号为4的就不做处理,来减少网络风暴
  3. Dijkstra算法来算聚集树

    可能会存在网络震荡(以拥塞程度来作为代价)

DV(距离矢量算法)-分布式算法

局部的, 每一个节点都维护了路由表,可以通过事件触发或者 时间截止来更新这个表,如果说有些目标不知道,那就是无限大

举个例子 
A 的 邻居 x、y、z
相互之间交换路由矢量
假如 x到B的代价是 100  y到B的代价是 200    z到B的代价是 300
那么A 是不是可以算出 到xyz的代价 ,xyz把到达B的代价都给A 这样就完成了交换
假如A-》x是10 A-》y是20 a-》z是5
那么a就可以算出
目标(ip和子网掩码)下一跳代价
Bx110
By220
Bz305
根据这个表是不是就可以得到最佳的
目标(ip和子网掩码)下一跳代价
Bx110
这之后 可以通过一些事件或者 定时 的来重复上面的操作 是不是就是动态的获取了,并且也知道我到B到底怎么走

可能还是会有点看不懂,不过没关系 我可以举一个更详细的例子

B -》代价是2 D(D到F的代价是1)

A(A到B的代价是5,到c的代价是6) F

C -》代价是3 E (E到F的代价是1)

D的表和E应该能理解吧   B的表是 B到D的代价加上D到F的代价,D的表里面有,返回一个数字应该不难吧, 
C的表同理
A的表 算出来应该是有两个,但是留哪一个就不说了吧^_^

实际情况肯定是 所以的表中,其实都有所有的节点,这里只是为了方便理解
D的表目标下一跳代价
ff1
E的表目标下一跳代价
ff1
B的表目标下一跳代价
fD3
C的表目标下一跳代价
fE4
A的表目标下一跳代价
fB8

DV的特点

好消息传的快,坏消息传的慢

好消息就是 如果B坏的,其他节点到B的代价就是无穷大,这时候,好消息来了,B好了,B将他的信息发送给邻居,邻居在发给邻居的邻居,很快

坏消息的 如果B是好的 现在B坏了,A发现了B不可达,但是邻居C告诉你我可达啊,c根据他的路由表的下一跳的下一跳。。。。最后发现B不可达,也有可能c是通过A到达B的,C说我可达B,转手下一跳是A,A又说B不可达,但是邻居C又说我可达,哈哈,不就出乌龙了吗,而且还是一个环,所以就需要ttl来解决了,每经过一个路由就减一,减到0就抛弃这个,整体看起来不太顺利,所以坏消息传的慢

解决坏消息传的慢的问题: 水平分裂(很神奇吧,这个方法绝了,太NB了,但是如果有环装的拓扑结构就不行了)

举一个新的例子

A -> B -> D -> C

现在我是D,如果我要到达A 就需要B告诉我 B->A的代价,D里面就有D到A的代价,

现在D对左边的B说假话 就是不告诉D到A的代价(直接说这个代价为无穷大) ,为啥呐,因为你B可以直接到A没必要问我D,如果B来问D到A的代价,那不就说明 A很有可能挂了,这样就减少了坏消息慢的情况

但是 D要对C说真话,要告诉 D到A、B的真实代价,但是反过来C不能告诉D(就是说假话)

LS和DV的比较

消息传递的多少来看 :由于LS每一个节点都需要向全网泛洪LS组,所以LS传递的消息要比DV多,会加重路由器的负担 所以距离矢量DV胜出

收敛时间 LS是一次性算法,DV还要交换多次,所以Ls胜出

健壮性,LS,当一个节点发疯了,说我到其他节点的距离都是0,直接发洪泛,如果不经过这个节点,对其他的影响不大,对整体影响较小,如果是DV的,就会一步一步告诉所有,影响范围很大

所以 LS胜出

自制系统的内部网关协议 RIP OSPF

RIP (DV) 适用于小网

距离矢量 ,每条链路的代价是1 并且如果距离大于15就代表目标不可达

每30s 交换DV 进行通告

每次通告 最多包含25个目标子网

如果180s内没有发生通告

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值