您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 网络/安全 > 正文

网络设备与协议之协议篇

发表于:2020-04-24 作者:佚名 来源:思科CCIE俱乐部

在访问 Web 站点和发送、接收电子邮件时,我们通常会直接输入 Web 网站的地址或电子邮件地址等那些由应用层提供的地址,而不会使用由十进制数字组成的某个 IP 地址。

但是网络层需要的是 IP 地址,这就需要一种功能--将应用中使用的地址映射为 IP 地址。

此外,在数据链路层也不需要 IP 地址,需要的是 MAC 地址传输数据包。由此可知,在实际通信中,还需要众多支持 IP 的相关技术才能够实现通信。

IP 的辅助技术包括 DNS、ARP、ICMP、ICMPv6、DHCP、NAT等。还包括如 IP 隧道、 IP多播、IP任播、质量控制以及网络拥塞的显式通知和 Mobile IP 技术。

1. DNS

域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53 。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。

(1) DNS查询过程

以查询 zh.wikipedia.org 为例:客户端发送查询报文 "query zh.wikipedia.org" 至DNS服务器,DNS服务器首先检查自身缓存,如果存在记录则直接返回结果。如果记录老化或不存在,则:

  • DNS服务器向根域名服务器发送查询报文"query zh.wikipedia.org",根域名服务器返回顶级域 .org 的权威域名服务器地址。
  • DNS服务器向 .org 域的权威域名服务器发送查询报文"query zh.wikipedia.org",得到二级域 .wikipedia.org 的权威域名服务器地址。
  • DNS服务器向 .wikipedia.org 域的权威域名服务器发送查询报文"query zh.wikipedia.org",得到主机 zh 的A记录,存入自身缓存并返回给客户端。

(2) 查看修改DNS

如下图所示,Mac 电脑可以在「系统偏好设置 - 网络 - Wi-Fi - 高级 - DNS」查看当前网络所使用的 DNS。

为什么我们从来不需要设置 DNS 服务器呢?这是因为现代路由器大多具备 DHCP 服务器的功能,DHCP 服务器自动为我们提供默认的 DNS 服务器地址。

路由器会将连接到自身所有设备的 DNS 服务器地址设置为自己的 IP 地址。连接该路由器的手机、电脑等网络设备的 DNS 请求,统一发送至路由器 IP 地址,此时路由器扮演各设备的 DNS 服务器。然后,路由器转发 DNS 请求,到实际的 DNS 服务器。实际的 DNS 服务器解析域名 IP,返回给路由器。最后,路由器再把 IP 返回给终端设备。

发送 DNS 请求到 DNS 服务器获取网站真实的 IP 地址,这个过程需要一定的时间,影响这个时间的因素之一就是 DNS 服务器的地理位置。DNS 服务器离你越近,传输数据自然更快。因此默认情况下,路由器将从网络提供商提供获取最近的 DNS 服务器地址,实现最快的网络响应。

2. ARP

只要确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信却有必要了解每个 IP 地址所对应的 MAC 地址。

于是需要一种方法,根据目的主机的 IP 地址,获得其 MAC 地址。这就是 ARP 协议要做的事情。所谓地址解析(address resolution)就是主机在发送帧前将目标 IP 地址转换成目标 MAC 地址的过程。

另外,当发送主机和目的主机不在同一个局域网中时,即便知道对方的 MAC 地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过 ARP 协议获得的将不是目的主机的真实 MAC 地址,而是一台可以通往局域网外的路由器的 MAC 地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为委托 ARP 或 ARP代理(ARP Proxy)。

(1) ARP工作原理

ARP 是如何知道 MAC 地址的呢?简单来说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。

在每台安装有 TCP/IP 协议的电脑或路由器里都有一个 ARP 缓存表,表里的 IP 地址与 MAC 地址是一对应的,如下表所示。

以主机A(192.168.38.10)向主机B(192.168.38.11)发送数据为例。

  • 当发送数据时,主机A会在自己的 ARP 缓存表中寻找是否有目标 IP 地址。如果找到就知道目标 MAC 地址为(00-BB-00-62-C2-02),直接把目标 MAC 地址写入帧里面发送就可。
  • 如果在 ARP 缓存表中没有找到相对应的 IP 地址,主机A就会在网络上发送一个广播(ARP request),目标 MAC 地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.38.11的 MAC 地址是什么?”
  • 网络上其他主机并不响应 ARP 询问,只有主机B接收到这个帧时,才向主机A做出这样的回应(ARP response):“192.168.38.11的 MAC 地址是00-BB-00-62-C2-02”,此回应以单播方式。这样,主机A就知道主机B的 MAC 地址,它就可以向主机B发送信息。同时它还更新自己的 ARP 高速缓存(ARP cache),下次再向主机B发送信息时,直接从 ARP 缓存表里查找就可。

