LV06-02-网络基础-01-网络中的各种设备

本文主要是网络基础——网络中的各种设备以及网络是怎么实现数据传输的基础知识的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
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)
点击查看相关文件下载
--- ---

一、网线

1. 两台计算机

我们现在有两台电脑,如何完成它们之间的通信?它们都有网口,我们只需要一根网线就可以了,就像下边这样:

img

我们知道数据在计算机中是以二进制的形式存储的,两台计算机通信时传输的当然也就是二进制数据啦。网线常用高低电平来分别表示 01,从而将二进制数据传输给对方。若上图的 AB 发送数据,A 机器的网卡会将数据包转换成电信号,电信号通过网线就可以传送给 B 机器。B 机器的网卡接收到电信号后,会将其还原成二进制数据。

2. 三台计算机

突然发现,两台计算机不够用了,现在再买一台C计算机,这样这三台计算机依然可以通过网线连接,每个计算机有两个网口就可以啦。

img

这样也还行,还可以接受。

3. 五台计算机呢?

image-20220613115855020

是不是就有些眼花了,要是更多的计算机怎么办?有这么多线,也没这么多网口啊。

二、集线器

1. 集线器的出现

为了解决上边的问题,需要找一个中间设备,将网线都插到这个设备上,由这个设备做转发,这样也可以是实现通信,这本质上和原来一样,只不过网口的数量和网线的数量减少了:

img

所有计算机没有直接建立通信,而是全部连接到中间的这台设备上,称为集线器(简称 Hub)。它仅仅是将电信号转发到所有出口(广播),不做任何处理,于是将它定性在了物理层

2. MAC地址

接收到数据包的集线器,会把数据包转发给网络中的其它计算机。可是,计算机怎么知道数据是发给自己的呢?这个时候就需要一个唯一的标识,就像我们的名字一样,叫我们的名字,我们自然就知道是叫自己的啦。这个标识就是**MAC地址**。MAC地址也叫物理地址、硬件地址,长度为 48 位,一般这样来表示:

1
00-16-EA-AE-3C-40

它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)。其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性。

计算机在出厂时,它自己的MAC 地址已经被写到网卡里面了,每台计算机的 MAC 地址都是不一样的。假设 A 机器的 MAC 地址为 aa-aa-aa-aa-aa-aa-aaB 机器的 MAC 地址为 bb-bb-bb-bb-bb-bb。当 A 机器向 B 机器发送数据时,数据包中会同时附带 ABMAC 地址,如下图所示:

image-20220613121230055

这样一来,当 B 机器接收到数据包后,根据头部的 MAC 信息就可以判定是发给自己的了,就会收下这个数据包,其他的计算机收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包并不是发给自己的,于是便丢弃

img

3. 集线器的缺点

其实集线器比起直接使用网线连接,已经方便了很多了,但是,它还是有着一些缺点:

  • 数据被大量转发,原本只发给一台计算机的数据,集线器会转发给网络内的所有计算机,这是很浪费网络资源的。并且这种情况下,如果有多台计算机同时向集线器发送数据包,数据的转发就会产生冲突(碰撞),严重时会导致数据传输失败。
  • 数据安全无法保证,集线器只是负责将数据转发给所有机器,就相当于一个中转站,它不会对数据包有任何的检测,即便数据包中有病毒,它也不管,数据的安全性很难得到保证。

三、交换机

1. 交换机的出现

我们会想,为什么一定要把数据发送给所有的计算机,难道就不能直接找到目标机器,我直接发给它不行吗?为了解决这个问题,就需要将数据只发给目标 MAC 地址指向的那台电脑,于是出现了交换机

交换机拥有多个端口,每个端口都可以连接一台计算机。为了实现精准转发,交换机内部维护着一张表格,主要记录每台计算机的 MAC 地址以及它所连接在的网口号,这张表格通常称为 MAC 地址表。就像这样:

img

