LV06-02-网络基础-02-因特网中的机器如何通信
本文主要是网络基础——因特网中的机器通信方式的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
网络怎么通信的 | 如果让你来设计网络(qq.com) |
一、概述
“网络”的定义是比较宽泛的,小到两台计算机之间的通信,大到世界上所有计算机之间的通信,都可以称为网络。根据地域覆盖范围的大小,可以将网络细分为以下三种:
- 局域网(LAN):覆盖方圆几千米以内的网络,比如公司网络、家庭网络、网吧网络等;
- 城域网(MAN):更大型的局域网,覆盖范围可以达到几十千米,数据传输的实现技术和局域网类似,比如覆盖一个城市的网络;
- 广域网(WAN):覆盖地域最大,从几十千米到几万千米,可以覆盖一个或几个国家、一个或几个洲。因特网(互联网)就是典型的广域网。
局域网和城域网、城域网和广域网之间没有明显的界限。经过前边一节的学习,我知道到了同一个局域网中的设备是怎么通信的,那么扩大一下范围,整个因特网的的设备是怎么通信的呢?
其实有这样一个疑问:在同一个局域网内,任意两台机器的 IP 地址都不能相同,否则会发生 IP 地址冲突,导致两台机器都无法正常连通网络。但是在因特网里的多个局域网中,可能存在 IP 地址相同的多台机器,它们不仅不相互冲突,还能正常连网通信。例如和朋友一起开黑打游戏,我的 IP 地址是 192.168.1.2,隔壁小伙伴的 IP 地址也是 192.168.1.2,甚至全世界有几百万台电脑的 IP 地址都是 192.168.1.2,这些设备不会相互冲突,都能上网通信。这是为什么?我们下边来了解一下吧。
二、需要了解的IP知识
1. IP分类
后边会详细再学习,这里先提前了解一点东西,后边要用。一开始出现的IP地址是IPv4,但是 IPv4 地址是不够用的,为了缓解 IP 地址的分配压力,把 IP 地址分成了 A、B、C、D 和 E 共 5 类。不仅如此,A、B 和 C 类中还各自包含一些特殊的 IP 地址:
- A 类:10.0.0.0 ~ 10.255.255.255
- B 类:172.16.0.0 ~ 172.31.255.255
- C 类:192.168.0.0 ~ 192.168.255.255
这些 IP 地址规定只允许在局域网内部使用,称为私网 IP 地址;相对地,其它 IP 地址称为公网 IP 地址。私网 IP 和公网 IP 的区别有很多,比如:
(1)私网 IP 只能在局域网内部使用,在广域网中是不被承认的;公网 IP 在广域网使用。
(2)私网 IP 可以在不同的局域网内重复使用;公网 IP 在全世界是唯一的。
(3)私网 IP 的通信范围仅限在局域网内部;公网 IP 可以和因特网内的任意机器通信。
(4)公网 IP 由互联网服务提供商(简称 ISP,比如移动、电信、联通)分配,而私网 IP 地址由路由器分配。
(5)公网 IP 地址是收费的,而私网 IP 地址可以免费使用。
2. NAT技术
私网 IP 地址是无法用来在因特网上通信,这就引出一个问题,我们和开黑的朋友都是私网 IP 地址,为什么可以上网通信呢?答案是利用 NAT 技术。NAT(Network Address Translation,网络地址转换)是一种将私网 IP 和公网 IP 相互转换的技术,通常实现在路由器上,称为 NAT 路由器。
NAT 路由器至少要分配 1 个公网 IP 地址,局域网内的机器要想和外网通信,必须先借助 NAT 技术将私网 IP 地址转换为公网 IP 地址;同样的道理,外网机器要想和局域网内的机器通信,也必须先借助 NAT 技术将公网 IP 地址转换为私网 IP 地址。
三、实例1:局域网机器访问外网服务器
1. 端口的概念
其实前边学习过了,这加深下印象吧。
假设网络上有一篇教程(例如C语言初探 (biancheng.net)),处于某个局域网内的我们之所以能阅读这篇教程,是因为我们的浏览器向这篇文档所在的服务器(也就是C语言中文网服务器)发送了请求,随后服务器做出了响应并将文章数据回传给了我们的浏览器。
需要注意的是,即便计算机有了 IP 地址和 MAC 地址,也仍然不能进行通信。原因很简单,一台计算机可以同时提供多种网络服务,比如 Web 服务(网站)、FTP 服务(文件传输服务)、SMTP 服务(邮箱服务)等,仅有 IP 地址和 MAC 地址,数据包虽然可以找到目标计算机,但目标机器不知道要将数据包交给哪个网络程序来处理,所以通信失败。
为了区分不同的网络程序,计算机会为每个网络程序分配一个独一无二的端口号(Port Number)。端口号是 0~65535 之间的十进制数,一些常见的端口:
- Web 服务的端口号是 80;
- FTP 服务的端口号是 21;
- SMTP 服务的端口号是 25。
端口(Port)是一个虚拟的、逻辑上的概念。可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号。如下图所示:
图三-1 端口和端口号
2. 数据包传输分析
在下图中,假设我们使用机器 A 访问外网的 C 语言中文网服务器,服务器的端口是 80,机器 A 中想访问服务器的网络程序的端口是 1025。
图三-2 局域网内机器访问外网服务器
数据包在网络中的传输过程是:
(1)C语言中文网的域名是 c.biancheng.net,通过 DNS 服务可以找到域名对应的 IP 地址,假设为 202.108.22.5。
DNS 是一种免费、快速、公共的互联网服务,它就像一个巨大的电话簿,记录着域名和 IP 的对应关系。如果想访问某个网站,我们需要先知道它的域名,然后通过 DNS 服务找到域名对应的 IP 地址;只有知道了 IP 地址,我们才能将请求发送出去。意思就是,网络通信是基于 IP 地址的,而不是基于域名的。域名只是一种助记符,IP 地址才是真正的“门牌号”。
我们在浏览器中直接输入域名就能访问网站,是因为浏览器在后台帮助我们完成了 DNS 转换过程。
(2)由于服务器的 IP 地址为 202.108.22.5,和机器 A 不在同一个子网,因此机器 A 会将请求数据包发送给默认网关(此过程会通过 ARP 获取到默认网关的 MAC 地址),也就是图中的 NAT 路由器。发送的数据包如下图所示:
图三-3 将数据包发送给默认网关
(3)接收到数据包的 NAT 路由器,会启动 NAT 技术将数据包中的源私网 IP 地址转换为公网 IP 地址,同时用一个新的端口号替换源端口号。NAT 路由器会将【源私网 IP + 端口号】和【公网 IP + 新端口号】的对应关系保存到一张表中,称为 NAT 转换表:
源私网 IP + 源端口号 | 公网 IP + 新端口号 |
---|---|
192.168.1.2:1025 | 200.10.10.0:2222 |
上一步中的数据包经过 NAT 路由器加工后,会变成下图这样:
图三-4 NAT路由器发出的数据包
图中的下一跳指的是下一个路由器的 MAC 地址,数据在广域网中可能会经过多个路由器转发,过程中数据包的源 MAC 地址和目标 MAC 地址会不断变化,但源 IP 和目标 IP 是不变的。
(4)数据包经过多次转发,最终会到达C语言中文网的服务器。通过数据包中的目标 IP 地址和目标 MAC 地址,服务器确认数据包是发给自己的,于是收下数据并发送一个响应数据包。
(5)响应数据包在网络中的传送过程就是请求数据包的逆过程。起初的响应数据包如下图所示:
图三-5 服务器发出的响应数据包
注意,数据包中的目标 IP 地址并不是机器 A 的,而是默认网关的,同样端口号也是如此。也就是说,对于服务器而言,它只知道是机器 A 的默认网关在和它通信,而不知道是机器 A。
(6)数据包在经过多个路由器转发后,最终会到达 NAT 路由器。NAT 路由器会启动 NAT 技术,根据 NAT 转换表将【目标 IP + 端口号】转换为【源私网 IP + 端口号】,再根据 arp 协议更新目标 MAC 地址,最终转发出去的数据包为:
图三-6 局域网内的响应数据包
(7)剩下的工作就是在局域网内传输数据了,根据数据包中的目标 IP 和 MAC 地址,最终就能回传给机器 A。
四、实例2:不同局域网内的机器相互通信
1. 分析
上图中有两个局域网,【A、B 和路由1】同属一个局域网,而【C、D 和路由2】同属另一个局域网。如果我们希望让 A 和 D 之间进行通信,该怎么做呢?为了找到解决方案,我们必须首先明确一点:
公网(Internet)计算机无法直接向局域网内部的计算机传输数据,它必须先传输给 NAT 路由,然后再由 NAT 路由转发给局域网内部的计算机。
A 和 D 的通信要经过公网,这意味着:A 只能向 NAT 路由2传输数据,D 只能向 NAT 路由1传输数据。但是,这个时候尴尬的问题出现了,就是我们不知道两台路由器的 IP 地址和端口号,通信失败!
拿到对方计算机的 IP 和端口号,是网络通信的前提。从某种角度来讲,网络通信就是向某个 IP 和端口号发送数据。我们想一下【实例1】,C语言中文网服务器是如何知道 NAT 路由的 IP 和端口的呢?很简单,只要局域网内部的计算机访问一下服务器,服务器就能拿到 NAT 路由的 IP 地址和端口号(临时的)。
所以我们只要在公网中额外放置一台服务器,让 A 和 D 都访问这台服务器,然后获得 NAT 路由的 IP 和端口号,就能让 A 和 D 之间进行通信了。
绕来绕去,不同局域网中的计算机并不能直接通信,必须要有一台公网服务器牵线搭桥,有了这个“媒人”,它们之间就能直接发送数据了,就不需要公网服务器了。
我们和朋友可以微信视频,是因为我们在登录微信时都会访问腾讯的服务器,服务器会记录我们的 NAT 路由信息,当我们之间想发起视频时,服务器只需要告知对方的 NAT 路由信息就可以了。
2. 通信过程
最后,我们再来梳理一下通信细节。假设访问公网服务器以后,A 和 D 的 NAT 路由信息如下所示:
表四-1 路由 1 的NAT转换表
源私网 IP + 源端口号 | 公网 IP + 新端口号 |
---|---|
192.168.1.2:1025 | 200.10.10.0:2222 |
表四-2 路由 2 的NAT转换表
源私网 IP + 源端口号 | 公网 IP + 新端口号 |
---|---|
192.168.1.4:1025 | 200.20.20.0:3333 |
我们以 A 向 D 发送数据包为例,数据包在网络中的传输过程是:
(1)A 将数据包发送给 D 的默认网关,也就是路由 2。数据包中的目标 IP 地址为 200.20.20.0,端口号为 3333。
(2)数据包经过路由 1 时,数据包中的源 IP 地址和端口号被分别转换为 200.10.10.0 和 2222;
(3)经过因特网中多个路由器的转发,数据包最终会到达路由 2;
(4)路由 2 根据数据包中记录的目标 IP 地址和端口号,判断数据包确实是发送给当前局域网内某台机器的,于是收下数据包并根据 NAT 转换表将包中的目标 IP 地址和端口号分别转换为 192.168.1.4 和 1025;
(5)数据包达到 D 所在的局域网内部后,根据 IP 地址和 MAC 地址就可以找到机器 D。
反过来,D 向 A 发送数据包也是类似的流程。