图解网络 — IP 篇
2022-09-14 21:12:04 50 举报AI智能生成
小林coding 图解网络 IP 篇 脑图总结
计算机网络
IP
图解
模版推荐
作者其他创作
大纲/内容
IP 基础知识全家桶
前菜 — IP 基础认识
IP 在 TCP/IP 参考模型中处于第三层,也就是 <font color="#0000ff"><b>网络层</b></font>。
网络层的主要作用是:<b><font color="#0000ff">实现主机与主机之间的通信,也叫点对点(end to end)通信。</font></b>
网络层与数据链路层有什么关系?
先来理清 IP(网络层) 和 MAC (数据链路层)之间的区别和关系。
在上面我们知道 IP 的作用是主机之间通信用的,而 <b><font color="#0000ff">MAC 的作用则是实现「直连」<br>的两个设备之间通信,IP 则负责在「没有直连」的两个网络之间进行通信传输</font></b>。
举个生活的栗子,小林要去一个很远的地方旅行,制定了一个行程表,其间需先后<br>乘坐飞机、地铁、公交车才能抵达目的地,为此小林需要买飞机票,地铁票等。
飞机票和地铁票都是去往特定的地点的,每张票只能够在某一<br>限定区间内移动,此处的「区间内」就如同通信网络中数据链路。
在区间内移动相当于数据链路层,充当区间内两个节点传输的功能,<br>区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址。
整个旅游行程表就相当于网络层,充当远程定位的功能,<br>行程的开始好比源 IP,行程的终点好比目的 IP 地址。
如果小林只有行程表而没有车票,就无法搭乘交通工具到达目的地。相反,如果除了车票而<br>没有行程表,恐怕也很难到达目的地。因为小林不知道该坐什么车,也不知道该在哪里换乘。
因此,只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。与此类似,<br><b><font color="#0000ff">计算机网络中也需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信</font></b>。
还有重要一点,旅行途中我们虽然不断变化了交通工具,但是旅行行程的起始地址和目的地址始终都没变。
其实,在网络中数据包传输中也是如此,<b><font color="#0000ff">源IP地址和目标IP地址在传输过程中是不会<br>变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化</font></b>。<br>
主菜 — IP 地址的基础知识
概述
在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。
IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。
而人类为了方便记忆采用了 <b><font color="#0000ff">点分十进制 </font></b>的标记方式,也就是将 32 位 IP 地址<br>以每 8 位为组,共分为 4 组,每组以「.」隔开,再将每组转换成十进制。
那么,IP 地址最大值也就是:
也就说,最大允许 43 亿台计算机连接到网络。<br>
实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、<br>路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。
因此,让 43 亿台计算机全部连网其实是不可能的,更何况 IP 地址是由「网络标识」和<br>「主机标识」这两个部分组成的,所以实际能够连接到网络的计算机个数更是少了很多。
有一种可以更换 IP 地址的技术 NAT,使得可连接计算机数超过 43 亿台。 NAT 技术后续会进一步讨论和说明。
IP 地址的分类
互联网诞生之初,IP 地址显得很充裕,于是计算机科学家们设计了分类地址。
IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类:<br><ul><li>黄色部分为分类号,用以区分 IP 地址类别。</li></ul>
什么是 A、B、C 类地址?
其中对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。这很<br>好理解,好比小林是 A 小区 1 栋 101 号,你是 B 小区 1 栋 101 号。
我们可以用下面这个表格, 就能很清楚的知道 A、B、C 分类对应的地址范围、最大主机个数。
A、B、C 分类地址最大主机个数是如何计算的呢?
最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:
为什么要减 2 呢?因为在 IP 地址中,有两个 IP 是特殊的,分别是主机号全为 1 和 全为 0 地址:<br><ul><li>主机号全为 1 指定某个网络下的所有主机,用于广播</li><li>主机号全为 0 指定某个网络</li></ul>
因此,在分配过程中,应该去掉这两种情况。
广播地址用于什么?<br>
广播地址用于在 <b><font color="#0000ff">同一个链路中相互连接的主机之间发送数据包</font></b>。
当主机号全为 1 时,就表示该网络的广播地址。<br>例如把 172.20.0.0/16 用二进制表示如下:<br><ul><li>10101100.00010100.00000000.00000000</li></ul>
将这个地址的主机部分全部改为 1,则形成广播地址:<br><ul><li>10101100.00010100.11111111.11111111</li></ul>
再将这个地址用十进制表示,则为 172.20.255.255。
广播地址可以分为本地广播和直接广播两种。<br><br><ul><li><b><font color="#0000ff">在本网络内广播的叫做本地广播</font></b>。例如网络地址为 <font color="#ff00ff">192.168.0</font>.0/24 的情况下,广播地址是 <font color="#ff00ff">192.168.0</font>.255 。<br>因为这个广播地址的 IP 包会被路由器屏蔽,所以不会到达 192.168.0.0/24 以外的其他链路上。</li><li><b><font color="#0000ff">在不同网络之间的广播叫做直接广播</font></b>。例如网络地址为 <font color="#ff00ff">192.168.0</font>.0/24 的主机向 <font color="#ff00ff">192.168.1</font>.255/24 的目标地址<br>发送 IP 包。收到这个包的路由器,将数据转发给 192.168.1.0/24,从而使得所有 192.168.1.1~192.168.1.254 <br>的主机都能收到这个包(由于直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发) 。</li></ul>
本地广播:<br>
直接广播:
什么是 D、E 类地址?
而 D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。
多播地址用于什么?<br>
多播用于 <b><font color="#0000ff">将包发送给特定组内的所有主机</font></b>。
由于 <b><font color="#0000ff">广播无法穿透路由</font></b>,若想给 <b><font color="#0000ff">其他网段发送同样的包</font></b>,就可以使用可以穿透路由的多播。<br>(直接广播是只发给目标地址所在的网络组,而且直接广播有一定的安全问题,多数情况下会在路由器上设置为不转发。)
多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。
从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:<br><br><ul><li>224.0.0.0 ~ 224.0.0.255 为预留的组播地址,只能在局域网中,路由器是不会进行转发的。</li><li>224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址,可以用于 Internet 上。</li><li>239.0.0.0 ~ 239.255.255.255 为本地管理组播地址,可供内部网在内部使用,仅在特定的本地范围内有效。</li></ul>
IP 分类的优点<br>
不管是路由器还是主机解析到一个 IP 地址时候,我们判断其 IP 地址的首位<br>是否为 0,为 0 则为 A 类地址,那么就能很快的找出网络地址和主机地址。
其余分类判断方式参考如下图:<br>
所以,这种分类地址的优点就是<b><font color="#0000ff"> 简单明了、选路(基于网络地址)简单</font></b>。
IP 分类的缺点<br>
<b><font color="#0000ff">同一网络下没有地址层次</font></b>,比如一个公司里用了 B 类地址,但是可能需要根据生产环境、测试环境、<br>开发环境来划分地址层次,而这种 IP 分类是没有地址层次划分的功能,所以这就缺少地址的灵活性。
A、B、C类有个尴尬处境,就是 <b><font color="#0000ff">不能很好的与现实网络匹配:</font></b><br><ul><li>C 类地址能包含的最大主机数量实在太少了,只有 254 个,估计一个网吧都不够用。</li><li>而 B 类地址能包含的最大主机数量又太多了,6 万多台机器放在一个网络下面,<br>一般的企业基本达不到这个规模,闲着的地址就是浪费。</li></ul><br>这两个缺点,都可以在 CIDR 无分类地址解决。
无分类地址 CIDR
概述
正因为 IP 分类存在许多缺点,所以后面提出了无分类地址的方案,即 CIDR。
这种方式不再有分类地址的概念,32 比特的 IP 地址被划分为两部分,<b><font color="#0000ff">前面是网络号,后面是主机号</font></b>。
怎么划分网络号和主机号的呢?<br>
表示形式 a.b.c.d/x,其中 /x 表示前 x 位属于网络号, x 的范围是 0 ~ 32,这就使得 IP 地址更加具有灵活性。
比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。
还有另一种划分网络号与主机号形式,那就是 <b><font color="#0000ff">子网掩码</font></b>,掩码的意思就是掩盖掉主机号,剩余的就是网络号。
<b><font color="#0000ff">将子网掩码和 IP 地址按位计算 AND,就可得到网络号。</font></b>
为什么要分离网络号和主机号?<br>
因为两台计算机要通讯,首先要判断是否处于同一个广播域内,即网络地址是否相同。<br>如果网络地址相同,表明接受方在本网络上,那么可以把数据包直接发送到目标主机。
路由器寻址工作中,也就是通过这样的方式来找到对应的网络号的,进而把数据包转发给对应的网络内。
怎么进行子网划分?<br>
在上面我们知道可以通过子 <b><font color="#0000ff">网掩码划分出网络号和主机号</font></b>,那实际上子网掩码还有一个作用,那就是 <b><font color="#0000ff">划分子网</font></b>。
<b style="color: rgb(0, 0, 255);">子网划分 </b><font color="#000000">实际上是将 </font><b style="color: rgb(0, 0, 255);">主机地址 </b><font color="#000000">分为两个部分:</font><b style="color: rgb(0, 0, 255);">子网网络地址和子网主机地址</b>。形式如下:<br><ul><li>未做子网划分的 ip 地址:网络地址+主机地址</li><li>做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)</li></ul>
假设对 C 类地址进行子网划分,网络地址 192.168.1.0,使用子网掩码 255.255.255.192 对其进行子网划分。
C 类地址中前 24 位是网络号,最后 8 位是主机号,根据子网掩码可知 <b><font color="#0000ff">从 8 位主机号中借用 2 位作为子网号</font></b>。<br>(192 对应的二进制位为 11000000,所以前面两位被借用了)
由于子网网络地址被划分成 2 位,那么子网地址就有 4 个,分别是 00、01、10、11,具体划分如下图:
划分后的 4 个子网如下表格:
公有 IP 地址与私有 IP 地址
在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。
平时我们办公室、家里、学校用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT <br>人员自己管理、自己分配,而且可以重复。因此,你学校的某个私有 IP 地址和我学校的可以是一样的。
就像每个小区都有自己的楼编号和门牌号,你小区家可以叫 1 栋 101 号,我小区家也可以叫 1 栋 101,没有任何问题。<br>但一旦出了小区,就需要带上中山路 666 号(公网 IP 地址),是国家统一分配的,不能两个小区都叫中山路 666。
所以,公有 IP 地址是有个组织统一分配的,假设你要开一个博客网站,那么你就需要去申请购买<br>一个公有 IP,这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯一。
公有 IP 地址由谁管理呢?<br>
私有 IP 地址通常是内部的 IT 人员管理,公有 IP 地址是由 ICANN 组织管理,中文叫「互联网名称与数字地址分配机构」。
IANA 是 ICANN 的其中一个机构,它负责分配互联网 IP 地址,是按州的方式层层分配。<br><ul><li>ARIN 北美地区</li><li>LACNIC 拉丁美洲和一些加勒比群岛</li><li>RIPE NCC 欧洲、中东和中亚</li><li>AfriNIC 非洲地区</li><li>APNIC 亚太地区</li></ul>
其中,在中国是由 CNNIC 的机构进行管理,它是中国国内唯一指定的全局 IP 地址管理的组织。<br>
IP 地址与路由控制
IP 地址的 <b><font color="#0000ff">网络地址 </font></b>这一部分是用于进行 <b><font color="#0000ff">路由控制</font></b>。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。
在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有 <b><font color="#0000ff">相同网络地址 </font></b>的记录,根据该记录将 IP 包<br>转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是 <b><font color="#0000ff">最长匹配</font></b>。
下面以下图的网络链路作为例子说明:<br><ol><li>主机 A 要发送一个 IP 包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10,由于没有在主机 A <br>的路由表找到与目标地址 10.1.2.10 相同的网络地址,于是包被转发到默认路由(路由器 1 );</li><li>路由器 1 收到 IP 包后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,<br>发现匹配到了,于是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2;</li><li>路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器 2 的 <br>10.1.2.1 这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机。</li></ol>
环回地址不会流向网络,环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。<br>
计算机使用一个特殊的 IP 地址 <b><font color="#0000ff">127.0.0.1 作为环回地址</font></b>。与该地址具有相同意义的<br>是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。
IP 分片与重组
每种数据链路的最大传输单元 MTU(Maximum Transmission Unit)都是<br>不相同的,如 FDDI 数据链路 MTU 4352、以太网的 MTU 是 1500 字节等。
每种数据链路的 MTU 之所以不同,是因为每个不同类型的数据链路的使用目的不同。使用目的不同,可承载的 MTU 也就不同。
其中,我们最常见数据链路是以太网,它的 MTU 是 1500 字节。
那么当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。
经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。
假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则<br>需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。
在分片传输中,一旦某个分片丢失,则会造成整个 IP 数据报作废,所以 TCP 引入了 MSS(Maximum Segment Size,最大报文段大小),<br>也就是 <b><font color="#0000ff">在 TCP 层进行分片不由 IP 层分片</font></b>,那么对于 <b><font color="#0000ff">UDP</font></b> 我们尽量 <b><font color="#0000ff">不要发送一个大于 MTU 的数据报文</font></b>。
IPv6 基本认识
概述
IPv4 的地址是 32 位的,大约可以提供 42 亿个地址,但是早在 2011 年 IPv4 地址就已经被分配完了。
但是 IPv6 的地址是 128 位的,这可分配的地址数量是大的惊人,<br>说个段子 IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址。
但 IPv6 除了有更多的地址之外,还有更好的安全性和扩展性,<br>说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。
但是因为 IPv4 和 IPv6 不能相互兼容,所以不但要我们电脑、手机之类的设备支持,<br>还需要网络运营商对现有的设备进行升级,所以这可能是 IPv6 普及率比较慢的一个原因。
IPv6 的亮点<br>
IPv6 不仅仅只是可分配的地址变多了,它还有非常多的亮点。
<ul><li>IPv6 可自动配置,即使没有 DHCP 服务器也可以实现自动分配IP地址,真是<font color="#0000ff"> </font><b><font color="#0000ff">便捷到即插即用</font> </b>啊。</li><li>IPv6 包头包首部长度采用固定的值 40 字节,去掉了包头校验和,<br>简化了首部结构,减轻了路由器负荷,大大 <b><font color="#0000ff">提高了传输的性能</font></b>。</li><li>IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能,大大 <b><font color="#0000ff">提升了安全性</font></b>。</li></ul>
IPv6 地址的标识方法<br>
IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。
IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。
如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号 「::」隔开。但是,一个 IP 地址中只允许出现一次两个连续的冒号。
IPv6 地址的结构<br>
IPv6 类似 IPv4,也是通过 IP 地址的前几位标识 IP 地址的种类。
IPv6 的地址主要有以下类型地址:<br><ul><li>单播地址,用于一对一的通信</li><li>组播地址,用于一对多的通信</li><li><span style="font-size: inherit;">任播地址,用于通信最近的节点,最近的节点是由路由协议决定</span></li><li>没有广播地址</li></ul>
IPv6 单播地址类型<br>
对于一对一通信的 IPv6 地址,主要划分了三类单播地址,每类地址的有效范围都不同。
<ul><li>在同一链路单播通信,不经过路由器,可以使用 <b><font color="#0000ff">链路本地单播地址</font></b>,IPv4 没有此类型</li><li>在内网里单播通信,可以使用 <b><font color="#0000ff">唯一本地地址</font></b>,相当于 IPv4 的私有 IP</li><li>在互联网通信,可以使用 <b><font color="#0000ff">全局单播地址</font></b>,相当于 IPv4 的公有 IP</li></ul>
IPv4 首部与 IPv6 首部
IPv4 首部与 IPv6 首部的差异如下图:
IPv6 相比 IPv4 的首部改进:<br><br><ul><li><b><font color="#0000ff">取消了首部校验和字段</font></b>。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。</li><li><b><font color="#0000ff">取消了分片/重新组装相关字段</font></b>。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,<br>这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。</li><li><b><font color="#0000ff">取消选项字段</font></b>。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部<br>中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的 40 字节。</li></ul>
点心 — IP 协议相关技术
跟 IP 协议相关的技术也不少,接下来说说与 IP 协议相关的重要且常见的技术。<br><ul><li>DNS 域名解析</li><li>ARP 与 RARP 协议</li><li>DHCP 动态获取 IP 地址</li><li>NAT 网络地址转换</li><li>ICMP 互联网控制报文协议</li><li>IGMP 因特网组管理协</li></ul>
DNS
我们在上网的时候,通常使用的方式是域名,而不是 IP 地址,因为域名方便人类记忆。
那么实现这一技术的就是 <b><font color="#0000ff">DNS 域名解析</font></b>,DNS 可以将域名网址自动转换为具体的 IP 地址。
域名的层级关系<br>
DNS 中的域名都是用 <b><font color="#0000ff">句点</font></b> 来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的 <b><font color="#0000ff">界限</font></b>。
在域名中,<b><font color="#0000ff">越靠右 </font></b>的位置表示其 <b><font color="#0000ff">层级越高</font></b>。
根域是在最顶层,它的下一层就是 com 顶级域,再下面是 server.com。
所以域名的层级关系类似一个树状结构:<br><ul><li>根 DNS 服务器</li><li>顶级域 DNS 服务器(com)</li><li>权威 DNS 服务器(server.com)</li></ul>
根域的 DNS 服务器信息保存在互联网中所有的 DNS 服务器中。这样<br>一来,任何 DNS 服务器就都可以找到并访问根域 DNS 服务器了。
因此,客户端只要能够找到任意一台 DNS 服务器,就可以通过它找到根域 <br>DNS 服务器,然后再一路顺藤摸瓜找到位于下层的某台目标 DNS 服务器。
域名解析的工作流程<br>
<b><font color="#0000ff">浏览器 </font></b>首先看一下 <b><font color="#0000ff">自己的缓存 </font></b>里有没有,如果没有就向 <b><font color="#0000ff">操作系统的缓存 </font></b>要,还没有就检查 <br><b><font color="#0000ff">本机域名解析文件 hosts</font></b>,如果还是没有,就会 <b><font color="#0000ff">DNS 服务器进行查询</font></b>,查询的过程如下:<br><br><ol><li>客户端首先会发出一个 DNS 请求,问 www.server.com 的 IP 是啥,并发给本地 DNS 服务器(也就是客户端的 <br>TCP/IP 设置中填写的 DNS 服务器地址)。</li><li>本地域名服务器收到客户端的请求后,如果缓存里的表格能找到 www.server.com,则它直接返回 IP 地址。如果没有,<br>本地 DNS 会去问它的根域名服务器:“老大, 能告诉我 www.server.com 的 IP 地址吗?” 根域名服务器是最高层次<br>的,它不直接用于域名解析,但能指明一条道路。</li><li>根 DNS 收到来自本地 DNS 的请求后,发现后置是 .com,说:“www.server.com 这个域名归 .com 区域管理”,<br>我给你 .com 顶级域名服务器地址给你,你去问问它吧。”</li><li>本地 DNS 收到顶级域名服务器的地址后,发起请求问“老二, 你能告诉我 www.server.com 的 IP 地址吗?”</li><li>顶级域名服务器说:“我给你负责 www.server.com 区域的权威 DNS 服务器的地址,你去问它应该能问到”。</li><li>本地 DNS 于是转向问权威 DNS 服务器:“老三,www.server.com对应的IP是啥呀?” server.com 的权威 DNS <br>服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。</li><li>权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。</li><li>本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接。</li></ol>
至此,我们完成了 DNS 的解析过程。现在总结一下,整个过程如下图:
DNS 域名解析的过程蛮有意思的,整个过程就和我们日常生活中找人问路的过程类似,<b><font color="#0000ff">只指路不带路</font></b>。<br>
ARP
在传输一个 IP 数据报的时候,确定了源 IP 地址和目标 IP 地址后,就会通过主机「路由表」确定 IP <br>数据包下一跳。然而,<b><font color="#0000ff">网络层的下一层是数据链路层</font></b>,所以我们还要知道<b><font color="#0000ff">「下一跳」的 MAC 地址</font></b>。
由于主机的路由表中可以找到 <b><font color="#0000ff">下一跳的 IP 地址</font></b>,所以可以 <b><font color="#0000ff">通过 ARP 协议</font></b>,求得 <b><font color="#0000ff">下一跳的 MAC 地址</font></b>。
ARP 如何知道对方的 MAC 地址?<br>
简单地说,ARP 是借助 <b><font color="#0000ff">ARP 请求与 ARP 响应 </font></b>两种类型的包确定 MAC 地址的。<br><br><ul><li>主机会通过 <b><font color="#0000ff">广播发送 ARP 请求</font></b>,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。</li><li>当同个链路中的所有设备收到 ARP 请求时,会去拆开 ARP 请求包里的内容,如果 ARP 请求包中的<br>目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 <b><font color="#0000ff">MAC 地址塞入 ARP 响应包 </font></b>返回给主机。</li></ul>
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,以便下次直接从缓存中找到对应 IP 地址的 MAC 地址。
不过,MAC 地址的缓存是有一定期限的,超过这个期限,缓存的内容将被清除。
RARP 协议又是什么?<br>
ARP 协议是已知 IP 地址求 MAC 地址,那 RARP 协议正好相反,它是 <b><font color="#0000ff">已知 MAC 地址<br>求 IP 地址</font></b>。例如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。
通常这需要架设一台 RARP 服务器,在这个服务器上注册设备的 MAC 地址及其 IP 地址。然后再将这个设备接入到网络,接着:<br><br><ul><li>该设备会发送一条「我的 MAC 地址是XXXX,请告诉我,我的IP地址应该是什么」的请求信息。</li><li><span style="font-size: inherit;">RARP 服务器接到这个消息后返回「MAC地址为 XXXX 的设备,IP地址为 XXXX」的信息给这个设备。</span></li></ul>
最后,设备就根据从 RARP 服务器所收到的应答信息设置自己的 IP 地址。
DHCP
DHCP 在生活中我们是很常见的,电脑通常都是通过 DHCP 动态获取 IP 地址,省去了配 IP 信息繁琐的过程。
接下来,我们来看看我们的电脑是如何通过 4 个步骤的过程,获取到 IP 的。
先说明一点,DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号。
这 4 个步骤:<br><br><ul><li>客户端首先发起 <b><font color="#0000ff">DHCP 发现报文(DHCP DISCOVER)</font></b> 的 IP 数据报,由于客户端没有 IP 地址,也不知道 DHCP 服务器的地址,<br>所以使用的是 <b><font color="#0000ff">UDP 广播通信</font></b>,其使用的广播目的地址是 255.255.255.255(端口 67) 并且使用 0.0.0.0(端口 68) 作为源 IP <br>地址。DHCP 客户端将该 IP 数据报传递给链路层,链路层然后将帧广播到所有的网络中设备。</li><li>DHCP 服务器收到 DHCP 发现报文时,用 <b><font color="#0000ff">DHCP 提供报文(DHCP OFFER)</font></b> 向客户端做出响应。该报文仍然使用 <b><font color="#0000ff">IP 广播 </font></b>地址 <br>255.255.255.255,该报文信息携带服务器提供可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及 <b><font color="#0000ff">IP 地址租用期</font></b>。</li><li>客户端收到一个或多个服务器的 DHCP 提供报文后,从中选择一个服务器,并向选中的服务器发送 <b><font color="#0000ff">DHCP 请求报文<br>(DHCP REQUEST)</font></b>进行响应,回显配置的参数。</li><li>最后,服务端用 <b><font color="#0000ff">DHCP ACK 报文 </font></b>对 DHCP 请求报文进行响应,应答所要求的参数。</li></ul>
一旦客户端收到 DHCP ACK 后,交互便完成了,并且客户端能够在租用期内使用 DHCP 服务器分配的 IP 地址。
如果租约的 DHCP IP 地址快期后,客户端会向服务器发送 DHCP 请求报文:<br><ul><li>服务器如果同意继续租用,则用 DHCP ACK 报文进行应答,客户端就会延长租期。</li><li>服务器如果不同意继续租用,则用 DHCP NACK 报文,客户端就要停止使用租约的 IP 地址。</li></ul>
可以发现,DHCP 交互中,全程都是使用 <b><font color="#0000ff">UDP 广播通信</font></b>。
用的是广播,那如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个 DHCP 服务器?
所以,为了解决这一问题,就出现了 <b><font color="#0000ff">DHCP 中继代理</font></b>。有了 DHCP 中继代理以后,<br><b><font color="#0000ff">对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理</font></b>。<br><br><ul><li>DHCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,<br>再以 <b><font color="#0000ff">单播 </font></b>的形式发给 DHCP 服务器。</li><li>服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端 。</li></ul>
因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。<br>
NAT
IPv4 的地址是非常紧缺的,在前面我们也提到可以通过无分类地址来减缓 IPv4 地址耗尽<br>的速度,但是互联网的用户增速是非常惊人的,所以 IPv4 地址依然有被耗尽的危险。
于是,提出了一种 <b><font color="#0000ff">网络地址转换 NAT</font></b> 的方法,再次缓解了 IPv4 地址耗尽的问题。
简单的来说 NAT 就是同个公司、家庭、教室内的主机对外部通信时,把 <b><font color="#0000ff">私有 IP 地址转换成公有 IP 地址</font></b>。
那不是 N 个私有 IP 地址,你就要 N 个公有 IP 地址?这怎么就缓解了 IPv4 地址耗尽的问题?
确实是,普通的 NAT 转换没什么意义。
由于绝大多数的网络应用都是使用传输层协议 TCP 或 UDP 来传输数据的。<br>
因此,可以把 IP 地址 + 端口号一起进行转换。
这样,就用一个全球 IP 地址就可以了,这种转换技术就叫 <b><font color="#0000ff">网络地址与端口转换 NAPT</font></b>。
图中有两个客户端 192.168.1.10 和 192.168.1.11 同时与服务器 183.232.231.172 进行通信,并且这两个客户端的本地端口都是 1025。
此时,<b><font color="#0000ff">两个私有 IP 地址都转换 IP 地址为公有地址 120.229.175.121,但是以不同的端口号作为区分</font></b>。
于是,生成一个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端 A、B 能同时与服务器之间进行通信。
这种转换表在 NAT 路由器上自动生成。例如,在 TCP 的情况下,建立 TCP 连接首次握手时的 SYN <br>包一经发出,就会生成这个表。而后又随着收到关闭连接时发出 FIN 包的确认应答从表中被删除。
NAT 那么牛逼,难道就没缺点了吗?
由于 NAT/NAPT 都依赖于自己的转换表,因此会有以下的问题:<br><br><ul><li>外部无法主动与 NAT 内部服务器建立连接,因为 NAPT 转换表没有转换记录。</li><li>转换表的生成与转换操作都会产生性能开销。</li><li>通信过程中,如果 NAT 路由器重启了,所有的 TCP 连接都将被重置。</li></ul>
如何解决 NAT 潜在的问题呢?
<font color="#ff00ff">改用 IPv6,</font>IPv6 可用范围非常大,以至于每台设备都可以配置一个公有 IP 地址,<br>就不搞那么多花里胡哨的地址转换了,但是 IPv6 普及速度还需要一些时间。
<font color="#ff00ff">NAT 穿透技术,</font>它能够让网络应用程序主动发现自己位于 NAT 设备之后,并且会主动获得 NAT <br>设备的公有 IP,并为自己建立端口映射条目,注意这些都是 NAT设备后的应用程序自动完成的。<br><br>也就是说,在 NAT 穿透技术中,NAT设备后的应用程序处于主动地位,它已经明确地知道 NAT 设备要修改它发<br>的数据包,于是它主动配合 NAT 设备的操作,主动地建立好映射,这样就不像以前由 NAT 设备来建立映射了。<br><br>说人话,就是客户端主动从 NAT 设备获取公有 IP 地址,然后自己建立端口映射条目,然后用这个条目对外通信,<br>就不需要 NAT 设备来进行转换了。<br>
ICMP
ICMP 全称是 <b><font color="#0000ff">Internet Control Message Protocol</font></b>,也就是 <b><font color="#0000ff">互联网控制报文协议</font></b>。
里面有个关键词 —— <b><font color="#0000ff">控制</font></b>,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。
当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以<br>需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。<br>
ICMP 功能都有啥?<br>
ICMP 主要的功能包括:<b><font color="#0000ff">确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等</font></b>。
在 IP 通信中如果某个 IP 包因为某种原因 <b><font color="#0000ff">未能达到目标地址</font></b>,那么这个具体的原因将 <b><font color="#0000ff">由 ICMP 负责通知</font></b>。
如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,<br>这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。
ICMP 的这种通知消息会使用 IP 进行发送 。<br>
因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。<br>收到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。
ICMP 类型<br>
ICMP 大致可以分为两大类:<br><ul><li>一类是用于诊断的查询消息,也就是<b><font color="#0000ff">「查询报文类型」</font></b></li><li>另一类是通知出错原因的错误消息,也就是<b><font color="#0000ff">「差错报文类型」</font></b></li></ul>
IGMP
ICMP 跟 IGMP 是一点关系都没有的,大家不要混淆了。
在前面我们知道了组播地址,也就是 D 类地址,既然是组播,那就说明是只有一组的主机能收到数据包,<br>不在一组的主机不能收到数组包,怎么管理是否是在一组呢?那么,就需要 IGMP 协议了。
<b><font color="#0000ff">IGMP 是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间</font></b>,如上图中的蓝色部分。<br><br><ul><li>IGMP 报文向路由器申请加入和退出组播组,默认情况下路由器是不会转发组播包到连接中的主机,除非主机通过 IGMP 加入<br>到组播组,主机申请加入到组播组时,路由器就会记录 IGMP 路由器表,路由器后续就会转发组播包到对应的主机了。</li><li>IGMP 报文采用 IP 封装,IP 头部的协议号为 2,而且 TTL 字段值通常为 1,因为 IGMP 是工作在主机与连接的路由器之间。</li></ul>
IGMP 工作机制<br>
IGMP 分为了三个版本分别是,IGMPv1、IGMPv2、IGMPv3。
接下来,以 IGMPv2 作为例子,说说 <b><font color="#0000ff">常规查询与响应和离开组播组 </font></b>这两个工作机制。
<b><font color="#ff00ff">常规查询与响应工作机制</font></b>:<br><ol><li>路由器会周期性发送目的地址为 224.0.0.1(表示同一网段内所有主机和路由器) IGMP 常规查询报文。</li><li>主机1 和 主机 3 收到这个查询,随后会启动「报告延迟计时器」,计时器的时间是随机的,通常是 0~10 秒,计时器超时后主机就<br>会发送 IGMP 成员关系报告报文(源 IP 地址为自己主机的 IP 地址,目的 IP 地址为组播地址)。如果在定时器超时之前,收到同一<br>个组内的其他主机发送的成员关系报告报文,则自己不再发送,这样可以减少网络中多余的 IGMP 报文数量。</li><li>路由器收到主机的成员关系报文后,就会在 IGMP 路由表中加入该组播组,后续网络中一旦该组播地址的数据到达路由器,它会把数据包转发出去。</li></ol>
<b><font color="#ff00ff">离开组播组工作机制</font></b>
离开组播组的情况一,网段中仍有该组播组:<font color="#000000"><br><ul><li>主机 1 要离开组 224.1.1.1,发送 IGMPv2 离组报文,报文的目的地址是 224.0.0.2(表示发向网段内的所有路由器)</li><li>路由器 收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个),以便确认该网络是否还有 224.1.1.1 组的其他成员。</li><li>主机 3 仍然是组 224.1.1.1 的成员,因此它立即响应这个特定组查询。路由器知道该网络中仍然存在该组播组的成员,<br>于是继续向该网络转发 224.1.1.1 的组播数据包。</li></ul></font>
离开组播组的情况二,网段中没有该组播组:<br><ol><li>主机 1 要离开组播组 224.1.1.1,发送 IGMP 离组报文。</li><li>路由器收到该报文后,以 1 秒为间隔连续发送 IGMP 特定组查询报文(共计发送 2 个)。此时在该网段内,<br>组 224.1.1.1 已经没有其他成员了,因此没有主机响应这个查询。</li><li>一定时间后,路由器认为该网段中已经没有 224.1.1.1 组播组成员了,将不会再向这个网段转发该组播地址的数据包。</li></ol>
ping 的工作原理
IP 协议的助手 — ICMP 协议
ping 是基于 ICMP 协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 <b><font color="#0000ff">ICMP 协议</font></b>。
ICMP 是什么?<br>
ICMP 全称是 <b><font color="#0000ff">Internet Control Message Protocol</font></b>,也就是 <b><font color="#0000ff">互联网控制报文协议</font></b>。
里面有个关键词 —— <b><font color="#0000ff">控制</font></b>,如何控制的呢?
网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死的不明不白,没头没脑的作风<br>不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。
ICMP 功能都有啥?<br>
ICMP 主要的功能包括:<b><font color="#0000ff">确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等</font></b>。
在<b><font color="#0000ff"> IP 通信 </font></b>中如果某个 IP 包因为某种原因 <b><font color="#0000ff">未能达到目标地址</font></b>,那么这个具体的原因将 <b><font color="#0000ff">由 ICMP 负责通知</font></b>。
如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,<br>这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。
ICMP 的这种通知消息会使用 IP 进行发送 。
因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。<br>收到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。
ICMP 包头格式<br>
ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。
ICMP 包头的类型字段,大致可以分为两大类:<br><ul><li>一类是用于诊断的查询消息,也就是<b><font color="#0000ff">「查询报文类型」</font></b></li><li>另一类是通知出错原因的错误消息,也就是<b><font color="#0000ff">「差错报文类型」</font></b></li></ul>
查询报文类型
回送消息 —— 类型 0 和 8
<b><font color="#0000ff">回送消息 </font></b>用于进行通信的主机或路由器之间,判断所发送的数据包是否<br>已经成功到达对端的一种消息,ping 命令就是利用这个消息实现的。
可以向对端主机发送 <b><font color="#0000ff">回送请求 </font></b>的消息(ICMP Echo Request Message,类型 8),<br>也可以接收对端主机发回来的<b><font color="#0000ff"> 回送应答</font></b> 消息(ICMP Echo Reply Message,类型 0)。
相比原生的 ICMP,这里多了两个字段:<br><ul><li><b><font color="#0000ff">标识符</font></b>:用以 <b><font color="#0000ff">区分是哪个应用程序发 ICMP 包</font></b>,比如用进程 PID 作为标识符;</li><li><b><font color="#0000ff">序号</font></b>:序列号从 0 开始,每发送一次新的回送请求就会加 1, 可以用来 <b><font color="#0000ff">确认网络包是否有丢失</font></b>。</li></ul>
在 <b><font color="#0000ff">选项数据 </font></b>中,ping 还会存放发送请求的时间值,来 <b><font color="#0000ff">计算往返时间</font></b>,说明路程的长短。
差错报文类型
接下来,说明几个常用的 ICMP 差错报文的例子:<br><ul><li>目标不可达消息 —— 类型 为 3</li><li>原点抑制消息 —— 类型 4</li><li>重定向消息 —— 类型 5</li><li>超时消息 —— 类型 11</li></ul>
目标不可达消息(Destination Unreachable Message) —— 类型为 3<br>
IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个 <b><font color="#0000ff">目标不可达 </font></b>的 <br>ICMP 消息,并在这个消息中显示不可达的具体原因,原因记录在 ICMP 包头的 <b><font color="#0000ff">代码字段</font></b>。
由此,根据 ICMP 不可达的具体消息,发送端主机也就可以了解此次发送 <b><font color="#0000ff">不可达的具体原因</font></b>。
举例 6 种常见的目标不可达类型的 <b><font color="#0000ff">代码</font></b>:
为了了解这几种不可达的类型,下面给出一个生活中的例子:网络不可达例子之小林送外卖。
a. 代码号 0 — 网络不可达<br>
<font color="#ff00ff">外卖版本:</font><br><ul><li>小林第一次送外卖时,小区里只有 A 和 B 区两栋楼,但送餐地址写的是 C 区楼,<br>小林表示头上很多问号,压根就没这个地方。</li></ul>
<font color="#ff00ff">正常版本:</font><br><ul><li>IP 地址是分为网络号和主机号的,所以当路由器中的路由器表匹配不到接收方 IP 的<br>网络号,就通过 ICMP 协议以 <b><font color="#0000ff">网络不可达</font></b>(Network Unreachable)的原因告知主机。</li></ul>
自从不再有网络分类以后,网络不可达也渐渐不再使用了。<br>
b. 代码号 1 — 主机不可达
<font color="#ff00ff">外卖版本:</font><br><ul><li>小林第二次送外卖时,这次小区有 5 层楼高的 C 区楼了,找到地方了,但送餐地址写的</li></ul> 是 C 区楼 601 号房 ,说明找不到这个房间。
<font color="#ff00ff">正常版本:</font><br><ul><li>当路由表中没有该主机的信息,或者该主机没有连接到网络,那么会通过 ICMP 协议以 <b><font color="#0000ff">主机<br>不可达</font></b>(Host Unreachable)的原因告知主机。</li></ul>
c. 代码号 2 — 协议不可达
<font color="#ff00ff">外卖版本:</font><br><ul><li>小林第三次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,<br>但是一开门人家是外国人说的是英语,我说的是中文!语言不通,外卖送达失败~</li></ul>
<font color="#ff00ff">正常版本:</font><br><ul><li>当主机使用 TCP 协议访问对端主机时,能找到对端的主机了,可是对端主机的防火墙已经禁止 <br>TCP 协议访问,那么会通过 ICMP 协议以 <b><font color="#0000ff">协议不可达 </font></b>的原因告知主机。</li></ul>
d. 代码号 3 — 端口不可达
<font color="#ff00ff">外卖版本:</font><br><ul><li>小林第四次送外卖时,这次小区有 C 区楼,也有 601 号房,找到地方了,也找到房间了,<br>房间里的人也是说中文的人了,但是人家说他要的不是外卖,而是快递。。。</li></ul>
<font color="#ff00ff">正常版本:</font><br><ul><li>当主机访问对端主机 8080 端口时,这次能找到对端主机了,防火墙也没有限制,可是发现<br>对端主机没有进程监听 8080 端口,那么会通过 ICMP 协议以 <b><font color="#0000ff">端口不可达 </font></b>的原因告知主机。</li></ul>
e. 代码号 4 — 需分片但设置了不分
<font color="#ff00ff">外卖版本:</font><br><ul><li>小林第五次送外卖时,这次是个吃播博主点了 100 份外卖,但是吃播博主要求一次性<br>要把全部外卖送达,小林的一台电动车装不下呀,这样就没办法送达了。</li></ul>
<font color="#ff00ff">正常版本:</font><br><ul><li>发送端主机发送 IP 数据报时,将 IP 首部的 <b><font color="#0000ff">分片禁止标志位 </font></b>设置为1。根据这个标志位,<br>途中的路由器遇到 <b><font color="#0000ff">超过 MTU 大小的数据包时,不会进行分片,而是直接抛弃</font></b>。</li><li>随后,通过一个 ICMP 的不可达消息类型,<b><font color="#0000ff">代码为 4 的报文</font></b>,告知发送端主机。</li></ul>
原点抑制消息(ICMP Source Quench Message) —— 类型 4<br>
在使用低速广域线路的情况下,连接 WAN 的路由器可能会遇到网络拥堵的问题。
ICMP 原点抑制消息的目的就是为了 <b><font color="#0000ff">缓和这种拥堵情况</font></b>。
当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,<br>可以向 IP 包的源地址发送一个 <b><font color="#0000ff">ICMP 原点抑制消息</font></b>。
收到这个消息的主机借此了解在整个线路的某一处发生了拥堵的情况,从而增大 <br>IP 包的传输间隔,减少网络拥堵的情况。
然而,由于这种 ICMP 可能会引起不公平的网络通信,一般不被使用。
重定向消息(ICMP Redirect Message) —— 类型 5
如果路由器发现发送端主机使用了<b><font color="#0000ff">「不是最优」的路径 </font></b>发送数据,那么它会返回一个 <b><font color="#0000ff">ICMP 重定向消息 </font></b>给这个主机。
在这个消息中包含了 <b><font color="#0000ff">最合适的路由信息和源数据</font></b>。这主要发生在路由器持有更好的路由信息的情况下。<br>路由器会通过这样的 ICMP 消息告知发送端,让它下次发给另外一个路由器。
好比,小林本可以过条马路就能到的地方,但小林不知道,所以绕了一圈才到,后面小林知道后,下次小林就不会那么傻再绕一圈了。
超时消息(ICMP Time Exceeded Message) —— 类型 11<br>
IP 包中有一个字段叫做 TTL (Time To Live,生存周期),它的 <b><font color="#0000ff">值随着每经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃</font></b>。
此时,路由器将会发送一个<b><font color="#0000ff"> ICMP 超时消息 </font></b>给发送端主机,并通知 <b><font color="#0000ff">该包已被丢弃</font></b>。
设置 IP 包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免 IP 包无休止地在网络上被转发。
此外,有时可以用 TTL <b><font color="#0000ff">控制包的到达范围</font></b>,例如设置一个较小的 TTL 值。<br>
ping — 查询报文类型的使用
接下来,我们重点来看 ping 的 <b><font color="#0000ff">发送和接收过程</font></b>。
同个子网下的主机 A 和 主机 B,主机 A 执行ping 主机 B 后,我们来看看其间发送了什么?
ping 命令执行的时候,源主机首先会构建一个 <b><font color="#0000ff">ICMP 回送请求消息数据包</font></b>。
ICMP 数据包内包含多个字段,最重要的是两个:<br><ul><li>第一个是 <b><font color="#0000ff">类型</font></b>,对于回送请求消息而言该字段为 8;</li><li>另外一个是 <b><font color="#0000ff">序号</font></b>,主要用于区分连续 ping 的时候发出的多个数据包。</li></ul>
每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。
然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为 <b><font color="#0000ff">目的地址</font></b>,<br>本机 IP 地址作为 <b><font color="#0000ff">源地址</font></b>,<b><font color="#0000ff">协议字段 </font></b>设置为 1 表示是 ICMP 协议,再加上一些其他控制信息,构建一个 IP 数据包。
接下来,需要加入 MAC 头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;<br>如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传<br>过来的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。
主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。
接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 <b><font color="#0000ff">ICMP 回送响应消息数据包</font></b>,回送响应数据包的 <b><font color="#0000ff">类型字段 </font></b>为 0,<b><font color="#0000ff">序号 </font></b>为接收到的请求数据包中的序号,然后再发送出去给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。
此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。
针对上面发送的事情,总结成了如下图:
当然这只是最简单的,同一个局域网里面的情况。如果跨网段的话,还会涉及网关的转发、路由器的转发等等。
但是对于 ICMP 的头来讲,是没什么影响的。会影响的是根据目标 IP 地址,选择路由的下一跳,<br>还有每经过一个路由器到达一个新的局域网,需要换 MAC 头里面的 MAC 地址。
说了这么多,可以看出 ping 这个程序是 <b><font color="#0000ff">使用了 ICMP 里面的 ECHO REQUEST(类型为 8 ) 和 ECHO REPLY (类型为 0)</font></b>。<br>
traceroute — 差错报文类型的使用
有一款充分利用 <b><font color="#0000ff">ICMP 差错报文类型 </font></b>的应用叫做 traceroute(在UNIX、MacOS中是这个命令,而在Windows中对等的命令叫做 tracert )。
1. traceroute 作用一<br>
traceroute 的第一个作用就是 <b><font color="#0000ff">故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器</font></b>。
traceroute 的参数指向某个目的 IP 地址:
这个作用是如何工作的呢?
它的原理就是利用 IP 包的 <b><font color="#0000ff">生存期限</font></b> 从 1 开始按照顺序递增的同时发送 <b><font color="#0000ff">UDP 包</font></b>,强制接收 <b><font color="#0000ff">ICMP 超时消息 </font></b>的一种方法。
比如,将 TTL 设置 为 1,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是 <b><font color="#0000ff">时间超时</font></b>。
接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器也牺牲了,也同时返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。
这样的过程,traceroute 就可以拿到了所有的路由器 IP。
当然有的路由器根本就不会返回这个 ICMP,所以对于有的公网地址,是看不到中间经过的路由的。
发送方如何知道发出的 UDP 包是否到达了目的主机呢?
traceroute 在发送 UDP 包时,会填入一个 <b><font color="#0000ff">不可能的端口号</font></b> 值作为 UDP 目标端口号:33434。然后对于每个下一个探针,<br>它都会增加一个,这些端口都是通常认为不会被使用,不过,没有人知道当某些应用程序监听此类端口时会发生什么。
当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型是<b><font color="#0000ff">「端口不可达」</font></b>。
所以,<b><font color="#0000ff">当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机</font></b>。
2. traceroute 作用二
traceroute 还有一个作用是 <b><font color="#0000ff">故意设置不分片,从而确定路径的 MTU</font></b>。
这样做的目的是为了 <b><font color="#0000ff">路径 MTU 发现</font></b>。
因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,<br>但是非以外网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。
它的工作原理如下:
首先在发送端主机发送 IP 数据报时,将 IP 包首部的 <b><font color="#0000ff">分片禁止标志位 </font></b>设置为 1。<br>根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。
随后,通过一个 ICMP 的不可达消息将 <b><font color="#0000ff">数据链路上 MTU 的值 </font></b>一起给发送主机,<br>不可达消息的类型为<b><font color="#0000ff">「需要进行分片但设置了不分片位」</font></b>。
发送主机端每次收到 ICMP 差错报文时就 <b><font color="#0000ff">减少 </font></b>包的大小,以此来定位一个合适的 MTU 值,以便能到达目标主机。
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页