假如说我们还是要发给 B 一个数据包,构造了图中的数据包从网口出去。到达交换机时,交换机内部通过自己维护的 MAC 地址表,发现目标计算机 BMAC 地址 bb-bb-bb-bb-bb-bb 连接在网口 1 上,于是把数据从 1 号网口发给了 B

虽然交换机只比集线器多了这一点点区别,但是就是因为这一点的区别,我们就可以它放在数据链路层了(后边会再学习)。

我们通过这样传输方式而组成的小范围的网络,叫就是我们常说的以太网。这种基于交换数据包方式构建小型网络的技术称为以太网技术。以太网其实是一种组建网络的技术,由技术构建的小型网络称为局域网LAN)。

2. 地址表的建立

一开始的时候,交换机并不知道这个网络中究竟有哪些主机,那这张表是如何被建立起来的呢?

img

建立过程是这样的:

  • (1)计算机 A 发送的数据包进入交换机后,交换机的 MAC 地址表中会记录下 AMAC 地址和占用的网口号;
  • (2)由于MAC 地址表没有和 计算机B 相关的信息,交换机会像集线器那样将数据包转发给连接在交换机上除 A 外的所有计算机;
  • (3)计算机 B 收到数据包后,确认数据是 A 发给自己的,于是收下数据,并向 A 回传一份响应数据;
  • (4)响应数据包进入交换机后,交换机会记录下 BMAC 地址和占用的网口号;
  • (5)通过查询 MAC 地址表,交换机会将响应数据包通过 4 号网口发送给 A

这样地址表中就有计算机ABMAC地址和它们连接的网口号啦,随着网络中计算机相互通信,交换机内部的MAC地址表最终会建立完整。

3. 多个交换机

一台交换机的网口数毕竟还是是有限,随着计算机数量的增加,很可能要用多台交换机才能为所有机器建立通信,如下图所示:

img

按照上述的接线方式即可完成所有电脑的互联,所以交换机设计的这种规则,真的很巧妙。但是需要注意,图中那根红色的线,最终在 MAC 地址表中可不会仅仅只有一条记录,而是要把 EFGH 这四台机器与该网口(网口6)的映射全部记录在表中。

左侧的交换机右侧的交换机
MAC地址网口号MAC地址网口号
aa-aa-aa-aa-aa-aa 1aa-aa-aa-aa-aa-aa1
bb-bb-bb-bb-bb-bb 2bb-bb-bb-bb-bb-bb1
cc-cc-cc-cc-cc-cc 3cc-cc-cc-cc-cc-cc1
dd-dd-dd-dd-dd-dd 4dd-dd-dd-dd-dd-dd1
gg-gg-gg-gg-gg-gg 6ee-ee-ee-ee-ee-ee2
hh-hh-hh-hh-hh-hh 6ff-ff-ff-ff-ff-ff3
ee-ee-ee-ee-ee-ee 6gg-gg-gg-gg-gg-gg4
ff-ff-ff-ff-ff-ff 6hh-hh-hh-hh-hh-hh6

4. 交换机的缺点

随着时代的发展,计算机越来越多,交换机的劣势也越来越明显:

  • (1)网络中的每台交换机都需要维护大量的 MAC 地址,多个交换机连接起来之后,地址表重复的也越来越多(主要是因为那根红色的线),每台交换机的MAC地址表也会越来越大;
  • (2)当网络中的计算机频繁通信时,很容易发生广播风暴,严重时会导致网络瘫痪。所谓广播风暴,指的是由于某些原因(网卡损坏、网络设备误用、网络病毒等)导致网络中存在大量无用的数据包,占用着大量的网络资源,正常的数据包也无法在网络中有效传送,网络设备也会因高负荷运转而受到影响。

四、路由器

1. 路由器的出现

计算机数量不断增多,交换机已经不能满足这么多计算机互联的需求了,其实问题的根本在于连出去的那根红色的网线,也就是交换机之间连接的那根线,后面不知道有多少个设备不断地连接进来,从而使得地址表越来越大。