需要注意,示例的主机 A 和主机 B 属于同一网段。如果主机 A 和主机 B 不属于同一网段,那么主机 A 发送的广播(ARP request)主机 B 就不可能收到。

所以,在发送广播(ARP request)前,主机 A 会判断主机 B 是否属于同一网段,如果不属于,就会在自己的 ARP 缓存表中寻找网关(也就是路由器)的 MAC 地址。如果没有找到,主机 A 就会在网络上发送一个广播(ARP request)询问网关(路由器)的 MAC 地址。

ARP 缓存表采用老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可减少缓存表的长度,加快查询速度。

(2) 查看本机ARP

如何查看本机 ARP 缓存表呢?

  • Windows:开始 → 运行 → cmd → arp -a(参数a表示显示所有内容)
  • Linux:终端 → arp -nv
  • MacOS:终端 → arp -nla

3. DHCP

如果逐一为每一台主机设置 IP 地址会是非常繁琐的事情。于是,为了实现自动设置 IP 地址、统一管理 IP 地址分配,就产生了 DHCP 协议。

如下图所示,Mac 电脑可以在「系统偏好设置 - 网络 - Wi-Fi - 高级 - TCP/IP」查看当前本地 IP 配置。

DHCP 服务器会统一管理每个子网的 IP 地址分配范围、子网掩码、默认路由以及 DNS 服务器。

有了 DHCP ,计算机只要连接到网络,就可以进行 TCP/IP 通信。也就是说,DHCP 让即插即用变得可能。而 DHCP 不仅在 IPv4 中,在 IPv6 中也可以使用。

(1) DHCP 的工作机制

在使用 DHCP 之前,首先要架设一台 DHCP 服务器(很多时候用该网段的路由器充当 DHCP 服务器。)。然后将 DHCP 所要分配的 IP 地址设置到服务器上。此外,还需要将相应的子网掩码、路由控制信息以及 DNS 服务器的地址等设置到服务器上。

DHCP 服务器搭建好之后,DHCP 的运行分为四个基本过程,分别为请求 IP 租约、提供 IP 租约、选择 IP 租约和确认 IP 租约。所谓租约,也就是计算机 IP 地址的有效期。

由此,DHCP 的网络设置结束,可以进行 TCP/IP 通信。不需要 IP 地址时,可以发送 DHCP 解除包。

另外,DHCP客户端在 IP 租约到期前可以发送 DHCP 请求包通知想要延长这个时限。

4. NAT

告诉大家一个有趣的实验,拿起你的手机和电脑,连接同一 Wi-Fi ,然后访问百度,输入“IP”,你会惊奇的看到手机和电脑显示的 IP 地址是相同的,而且并非是本机 IP 地址。

那么问题来了,在数据包的发送过程中,是根据网络层的来源 IP 地址和目的 IP 地址进行定位。同一局域网的来源 IP 地址根据上面实验的结果显然都是相同的公网 IP ,那么百度响应过来的数据包是如何精确发送到我们的本地计算机呢?答案是使用 NAT 技术。

NAT(Network Address Translator)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址。除转换 IP 地址外,还出现了可以转换 TCP、UDP 端口号的 NART(Network Address Ports Translator)技术,由此可以实现用一个 IP 地址与多个主机的通信。现在我们所说的 NAT 多半都是 NAPT,或者称之为 IP 伪装。

NAT(NAPT)实际上是为了正在面临地址枯竭的 IPv4 而开发的技术,不过,IPv6 为了提高网络安全也正在使用 NAT,在 IPv4 和 IPv6 之间的相互通信当中常常使用 NAT-PT。

(1) NAT的工作机制

如下图所示,以 10.0.0.10 的主机与 163.221.120.9 的主机进行通信为例。利用 NAT ,途中的 NAT 路由器将发送源地址从 10.0.0.10 转换为全局的 IP 地址(202.244.174.37)再发送数据。反之,当包从地址163.221.120.9 发过来时,目标地址(202.244.174.37)先被转换成私有 IP 地址 10.0.0.10 以后再被转发。

