最后更新:2022-01-24 02:06:57 手机定位技术交流文章

「不改变 IP 地址的网关,我们称为转发网关;改变 IP 地址的网关,我们称为 NAT 网关」。
❝
为什么要使用 NAT?
❞
对于公司,它可以在外部使用全球唯一的外网 IP 地址,通常在内部使用一个 B 类内网地址即可。
同理,对于家庭可以在外部使用全球唯一的外网 IP 地址,通常在内部使用一个 C 类内网地址即可。
❝
问题:内网的多个设备使用同一个外网 IP 请求外网服务,外部是怎么样才能知道是哪一个内网设备请求的呢?
❞
「使用 NAT ,它用于多个主机通过一个公有 IP 访问互联网的私有网络,并减缓了 IP 地址的消耗,但是增加了网络通信的复杂度」。
例如如下两个 NAT 转换过程:发送数据时,A 设备内网地址和端口号 => 外网地址与端口号:192.168.2.11:6666 => 173.21.59.10:16666,B 设备内网地址和端口号 => 外网地址与端口号:192.168.2.10:7777 => 173.21.59.10:17777。
「由于同时转换了 Port ,即进行了 端口映射,NAT 也可称为 NA§T」。
ICMP 协议主要是用于「辅助 IP 协议发送与接收数据的,它可以报告错误信息或异常情况」。
「ICMP 协议被封装在 IP 数据报的数据之中,其也分为 报文首部与报文数据。如果需要使用 ICMP 协议,则需要在 IP 协议首部的8位协议中写入1,以表明 IP 数据所携带的具体数据是 ICMP 协议的」。

差错报告报文具体分为「七种类型」,而「大部分的报文类型是由类型的值和具体代码组成的」。具体如下图所示:
询问报文具体分为「两类」,它仅仅是由「类型的值」决定的。具体如下图所示:

常用的 ping 就是查询报文,是一种主动请求并且获得主动应答的 ICMP 查询报文,如下:
ICMP ECHO REQUESTZ:「对 ping 的主动请求进行网络抓包」。ICMP ECHO REPLY:「主动请求的回复」。所以,ping 发的包也是符合 ICMP 格式的,仅仅增加了一些自己的格式。如下所示:
ping 命令执行时,源主机会构建一个 ICMP 请求数据包,其中有两个最重要的字段,如下:
例如 ping www.wanandorid.com 网站,如下所示:
quchao@quchaodeMacBook-Pro cmmp-core-client-android % ping www.wanandroid.com
PING www.wanandroid.com (47.104.74.169): 56 data bytes
64 bytes from 47.104.74.169: icmp_seq=0 ttl=51 time=51.877 ms
64 bytes from 47.104.74.169: icmp_seq=1 ttl=51 time=52.416 ms
64 bytes from 47.104.74.169: icmp_seq=2 ttl=51 time=48.942 ms
64 bytes from 47.104.74.169: icmp_seq=3 ttl=51 time=45.816 ms
64 bytes from 47.104.74.169: icmp_seq=4 ttl=51 time=48.336 ms
64 bytes from 47.104.74.169: icmp_seq=5 ttl=51 time=42.358 ms
ç64 bytes from 47.104.74.169: icmp_seq=6 ttl=51 time=49.428 ms
64 bytes from 47.104.74.169: icmp_seq=7 ttl=51 time=41.963 ms
遇到网络不通的问题时,除了直接 ping 目标 IP 地址,头脑中年还应该有一个清晰的网络拓扑图,并且需要清楚地知道一个包从源地址传到目标地址要经过哪些设备,然后逐个 ping 中间的这些设备或机器,通常的排查步骤如下所示:
此外,除了 ping 之外,我们还可以通过tcpdump -i eth0 icmp,「查看发出的包有没有到达某个点,以及回复的包到达了哪个点,以便更容易推断出错的位置」。
❝
ping 不同一定就代表网络不通吗?
❞
不是,如果不在我们的控制范围内,很多中间设备都是禁止 ping 的,但是 ping 不通不代表网络不通。这个时候就要使用 Telnet,通过其他协议来测试网络是否畅通。
「用于探测 IP 数据报在网络中走过的路径」。
在 IP 数据报的首部中,有一个8位的生存时间 TTL,它表示了 IP 数据报文在网络中的寿命,每经过一个设备,TTL 减1,「当 TTL = 0时,网络设备必须丢弃该报文,并会发送 ICMP 终点不可达差错报文」。
而 Traceoute 则巧妙地应用了 ICMP 终点不可达差错报文与 TTL 机制,为了探测 IP 数据报文走过的路径,它会发送一个 UDP 数据包。将 TTL 设置为1,一旦遇到一个路由器,它就会牺牲了。接着返回一个 ICMP 包,就是网络差错包,类型是时间超时,这样就能知道一个路由器有多远。具体机制如下所示:
这样,源主机就接收到了所有的路径信息,就可以输出该数据报在网络中的路径了。traceroute 命令的使用示例如下所示:
tracert github.com (Windows 为 tracert github.com)
quchao@quchaodeMacBook-Pro cmmp-core-client-android % traceroute github.com
traceroute to github.com (13.250.177.223), 64 hops max, 52 byte packets
1 22.4.93.254 (22.4.93.254) 11.676 ms 7.331 ms 9.620 ms
2 59.40.180.129 (59.40.180.129) 977.679 ms 440.943 ms 10.672 ms
3 49.186.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.186.49) 9.207 ms 12.436 ms 10.636 ms
4 125.176.37.59.broad.dg.gd.dynamic.163data.com.cn (59.37.176.125) 13.202 ms 10.292 ms 28.478 ms
5 183.56.65.6 (183.56.65.6) 11.763 ms 9.236 ms
183.56.65.18 (183.56.65.18) 11.392 ms
6 202.97.94.134 (202.97.94.134) 18.357 ms
202.97.94.150 (202.97.94.150) 18.175 ms
202.97.94.134 (202.97.94.134) 36.600 ms
7 202.97.94.98 (202.97.94.98) 245.161 ms
202.97.12.29 (202.97.12.29) 19.504 ms
202.97.12.41 (202.97.12.41) 22.256 ms
❝
为什么查找一个 IP 地址时可能会看不到中间有些路由器的信息?
❞
因为有的路由器根本不会返回这个 ICMP 包。
路由表包括了「目的 IP 地址与下一跳 IP 地址的映射关系」。
「从网络的分级层级来看,每一个主干 ISP 都可以认为是一个主干 AS,每一个地区 ISP 都可以认为是一个地区 AS,而每一个公司、校园、家庭都可以认为是一个小的 AS」。
例如家庭 AS1 与公司 AS2 它们直接使用的网关协议示意图如下所示:

我们可以把网络拓扑图转换为图,其中
「路由算法的本质即图论的算法,但由于复杂的网络环境,所以路由算法比图论算法要更加复杂」。
❝
如何设计一个好的路由算法?
❞
1、「路由器初始化路由信息(两个向量 Di 和 Si)」。
2、「对相邻路由器 X 发过来的信息,对信息的内容进行修改」。
1)、「检索本地路由,将信息中新的路由插入到路由表里面」。
2)、「检索本地路由,对于下一跳为 X 的,更新为修改后的信息」。
3)、「检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新路由表」。
3、「如果3分钟没有收到相邻的路由信息,则把相邻路由设置为不可达(16跳)」。
「实现简单,开销很小」。
假设有一个 A-B-C 的链路,假如 A 路由节点出现问题无法使用,那么 B、C 就会互相询问,知道它们各自的跳数一直累加到超过 15 跳。
与 RIP 协议的不同:
因此,可以看到「LS 协议解决了 RIP 协议 随便相信隔壁路由、视野不够的问题」。
特点:
过程:
1、「初始化两个集合(S,U)(S 为只有初始顶点点 A 的集合,U 为其它顶点集合)」。
2、「如果 U 不为空,对 U 集合顶点进行距离的排序,并取出距离 A 最近的一个顶点 D」:
1)、「将顶点 D 纳入 S 集合」。
2)、「更新通过顶点 D 到达 U 集合所有点的距离(如果距离更小则更新,否则不更新)」。
3)、「重复2步骤」。
3、「直到 U 集合为空,算法完成」。
核心是 Dijkstra 算法。
然后,我们再来回顾一下「完整过程」:
| RIP | OSPF |
|---|---|
| 从邻居看网络 | 整个网络的拓扑 |
| 在路由器之间累加距离 | Dijkstra 算法计算最短路径 |
| 频繁、周期更新,收敛很慢 | 状态变化更新,收敛很快 |
| 路由间拷贝路由信息 | 路由间传递链路状态,自行计算路径 |
虽然 OSPF 协议解决了 RIP 协议的问题,对整个网络有了一定的全局观,但是「OSPF 协议本身较为复杂,实现开销较大」。
❝
为什么要在 AS 之间使用 BGP 协议呢?
❞

「由于各个 AS (国家、地区)之间政策、安全等原因,BGP 仅能够找到一个到底目的地的比较好的路由。而 AS 之间是通过 BGP 发言人来进行路由信息的交换的」。
❝
什么是数据帧?
❞
❝
如果数据里面刚好有这些比特流怎么办?
❞
❝
透明传输是什么?
❞
❝
如果数据里面刚好有这些控制字符该怎么办?
❞
在该控制字符前面加上一个 ESC 转义字符,如果数据中也包含有 ESC 转义字符时,则可以在前面再加一个 ESC 转义字符。而数据链路层的转义字符可以类比与编程语言中的转义字符。
❝
为什么要进行差错监测?
❞
「因此物理层只管传输比特流,无法控制是否出错。所以数据链路层需要负责 差错监测 的工作」。
「在比特流的后面加上 奇偶校验码(1/0).例如:00110100 => 所有位数和为3,是基数,在该比特流后面加1。(偶数加0)」
它的局限性在于「当比特流中出错两位时,无法检测出错误」。
CRC 使用了「模 2 除法」,即:「当最高位为0时,则认为余数不够除,取商为0」。
「发送端增加校验码:」
「接收端验证校验码:」
「缺点」
❝
为什么要设计出 MTU?
❞
数据帧过大或过小都会影响传输的效率。例如会增加数据传输时的总时延。以太网 MTU 一般为 1500 字节。
由传输链路中所有 MTU 中的最小 MTU 决定。
「存有 MAC 地址和硬件接口的映射关系。其中每一个 MAC 地址都有与之对应的硬件接口」。
单位为「字节」。

❝
其中的帧数据具体是什么数据?
❞
❝
如果 MAC 地址并不知道 B 的硬件接口,路由器如何处理?
❞
❝
什么是比特流?
❞
「由高低电频表示的数据流,1 => 高电频,0 => 低电频」,例如由比特流 100110101010 转化成的数字信号如下图所示:

❝
如果 MAC 地址并不知道 B 的硬件接口,路由器如何处理?
❞
❝
什么是比特流?
❞
「由高低电频表示的数据流,1 => 高电频,0 => 低电频」,例如由比特流 100110101010 转化成的数字信号如下图所示:
[外链图片转存中…(img-t5HPfhTF-1642854349437)]
本文由 在线网速测试 整理编辑,转载请注明出处。