这时候就会想,可不可以让那根红色的网线,接入一个新的设备,这个设备就跟电脑一样有自己独立的 MAC 地址,而且同时还能帮忙把数据包做一次转发呢?

于是,出现了路由器,路由器也是一种包含多个网口、能转发数据的设备,和交换机不同的是,路由器的每个网口都有独立MAC 地址。且可以帮我们把数据包做一次转发它可以定义在网络层(后边会再学习)。

image-20220613141546642

现在交换机的 MAC 地址表中,只需要多出一条 MAC 地址 ABAB 或者CDCD与其占用的网口的映射关系,就可以成功把数据包转交给路由器了。也就是说对于跨交换机发送数据的情况,交换机 1MAC地址表中只需要记录 “路由器 MAC 地址 ABAB ~ 3号网口” 这条信息即可,而不需要记录 CD 相关的信息。同样,交换机 2 也是如此。并且路由器可以缩小广播风暴的影响范围。比如交换机1所在的局域网发生广播风暴,不会影响交换机 2 所在的局域网。

注意,路由器的每一个端口,都有独立的 MAC 地址

2. IP地址的出现

数据已经可以从计算机A或者B发送到路由器了,那怎么继续把数据包发送给 CD的数据包统统先发送给路由器呢?假如电计算机CDMAC 地址拥有共同的前缀,比如分别是:

1
2
C 的 MAC 地址:FF-FF-FF-FF-CC-CC
D 的 MAC 地址:FF-FF-FF-FF-DD-DD

那我们是否可以说,将目标 MAC 地址为 FF-FF-FF-FF-开头的,统统先发送给路由器?当然是不可以的啦。我们知道它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)中的,是写死的,无法改变的。例如,

1
00-16-EA-AE-3C-40

其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。也就是说计算机的MAC地址就如同我们的身份证上的身份证号码一样,具有唯一性。

那如果我们希望向上面那样表示将目标 MAC 地址为 FF-FF-FF-FF-开头的,统一从路由器出去发给某一群设备(后面会提到这其实是子网的概念),那我们就需要要求某一子网下的计算机统统是购买同一个厂商制造的设备,还需要要求厂商在生产设备烧录 MAC 地址时,提前按照我们规划好的子网结构来定 MAC 地址,并且以后这个网络的结构都不能轻易改变。这,,,显然不可能嘛,这成本也太高了,而且万一有问题,换都换不了。

那怎么办呢?不能有一种新的地址,来解决上边的问题嘛?当然可以,这就是IP地址啦。可以给每一台机器一个 32 位的编号,如:

1
11000000101010000000000000000001

有木有觉得这串数字太乱了,一点都不清楚,那我们就每8位点一个点:

1
11000000.10101000.00000000.00000001

似乎还是不符合我们平时的习惯,我们再转化成十进制:

1
192.168.0.1

这下就人性化多了嘛。现在局域网中的每一台计算机,既有自己的 MAC 地址,又有自己的 IP 地址;路由器的每个网口也是既有唯一的MAC地址,也有唯一的IP地址。 IP 地址是软件层面上的,可以随时修改,MAC 地址一般是无法修改的。

image-20220613144536471

3. 重新组网后数据格式

我们先给上面的组网方式中的每一台设备,加上自己的 IP 地址:

image-20220613145724335

路由器的存在,使得交换机的 MAC 地址表中不再需要记录网络中所有机器的信息,例如图中的交换机 1 就不需要记录 CD 的信息。在这样的网络中传输数据,数据包中除了要携带 MAC 地址,还要携带 IP 地址。

3.1 不跨路由传输

假如 AB 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,这个时候网络层还没有体现出作用。

image-20220613150211229

3.2 跨路由传输

现在要是想从A发送数据到CA 就需要先转交给路由器,然后再由路由器转交给 C。由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的。

image-20220613150922494