NAT 对数据包的 IP 首部进行改动,由于在 TCP 或 UDP 中,IP 地址还用于校验和的计算,因此 IP 发生变化时,也需要相应地将 TCP、UDP 的首部进行转换。

在 NAT(NAPT)路由器的内部,有一张自动生成的用来转换地址的表。当 10.0.0.10 向 163.221.120.9 发送第一个包时生成这张表,并按照表中的映射关系进行处理。

当私有网络内的多台机器同时都要与外部进行通信时,仅仅转换 IP 地址,人们不免担心全局 IP 地址是否不够用。这时采用如下图所示的包含端口号一起转换的方式(NAPT)可以解决这个问题。

如图所示,主机 163.221.120.9 的端口号是 80,局域网有两个客户端 10.0.0.10 和 10.0.0.11 同时进行通信,并且这两个客户端的本地端口都是 1025。此时,仅仅转换 IP 地址为某个全局地址 202.244.174.37,会令转换后的所有数字完全一致。为此,只要将 10.0.0.11 的端口号转换为 1026 就可以解决问题。

将上图椭圆形内容进行合并,生成一个 NAPT 路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端 A、B 能同时与服务器之间进行通信。

这种转换表在 NAT 路由器上自动生成。例如,在 TCP 的情况下,建立 TCP 连接首次握手时的 SYN 包一经发出,就会生成这个表。而后又随着收到关闭连接时发出 FIN 包的确认应答从表中被删除。

在使用 TCP 或 UDP 的通信当中,只有目标地址、源地址、目标端口、源端口以及协议类型(TCP 还是 UDP)五项内容都一致时才被认为是同一个通信连接。也就是复用转换表的同一行记录。

5. ICMP

架构 IP 网络时需要特别注意两点:确认网络是否正常工作,以及遇到异常时进行问题诊断。

例如,一个刚刚搭建好的网络,需要验证该网络的设置是否正确。ICMP 正是提供这类功能的一种协议。

ICMP 的主要功能包括,确认 IP 包是否成功送达目标地址,通知在发送过程当中 IP 包被废弃的具体原因,改善网络设置等。有了这些功能以后,就可以获得网络是否正常、设置是否有误以及设备有何异常等信息,从而便于进行网络上的问题诊断。

在 IP 通信中如果某个 IP 包因为某种原因未能达到目标地址,那么这个具体的原因将由 ICMP 负责通知。例如,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器未能发现主机 B 的存在,这时,路由器就会向主机 A 发送一个 ICMP 包,说明发往主机 B 的包未能成功。

ICMP 的消息大致可以分为两类:一类是通知出错原因的错误消息,另一类是用于诊断的查询消息。

6. ping

ping(呯)是使用 ICMP 协议的一种计算机网络工具,用来测试数据包能否透过 IP 协议到达特定主机。

ping 的运作原理是向目标主机传出一个 ICMP 的请求回显数据包,并等待接收回显回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time)。

ping 有时候也被我们说成了动词,如 “ping一下计算机XXX,看它是否开着。”

下面以 ping 百度的网址作为示例:

可以看到,百度的 IP 地址是 61.135.169.125,以 64 bytes 测试,反应时间 5.589 毫秒,TTL(Time To Live)值为 56。

这里不得不解释 TTL 是什么?

IP 包中有一个字段叫做 TTL (Time To Live,生存周期),它的值随着没经过一次路由器就会减 1,直到减到 0 时该 IP 包会被丢弃。此时,IP 路由器将会发送一个 ICMP 超时的消息给发送端主机,并通知该包已被丢弃。

示例中 TTL 的值为 56 ,假设发送端设置的 TTL 为 64,那么中间经历的路由数为 64 - 56 = 8。

尾声

根据 OSI 七层模型,HTTP 数据报为应用层,在传输层附加 TCP 首部,指明源端口号和目标端口号,在网络层附加 IP 首部,指明发送端和接收端的 IP 地址,指明上层协议号(TCP/UDP),在数据链路层附加以太网首部,指明接收端 MAC 地址和发送端 MAC 地址。

这是你以往的认知,通过本文的学习,相信你可以对 本机 IP 地址、子网掩码的配置,本机 MAC 地址,目的机器 IP 地址,其它机器 MAC 地址的获取等做到知其然又知其所以然。