- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
本文分享自华为云社区《网络层概念太多搞不清?这里一次性给你做好总结》,作者:breakDawn。
网络层都是 ip 的一堆东西,有些同学可能早就忘记 ip 层里究竟有些什么东西或者协议,也忘记了网络报文走到网络层会发生什么,这对于涉及网络传输开发、组网的同学来说,还是很有必要了解 1 下的。
1.1 分类表示法:
分类表示法已经不常用了。
格式为
1[7 位网络号][24 位主机号]
网络号全 0 指本网络
网络号全 1 用于环回地址(127.0.0.1)
主机号全 0 时指本住机所在网络
全 1 时指本网络所有主机(广播地址)
因此 A 类地址实际可选范围为 1.x.x.x ~ 126.x.x.x
格式为
10[14 位网络号][16 位主机号]
网络号不可全 0,但可以全 1
范围为 128.x.x.x~191.x.x.x
格式为
110[21 位网络号][8 位主机号]
网络号不可全 0
范围为 192.x.x.x~223.x.x.x
格式为
1110[28 位多播地址]
范围为 224.x.x.x~239.x.x.x
因此看到 224 以上的 ip 要注意
格式为 11110[保留]
用于实验用,因此看到 240 以上的认定不是正常节点 ip
1.1.2 分类表示地址的其他说明
1.2 无分类编址 CIDR
Classless Inter-Domain Routing 无类型域间选路
CIDR 有三种编址方式:
对于 CIDR 编址子网号的全 0 和全 1 没有特殊含义,但不可设置成全 0 或者全 1。主机号的全 0 指本网络, 全 1 指广播。(网络号仍然遵从 ABCD 地址的规则)
值 1 的位置指该 ip 中该位置是网络号和子网号区域
值 0 的位置指该 ip 中该位置是主机号区域。
例子:111111100000000…, 那么前面 8 个 1 就是网络号+子网号,后面都代表了主机号
子网掩码可以简化先比网络再比子网的过程。
IP 报文的首部至少有 20 个字节(160 位),首部如下:
上面可以看到 IP 报文的以下限制:
Q: IP 报文里有什么?可以不按顺序或者字节来讲一讲 A:
路由器可分隔广播域,指的是不同网络号的地址,路由器不会转发广播报文
Hub 集线器在同一个冲突域通信无法分割;交换机在同一个广播域通信,可分割冲突域;路由器实现不同广播域间通信,可分隔广播域。
IP 报文在传输中不会被改变,但是链路层报文的 mac 地址会不断变化。
当 2 个主机在不同的子网时,必须要借助路由才能通信
路由表
假设某个路由器在 N1 网络,他的路由表如下:
3.2 路由网络匹配
如果路由表中的目的网络由很多,怎么确定 IP 和路由表中的目的网络是匹配的?使用 最长前缀匹配, 即前缀匹配得最多的就是目的网络。优化算法可用二叉线索树来确认最长前缀。
3.3 ARP 解析
全称 Address Resolution Protocol,地址解析协议。
从主机发给路由, 或者路由发给路由时,底层还是得封装一层 mac 地址然后往下交给交换机。那么 ip 和 mac 地址的对应关系, 是怎么得知的?答案就是 ARP 协议
本质就是当 mac 缓存表里没有 ip 和 mac 的对应关系时, 主机或者路由会广播 ARP 报文, 对应 ip 方向的交换机会把报文发送回来,这时候就直到 mac 地址和 ip 的对饮关系了。
3.4 RARP 逆地址解析协议
由 mac 地址反取 ip。因为 ip 不存在,无法直接转给给路由。所以会比 ARP 难。过程:
1)将源设备和目标设备的 MAC 地址字段都设为发送者的 MAC 地址和 IP 地址,发送主机发送一个本地的 RARP 广播,能够到达网络上的所有设备,在此广播包中,声明自己的 MAC 地址并且请求任何收到此请求的 RARP 服务器分配一个 IP 地址;
2)本地网段上的 RARP 服务器收到此请求后,检查其 RARP 列表,查找该 MAC 地址对应的 IP 地址;
3)如果存在,RARP 服务器就给源主机发送一个响应数据包并将此 IP 地址提供给对方主机使用;如果不存在,RARP 服务器对此不做任何的响应;
4) 源主机收到从 RARP 服务器的响应信息,就利用得到的 IP 地址进行通讯;如果一直没有收到 RARP 服务器的响应信息,表示初始化失败。
全称 Internet control message protocl,网络控制报文协议他会包装在 IP 的数据报文中,并把首部的协议类型改成 ICMP 那个数字。
首部总共 8 个字节,分别为 2 字节的 ICMP 类型 2 字节的 ICMP 报文代码(类似错误码)4 字节的校验和后面就是数据部分了。
常见的 2 种用途:
源点抑制——发送网络拥塞
终点不可达——无法找到对应 ip 交付地点
时间超时——报文种的 TTL 降为 0,或者分片一直没收集完
参数错误——首部中字段有错路由改变(重定向)—— 主机把数据发给了路由器 R2,但是路由器 R2 发现主机自己本来就可以直达了,于是发给主机该消息,告诉他你要更新路由表了。
差错报告有以下其他特点:
全称 Dynamic Host Configuration Protocol, 动态主机配置协议。当某个局域网内新增了一台主机,这个主机的 ip 是怎么生成的呢?这就会用到 DHCP 协议。主机所在网内会有一台 DCHP 服务器。当新主机加入时,发生如下之事:
有以下几个注意点:
DCHP 可以认为是基于 UDP 的应用层协议,但本质是为了寻求新主机的动态 ip 地址
可以理解为 在一个复杂的拓扑图下, 怎么选择最优的一个路由做目的地址的下一跳。有 2 种方式:
6.1 RIP 协议
全称 Routing Information Protocol,路由信息协议是一种动态路由信息协议。
所以 RIP 本质也是基于 UDP 的应用层协议,但是目的是为了网络层的最优路由选取。
6.2 OSPF 协议
open shortest path first,开放最短路径优先协议指路由器里有全网的拓扑结构,使用最短路算法计算最优路由因此路由会把自己的连接情况通过 OSPF 协议发给所有其他路由,以建立拓扑图。这个是属于 IP 层的协议,不借助 UDP。
RIP 和 OSPF 是自治网络系统 AS 里的选路措施。AS 里的选路措施被称作 IGP(内部网关协议)1 个 AS 里只会有一种选路措施。
而跨自治系统的协议叫 EGP(外部网关协议)通常使用 BGP 协议
6.3 BGP 协议
Border Gateway Protocol 边界网关协议
Q: RIP 协议下路由表什么时候更新?
A:
Q: 路由中毒是什么?
A:路由中毒是指在路由信息在路由表中失效时,先将度量值变为无穷大的数,而不是马上从路由表中删掉这条路由信息。 然后再将中毒路由信息发布出去,当相邻的路由器收到该中毒路由就可以通过其度量值是 16,说明该路由是无效的。
??因为 RIP 协议中的度量值其实就是跳数,而 RIP 协议的跳数最大是 15,大于 15 的目的地被认为是不可达,所以当其度量值为 16,就表示这是一个无效路由,这就是所谓的路由中毒,这个数字在限制了网络大小的同时也防止了一个叫做“记数到无穷大”的问题。
Q: 收到中毒路由的路由器会怎么做?
A:收到中毒路由信息的相邻的路由器会发送一个毒性逆转的信息,表示已经收到中毒路由信息。
那么为什么收到中毒路由的路由器为什么要回复一个毒性逆转的信息?
这是因为如果不回复的话,那么发送中毒路由的路由器就会一直以广播的形式发送中毒路由,直到相邻的路由器收到并回复一个毒性逆转的信息。
UDP 的时候会用到多播
7.1 IGMP 协议
internet group message protol, 网络组管理协议负责收集和解释一个网络中的组成员信息 IGMP 协议应用于路由器。
7.2 MOSPF 多播路由选择协议
多播开放最短通路优先(Multicast Open Shortest PathFirst,MOSPF)协议是 OSPF 协议的扩展使用多播链路状态路由选择来创建源点基准树。这个协议需要一个新的链路状态更新分组,把主机的单播地址和组地址或主机负责的地址联系起来,这个分组就称为组成员关系 LSA。此外,这个数可以保存在高速缓存中,以便以后有同样源点/组地址对的分组可以使用它。
8.1 VPN
需要建立专用通道当专用 A 试图向专用 B 通信时,会先加密,再通过加密隧道发到对方内网,具体报文内容不会和互联网直接接触。
8.2 NAT
内外网转换用的一个东西, 公网 ip 和内网 ip 互转。
8.3 移动 IP
ip 从子网 A 变道子网 B。在本网时,按 TCP 通信要漫游到外网时, 注册一个转交地址本地代理接收地址,开启隧道数据发送到外网在外网时,使用代理 ip 发送数据回到本地时,会注册并转交之前的地址
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我正在开发一个 Android 应用程序。在此应用程序中, Logo 栏显示在所有页面( Activity )上,或者我们可以说它在所有页面上都有标题。这个 Logo 栏有几个图标,如主页、登录、通知
我正在使用 hadoop 使用开源接口(interface) HVPI 处理视频。然而,inputsplit 的实现,更准确地说是在 isSplitableobContext (context, Pa
1. 是什么? MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System
有没有办法使用 c++20s 的概念来检查一个值是否满足某些要求? 假设我正在编写某种使用分页的容器,并且我想让页面大小成为模板参数。 template class container; 我可以使用带
如何在 ArrayList 中循环遍历 ArrayList? 例如,如果我有一个名为 Plants of Plant 对象的 ArrayList。每个 Plant 对象内部都有一个随机数量的花名。我如
如何在UML类图中绘制C++概念? 具体来说,我有以下代码: template concept Printable = requires(T a, std::ostream &where) {
我有兴趣制作一个网站,在访问者访问时闪现整个网络历史记录。我计划使用 JavaScript 来获取每个观看者计算机上的历史记录,并根据他们拥有的内容以不同的速度对其进行动画处理。我的想法是使用 his
有一个模板定义,例如: template void foo( void ) { /* ... */ } 如何定义一个概念,以便N必须为非零正值(N> = 1)? 就像是: template con
封装是信息隐藏还是导致信息隐藏? 正如我们所说,封装将数据和函数绑定(bind)在单个实体中,因此它为我们提供了对数据流的控制,并且我们只能通过一些定义良好的函数来访问实体的数据。因此,当我们说封装导
下面有一个简单的代码片段,它使用以下方式进行编译: g++-9 -std=c++2a -fconcepts 这是试图定义一个需要存在函数的概念。我希望输出是"is",但事实并非如此……知道为什么吗?谢
我有一个普通二元运算符的概念 template concept is_binary_operation = requires (const T& t1, const T& t2) // e.g
我正在c++ 20中实现具有启发式功能的搜索算法。 我试图用类似这样的概念来约束我的算法可以使用的功能: template concept Heuristic = requires(SelfType
我需要了解 SAS 如何读取/执行数据步骤。当我查找有关 SAS 如何读取数据步骤的信息时,我似乎只找到有关它如何读取以进行合并的信息,我不了解与常规数据步骤相关的信息。比方说,我有这行代码: dat
最近我看到一个关于“框架”的问题,如果“框架”有不同的类型或概念。那么,存在不同“类型”的“框架”吗? 例如:NodeJS 是一种“类型”(概念),而 Hibernate ORM 是另一种“类型”(概
如何使用任何技术禁用或清除客户端浏览器 Cookie 我认为使用 javascript 可以用于任何技术 最佳答案 var cookies = document.cookie.split(";");
我正在使用 target = "_blank" 单击链接时生成新选项卡。但是,浏览器会将焦点移至该选项卡。 有没有办法让焦点保持在当前标签页上? 回答摘要 基本上,只需发送一个模拟控件点击的当前事件。
我正在尝试在我的 android/firebase(cloud firestore) 应用程序上添加一项需要其他用户批准/拒绝的功能。例如,当 Air&BnB 上的用户想要预订一个地方时,所有者必须批
这个问题在这里已经有了答案: mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... expec
public class MyClass { public static void main(String[] args) { System.out.println("Hell
我是一名优秀的程序员,十分优秀!