4. 几个问题的解决

上边A->B数据传输应该没什么问题,主要是A->C数据传输,有以下几个问题:

(1)问题一:AC 发数据包,怎么知道是否要通过路由器转发呢?

(2)问题二:大家都有MACIPA怎么知道哪个是路由器的?

(3)问题三:路由器怎么知道C在哪?

(4)问题四:刚才说的都是 IP 层,但发送数据包的数据链路层需要知道 MAC 地址,可是只知道 IP 地址该怎么办呢?

4.1 问题一:子网和子网掩码

先来解决一下问题一:AC 发数据包,怎么知道是否要通过路由器转发呢?

如果 AB 发送数据,数据包可以直接经交换机转发给 B,不需要发送给路由器;如果 AC 发送数据,A 必须先将数据包发送给路由器,再由路由器转发给 C。也就是说,不同的机器之间通信,有时需要将数据包发送给路由器,有时就不需要,那么机器是如何判别两种情况的呢?答案就是子网

先深入了解一点IP地址的知识,就是IP地址其实是有两部分组成的:

1
IP 地址 = 网络号 + 主机号

网络号和主机号一共是 32 位二进制数,它们各自占用的二进制位数并不固定。所谓子网,指的是一个局域网内所有 IP 网络号相同的机器组成的网络。

如果发送方IP与接收方IP处于同一个子网,就直接将数据包通过交换机发送出去,发送方IP与接收方IP不是在同一个子网中,就需要将数据包通过路由器转发出去。

  • 192.168.0.1192.168.0.2 的网络号都是192.168.0,所以AB两台计算机处于同一个子网,所以它俩传输数据直接通过交换机就可以了;
  • 192.168.0.1192.168.1.1 的网络号都是192.168.1,所以CD两台计算机处于相同子网,但是它俩与AB不在同一个子网,所以AC之间就需要通过路由器转发一下数据包了。

这是我们人为规定的,也就是说我们想表示,对于 192.168.0.1 来说:192.168.0.xxx 开头的,就算是在一个子网,否则就是在不同的子网。对于 192.168.1.1也是一样的。那么这只是我们自己这样理解,计算机不理解没用啊,计算机不理解就无法判断两个IP地址是否处于同一个子网。

于是就出现了子网掩码 ,例如,上图中,我们将计算机的子网掩码定为 255.255.255.0这表示,将发送方 IP 与接收方 IP 分别同这个子网掩码进行与运算,若结果相等则是在一个子网,不相等就是在不同子网。比如

1
2
3
4
A计算机: 192.168.0.1 & 255.255.255.0 = 192.168.0.0
B计算机: 192.168.0.2 & 255.255.255.0 = 192.168.0.0
C计算机: 192.168.1.1 & 255.255.255.0 = 192.168.1.0
D计算机: 192.168.1.2 & 255.255.255.0 = 192.168.1.0

这样便很容易得出,AB 在同一个子网,CD 在同一个子网,但是 AC就不在同一个子网,与 D 也不在同一个子网,如此这般,上边的图片就划分为了两个子网。

image-20220613154045980

所以AC 发数据包,先计算AC是否在一个子网中,若在同一个子网,那么就不需要通过路由器转发,若不再在同一个子网,就需要通过路由器转发了。

4.2 问题二:默认网关

然后是问题二:大家都有MACIPA怎么知道哪个是路由器的?

这个问题的答案是默认网关Default Gateway,也叫缺省网关A发送数据到路由器这个说法其实并不准确,应该说A将数据包发给默认网关。

A 来说,A 只能直接把包发给同处于一个子网下的某个 IP 上,所以发给路由器还是发给某个计算机,对 A 来说也不关心,只要这个设备有个 IP 地址就行。所以其实默认网关,就是 A 在自己计算机里配置的一个 IP 地址,以便在发数据包给不同子网的机器时,可以先发给这个 IP 地址。

image-20220613162405651

