1. ICMP协议的介绍及应用
IP协议的助手 —— ICMP 协议
ping 是基于 ICMP
协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 ICMP 协议。
ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。
里面有个关键词 —— 控制,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死的不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
ICMP
主要的功能包括:
- 确认 IP 包是否成功送达目标地址
- 报告发送过程中 IP 包被废弃的原因和改善网络设置等
IP 包中有一个字段叫做 TTL
(Time To Live
,生存周期),它的值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。
此时,路由器将会发送一个 ICMP 超时消息给发送端主机,并通知该包已被丢弃。
设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。
ping —— 查询报文类型的使用
同个子网下的主机 A 和 主机 B,主机 A 执行ping
主机 B 后,我们来看看其间发送了什么?
traceroute —— 差错报文类型的使用
有一款充分利用 ICMP 差错报文类型的应用叫做 traceroute
(在UNIX、MacOS中是这个命令,而在Windows中对等的命令叫做 tracert )。
- traceroute 作用一
traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。
traceroute 的参数指向某个目的 IP 地址:
traceroute 192.168.1.100
这个作用是如何工作的呢?
它的原理就是利用 IP 包的生存期限 从 1
开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息的一种方法。
比如,将 TTL 设置 为 1
,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时。
接下来将 TTL 设置为 2
,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。
这样的过程,traceroute 就可以拿到了所有的路由器 IP。
发送方如何知道发出的 UDP 包是否到达了目的主机呢?
traceroute 在发送 UDP
包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000
)。当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型是「端口不可达」。 所以,当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。
- traceroute 作用二
traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。
这么做是为了什么?
这样做的目的是为了路径MTU发现。
因为有的时候我们并不知道路由器的 MTU
大小,以太网的数据链路上的 MTU
通常是 1500
字节,但是非以外网的 MTU
值就不一样了,所以我们要知道 MTU
的大小,从而控制发送的包大小。
它的工作原理如下:
首先在发送端主机发送 IP
数据报时,将 IP
包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个 ICMP 的不可达消息将数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。
发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU
值,以便能到达目标主机。
2. 内网穿透
内网穿透,即NAT(Network Address Translator)穿透,是指计算机在内网(局域网)内使用私有IP地址,在连接外网(互联网)时使用全局IP地址的技术。该技术被普遍使用在有多台主机但只通过一个公有IP地址访问的私有网络中。
举个例子:比如我在实验室配置了一个服务器 Server A,当我在实验室的时候,就可以通过自己的笔记本使用SSH连接【因为我和服务器处于一个局域网】,当我回宿舍以后,就没有办法直接使用SSH连接了【因为我和服务器不在一个局域网】,这个时候就需要进行NAT穿透,让我在宿舍也可以使用SSH连接Server A。
1. NAT原理解析
- 当信息由局域网向因特网传递时,源地址从专有地址转换为公用地址。由路由器跟踪每个连接上的目的地址和端口。
- 当数据返回路由器时,通过记录的连接跟踪数据来决定该转发给内部网的哪个主机;如果此时如果有多个公用地址可用,当数据包返回时,则会客户机的端口号可以用来分解数据包。
图例:
下图以10.0.0.10的主机与163.221.120.9的主机进行通信为例进行讲解。
首先NAT路由器将发送源地址从私有IP地址(10.0.0.10)转换为全局的IP地址 (202.244.174.37)再发送数据
当数据从地址163.221.120.9发过来时,NAT路由器将目标地址从原句IP地址(202.244.174.37)先转换成私有IP地址10.0.0.10以后再转发
3. 动态路由协议
虽然静态路由在某些时刻很有用,但是必须手工配置每条路由条目,对于大中型网络或拓扑经常改变的情况,配置和维护静态路由的工作量变得非常繁重,因此使用动态路由是必要的。
动态路由协议 , 用来实现路由器之间的动态路由表更新。
路由器在配置了接口的P地址后,就会将直连网段存储在路由表中。对于非直连的网段,如果使用静态路由,需要在路由器上配置到达目标网段需要经过的下一跳地址,也就是说,需要人为指定一条数据传输的路径,手工构造路由表。
如果使用动态路由协议,路由器之间就会将自己的路由信息向相邻的路由器发送,并接收相邻路由发过来的路由信息,有选择地保护这些路由信息,生成自己的路由表。
- 举例:OSPF(Open Shortest Path First,开放最短路径优先)
链路状态路由算法
工作原理:
每个路由器将自己的链路状态信息洪泛(flooding)
到网络上的所有路由器。
- 最后,每个路由器都会纸雕整个网络的拓扑结构(LSDB)
- 每个路由器使用的是
最短路径算法
计算最短路径,来更新路由表 - 路由器的链路状态发生变化的时候会继续洪泛自身的链路状态信息到其他的路由器