这里我就有些迷了,我们听到过的概念有路由器,网关,默认网关,它们有什么关系?

  • 网关

网关实质上是一个网络通向其他网络的IP地址,是自己出口的IP地址,也是别人入口的IP地址,就像一个出入的网络关口。它主要是用来连接两种不同的网络,同时,网关还能够同时与两边的主机之间进行通信,但是两边的主机是不能够直接进行通信,是必须要经过网关才能进行通信。网关的工作是在应用层当中的。网关它可以是路由器,交换机或者是PC。

  • 默认网关

一台主机可以有多个网关。默认网关就是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。默认网关必须是计算机自己所在的网段(将IP地址和子网掩码作与运算,得到网段)中的IP地址,而不能填写其他网段中的IP地址。

  • 路由器

路由器它是属于网络层设备,通常是以包为单位进行数据的发送。路由器它是一个网络层系统。我们在这个路由器的子接口处设置的IP地址就是网关。

4.3 问题三:路由表

接下来是问题三:路由器又是如何知道C在哪里的?

一台路由器有多个网口,每个网口都可以连接一个局域网。接收到数据包的路由器,必须先判定出目标机器所在局域网占用的网口号,才能将数据包转发出去。

和交换机类似,路由器的内部也维护着一张表格,记录着各个网络占用的网口号,通常称为路由表。路由器中的路由表是通过一些算法建立的,比如向量-距离算法、链路-状态算法等(没学过,不是很懂,不过问题不大,重点暂时不在这里)。不同于 MAC 地址表的是,路由表并不是一对一这种明确关系:

目的地址子网掩码下一跳端口
192.168.0.0255.255.255.0 0
192.168.0.254255.255.255.255 0
192.168.1.0255.255.255.0 1
192.168.1.254255.255.255.255 1

通过将目标地址和子网掩码做按位与运算,就可以判定目标机器所处的子网。所谓下一跳地址,当网络中有多个路由器相连时,数据包可能途径多个路由器,这时才会用到下一跳地址。

先来看一下另一种IP地址的表示方式。对于IP地址的写法,还有一种,由于子网掩码其实就表示前多少位表示子网的网段,所以如 192.168.0.0255.255.255.0) 也可以简写为 192.168.0.0/24/24就指的是前 24 位二进制数为网络号,也就是192.168.0,所以路由表也可以像下边这样表示:

目的地址下一跳端口
192.168.0.0/24 0
192.168.0.254/32 0
192.168.1.0/24 1
192.168.1.254/32 1

通过下边这张表格,其实还要更好理解一些,路由表就表示,192.168.0.xxx 这个子网下的,都转发到 0 号端口,192.168.1.xxx 这个子网下的,都转发到 1 号端口。下一跳列还没有值,就先不用管了。

img

整个过程就是:

  • AC发送数据,借助子网掩码判断出它们处于不同的子网,因此 A 会将数据发送给默认网关,在这个图中也就是路由器。发送数据包之前,A 机器必须先通过 ARP 协议获得路由器的 MAC 地址并存入数据包中,才能将数据包发出;
  • 数据包首先经过交换机 1,根据数据包中的目标 MAC 地址,在 MAC 地址表中查到路由器 1 占用的网口,将数据包从该网口转发给路由器;
  • 接收到数据包的路由器会做两件事,首先是获取包中的目的 IP 地址,借助路由表查到计算机 C 所在局域网占用的是 1 号网口;然后再通过 ARP 协议获得 CMAC 地址并作为目的 MAC 地址更新到数据包中,最后将数据包从 1 号网口发出;
  • 交换机 2 接收到数据包后,根据数据包中的目的 MAC 地址,从 MAC 地址表查到 C 占用的网口号,于是从该网口将数据包发给 C
  • C 收到数据包后,发现此数据确实是发给自己的,于是收下了数据。

4.4 问题四:ARP

最后一个问题:前边说的都是 IP 层,但发送数据包的数据链路层需要知道 MAC 地址,可是只知道 IP 地址,不知道MAC地址的话,该怎么办呢?

我们只知道IP地址,所以我们需要通过某种方式,由IP地址来找到对应的MAC地址。也就是通过某种方式,找到 192.168.0.2 对应的 MAC 地址 BBBB。这种方式就是ARPAddress Resoloution Protocol)全称地址解析协议,该协议就是专门根据目标机器的 IP 地址获取它的 MAC 地址。该种协议是怎么实现IPMAC的获取的呢?跟前边一样,也是一张表。

同一局域网内的每台计算机(包括路由器)都维护着一张表格,用来记录其它机器 IP 地址和 MAC 地址的对应关系,通常称为 arp 表。

IP 地址MAC 地址
192.168.0.2BBBB

一开始的时候这个arp表是空的,计算机A 为了知道 B192.168.0.2)的 MAC 地址,将会广播一条 arp 请求,B 收到请求后,带上自己的 MAC 地址给 A 一个响应。此时 A 便更新了自己的 arp 表。这样通过大家不断广播 arp 请求,最终所有计算机里面都会将 arp 缓存表更新完整。

五、一个通信实例

1. 下一跳地址

如下图所示的网络拓扑图:

img

图中有两个路由器连接,现在假设A要向F发送数据,数据包要途径两个路由器后才能到达 F,这种情况下就需要用到路由表中的下一跳地址。路由器 1 连接了路由器 2,所以路由器1的路由表有了下一跳地址这一个概念,所以它的路由表就变成了这个样子。

子网 下一跳地址 端口
192.168.0.0/24 1
192.168.0.254/32 1
192.168.1.0/24 2
192.168.1.254/32 2
192.168.2.0/24 192.168.100.5
192.168.100.0/24 3
192.168.100.4/32 3

如果匹配到了有下一跳地址的一项,则需要再次匹配,找到其端口,并找到下一跳 IPMAC 地址。也就是说找来找去,最终必须能映射到一个端口号,然后从这个端口号把数据包发出去。

2. 通信过程分析

img
  • A到路由器1

(1)AIP 地址为 192.168.0.1FIP 地址为 192.168.2.2A 的子网掩码为 255.255.255.0,分别和两个 IP 地址做按位与运算,计算出的结果不同,说明 AF 位于不同的子网。所以A决定将数据包转发给默认网关(192.168.0.254),在这里也就是路由器 1

(2)A 通过 ARP 找到默认网关 192.168.0.254MAC 地址。

(3)A 将源 MAC 地址(AAAA)与网关 MAC 地址(ABAB)封装在数据链路层头部,又将源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.2.2)(注意这里千万不要以为填写的是默认网关的 IP 地址,从始至终这个数据包的两个 IP 地址都是不变的,只有 MAC 地址在不断变化)封装在网络层头部,然后发出数据包,数据包的格式如下:

image-20220613202143988

(4)数据包会途径交换机 1,借助交换机内部的 MAC 地址表,可以查到路由器 1 占用着交换机的 3 号网口,交换机 1 会将数据包从 3 号网口转发给路由器 1

  • 路由器1到路由器2

(5) 数据包来到了路由器 1,路由器1从路由表中查找到目标 IP192.168.2.2)对应的下一跳地址为 192.168.100.5。这种情况下,路由器 1 会做两件事:一是再次去路由表中查找 192.168.100.5 所在子网对应的网口号,结果为 3 号;二是借助 ARP 协议查找 192.168.100.5 对应的 MAC 地址,也就是路由器 2MAC 地址 D2D2,然后更新数据包,如下图所示:

image-20220613202749784

(6)更新后的数据包会被路由器13 号网口转发给路由器 2

  • 路由器2F

(7)数据包来到了路由器 2,路由器2从路由表查找目标 IP192.168.2.2) 所在子网占用的网口号(假设为 1 号网口)。此时路由器 2 需要知道 192.168.2.2MAC 地址了,于是借助 ARP 协议找到 192.168.2.2 对应的 MAC 地址是 FFFF,然后更新数据包,如下图所示:

image-20220613203221165

(8)更新后的数据包会被路由器 21 号网口转发给交换机3

(9)交换机3收到了数据包,发现目的 MAC 地址为 FFFF,查询其 MAC 地址表,发现应该从其 6 号网口出去,于是从 6 号网口把数据包发出去。

  • 完成AF的数据传输

(10) F 最终收到了数据包,并且发现目的 MAC 地址就是自己,于是收下了这个包。

六、端口和端口号

1. 什么是端口号

在前边,我们已经了解了IP地址,MAC地址,有了这两个,我们就可以找到目标计算机,但是呢其实仍然不能进行通信。一台计算机可以同时提供多种网络服务,例如 Web 服务(网站)、FTP 服务(文件传输服务)、SMTP 服务(邮箱服务)等,仅有IP地址和MAC地址的话,计算机虽然可以正确接收到数据包,但是却不知道要将数据包交给哪个网络程序来处理,这个时候通信还是就会失败。

一台主机通常只有一个IP地址,但是可能有多个端口号,每个端口号表示一个能上网的进程。一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务都是能够进行网络通信的进程,IP地址只能区分网络中不同的主机,并不能区分主机中的这些进程,所以不能只靠IP地址。

所以,在这个时候,计算机会为每个网络程序分配一个独一无二的端口号Port Number),例如,Web 服务的端口号是 80FTP 服务的端口号是 21SMTP 服务的端口号是 25。所谓端口Port)其实是一个虚拟的、逻辑上的概念。我们可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号,门的后边就是一个小房间,房间里就是一种网络服务。于是,我们现在就可以通过 IP地址+端口号 来区分主机不同的进程了。需要注意的是,前边的说交换机和路由器的时候,虽然没有提及端口,但传输的数据包中也会还是会记录通信双方的端口号,最终用端口号来确定将数据包发送给机器里的哪个网络程序

image-20220614053923911

端口号一般由IANA (Internet Assigned Numbers Authority) 管理。TCP/IP协议中的服务端口,通过不同的逻辑端口来区分不同的服务。一个IP地址的端口通过16 bit(比特)进行编号,最多可以有65536个端口。端口是通过端口号来标记的,端口号只有整数,范围是从065535

2. 端口号分类

端口号一般有以下几类:

公认端口1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
注册端口1024~49150
动态或私有端口49151~65535

【注意】我们写程序的时候分配端口号不建议使用1024~5000,但是我们可以放心使用5001~65535

3. 常用端口号

常用端口号汇总:

点击查看常用端口号
服务 端口号 说明
FTP 20 FTP服务器真正传输所用的端口,用于上传、下载
FTP 21 用于FTP的登陆认证
SSH、SFTP 22 加密的远程登录,文件传输
SSH:安全外壳协议,专为远程登录会话和其他网络服务提供安全性的协议
Telnet 23 远程登录(在本地主机上使用此端口与远程服务器的22/3389端口连接),它为用户提供了在本地计算机上完成远程主机工作的能力。
SMTP 25简单邮件传输协议,它帮助每台计算机在发送或中转信件时找到下一个目的地。
TFTP 69简单文件传输协议,主机之间进行简单文件传输
HTTP 80 用于网页浏览
POP3 110 邮局协议版本3,本协议主要用于支持使用客户端远程管理在服务器上的电子邮件
SMTP 161 Simple Network Management Protocol,简单网络管理协议
SNMP Trap 162 SNMP陷阱
HTTPS 443 加密的网页浏览端口
CIFS 445 公共Internet文件系统
sql server 1433 Microsoft的SQL服务开放的端口
Oracle 1521 Oracle数据库的默认监听端口
NFS 2049 通过网络,让不同的机器、不同的操作系统实现文件共享
MySQL 3306 mysql 数据库的默认端口
WIN2003远程登录 3389 Windows 2000(2003) Server远程桌面的服务端口,本地服务器开放此端口,去连接到远程的服务器
QQ 4000 腾讯QQ客户端开放此端口
WebLogic 7001 一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器
Wingate 8010 Wingate代理开放此端口
TOMCAT 8080 WWW代理开放此端口

七、字节序

1. 两种字节序

还记得学习C语言的时候,我们有接触到过大端模式和小端模式,我们知道CPU向内存保存数据的方式有两种:

  • 大端序(Big Endian):高位字节存放到低位地址(高位字节在前)。
  • 小端序(Little Endian):高位字节存放到高位地址(低位字节在前)。

网络中传输的数据必须按网络字节序,即大端字节序,为了避免不同类别主机之间在数据交换时由于对于字节序的不同而导致的差错,引入了网络字节序(NBO,Network Byte Order)的概念,在本地主机中由CPU保存的字节序被称为主机字节序(HBO,Host Byte Order)。

  • 不同的机器HBO是不一样的,这与CPU的设计有关。

  • Motorola 68K系列、ARM系列,HBONBO是一致的。

  • Intel X86系列,HBONBO不一致。

2. 字节序转换

小端序系统和大端序系统通信时会发生数据解析错误。因此在发送数据前,要将数据转换为统一的格式——网络字节序。在C语言编程中,有以下函数可以帮助我们完成转换。

1
2
3
4
5
u_short htons (u_short short);  /* host to network short,将short类型数据从主机字节序转换为网络字节序。*/
u_long htonl (u_long hostlong); /* host to network long,将long类型数据从主机字节序转换为网络字节序。*/

u_long ntohl (u_long hostlong); /* network to host long,将long类型数据从网络字节序转换为主机字节序。*/
u_short ntohs (u_short short); /* network to host short,将short类型数据从网络字节序转换为主机字节序。*/

【说明】后边学习Socket编程的时候会详细学习这几个函数(数据类型定义可能略有不同,但是使用方法完全一致)。

八、总结

本文分别从网线直连(包括集线器)、交换机和路由器的角度讲解了数据在网络中的传输细节,下边做一个总结吧。

1. 计算机

(1)首先知道自己的IP和目标计算机的 IP 地址。当通信双方位于不同的局域网时,需要借助第三方服务器得知对方默认网关的 IP 地址;

(2)通过子网掩码,判定是否和目标IP处于同一个子网:

  • 若同处一个子网,通过 ARP 协议直接获得对方的 MAC 地址,数据包通过交换机转发给目标计算机;
  • 若位于不同的子网,通过 ARP 协议获得当前局域网中默认网关的 MAC 地址,数据包通过默认网关的MAC地址转发出去。

2. 交换机

(1)接收到的数据包必须包含目标计算机的 MAC 地址;

(2)在 MAC 地址表中查询目标计算机占用的网口号,若查询成功,直接将数据包通过指定网口发送给目标机器;若查询失败,将数据包从所有网口发送出去。

3. 路由器

(1)接收到的数据包必须包含目标计算机的 IP 地址;

(2)通过路由表中记录的信息,若找到目标计算机所在子网占用的网口号,将数据包通过该网口转发出去,若找到目标机器 IP 地址对应的下一跳地址,将数据包转发到下一个路由器。若是什么也查不到,那就返回一个路由不可达的数据包。

4. 三张表

4.1 是什么?

  • 交换机中有 MAC 地址表用于映射 MAC 地址和它的网口。
  • 路由器中有路由表用于映射 IP 地址(段)和它的网口。
  • 计算机和路由器中都有 arp 缓存表用于缓存 IPMAC 地址的映射关系。

4.2怎么来的?

  • MAC 地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的。
  • 路由表是各种路由算法 + 人工配置逐步完善起来的。
  • arp 缓存表是不断通过 arp 协议的请求逐步完善起来的。