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. 两台计算机
我们现在有两台电脑,如何完成它们之间的通信?它们都有网口,我们只需要一根网线就可以了,就像下边这样:
我们知道数据在计算机中是以二进制的形式存储的,两台计算机通信时传输的当然也就是二进制数据啦。网线常用高低电平来分别表示 0
和 1
,从而将二进制数据传输给对方。若上图的 A
向 B
发送数据,A
机器的网卡会将数据包转换成电信号,电信号通过网线就可以传送给 B
机器。B
机器的网卡接收到电信号后,会将其还原成二进制数据。
2. 三台计算机
突然发现,两台计算机不够用了,现在再买一台C
计算机,这样这三台计算机依然可以通过网线连接,每个计算机有两个网口就可以啦。
这样也还行,还可以接受。
3. 五台计算机呢?
是不是就有些眼花了,要是更多的计算机怎么办?有这么多线,也没这么多网口啊。
二、集线器
1. 集线器的出现
为了解决上边的问题,需要找一个中间设备,将网线都插到这个设备上,由这个设备做转发,这样也可以是实现通信,这本质上和原来一样,只不过网口的数量和网线的数量减少了:
所有计算机没有直接建立通信,而是全部连接到中间的这台设备上,称为集线器(简称 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-aa
,B
机器的 MAC
地址为 bb-bb-bb-bb-bb-bb
。当 A
机器向 B
机器发送数据时,数据包中会同时附带 A
和 B
的 MAC
地址,如下图所示:
这样一来,当 B
机器接收到数据包后,根据头部的 MAC
信息就可以判定是发给自己的了,就会收下这个数据包,其他的计算机收到数据包后,根据头部的目标 MAC
地址信息,判断这个数据包并不是发给自己的,于是便丢弃。
3. 集线器的缺点
其实集线器比起直接使用网线连接,已经方便了很多了,但是,它还是有着一些缺点:
- 数据被大量转发,原本只发给一台计算机的数据,集线器会转发给网络内的所有计算机,这是很浪费网络资源的。并且这种情况下,如果有多台计算机同时向集线器发送数据包,数据的转发就会产生冲突(碰撞),严重时会导致数据传输失败。
- 数据安全无法保证,集线器只是负责将数据转发给所有机器,就相当于一个中转站,它不会对数据包有任何的检测,即便数据包中有病毒,它也不管,数据的安全性很难得到保证。
三、交换机
1. 交换机的出现
我们会想,为什么一定要把数据发送给所有的计算机,难道就不能直接找到目标机器,我直接发给它不行吗?为了解决这个问题,就需要将数据只发给目标 MAC 地址指向的那台电脑,于是出现了交换机。
交换机拥有多个端口,每个端口都可以连接一台计算机。为了实现精准转发,交换机内部维护着一张表格,主要记录每台计算机的 MAC
地址以及它所连接在的网口号,这张表格通常称为 MAC 地址表。就像这样:
假如说我们还是要发给 B
一个数据包,构造了图中的数据包从网口出去。到达交换机时,交换机内部通过自己维护的 MAC
地址表,发现目标计算机 B
的 MAC
地址 bb-bb-bb-bb-bb-bb
连接在网口 1
上,于是把数据从 1
号网口发给了 B
。
虽然交换机只比集线器多了这一点点区别,但是就是因为这一点的区别,我们就可以它放在数据链路层了(后边会再学习)。
我们通过这样传输方式而组成的小范围的网络,叫就是我们常说的以太网。这种基于交换数据包方式构建小型网络的技术称为以太网技术。以太网其实是一种组建网络的技术,由技术构建的小型网络称为局域网(LAN
)。
2. 地址表的建立
一开始的时候,交换机并不知道这个网络中究竟有哪些主机,那这张表是如何被建立起来的呢?
建立过程是这样的:
- (1)计算机
A
发送的数据包进入交换机后,交换机的MAC
地址表中会记录下A
的MAC
地址和占用的网口号; - (2)由于
MAC
地址表没有和 计算机B
相关的信息,交换机会像集线器那样将数据包转发给连接在交换机上除A
外的所有计算机; - (3)计算机
B
收到数据包后,确认数据是A
发给自己的,于是收下数据,并向A
回传一份响应数据; - (4)响应数据包进入交换机后,交换机会记录下
B
的MAC
地址和占用的网口号; - (5)通过查询
MAC
地址表,交换机会将响应数据包通过4
号网口发送给A
。
这样地址表中就有计算机A
和B
的MAC
地址和它们连接的网口号啦,随着网络中计算机相互通信,交换机内部的MAC
地址表最终会建立完整。
3. 多个交换机
一台交换机的网口数毕竟还是是有限,随着计算机数量的增加,很可能要用多台交换机才能为所有机器建立通信,如下图所示:
按照上述的接线方式即可完成所有电脑的互联,所以交换机设计的这种规则,真的很巧妙。但是需要注意,图中那根红色的线,最终在 MAC
地址表中可不会仅仅只有一条记录,而是要把 EFGH
这四台机器与该网口(网口6
)的映射全部记录在表中。最终,两个交换机将分别记录 A ~ H 所有机器的映射记录如下。
左侧的交换机 | 右侧的交换机 | ||
MAC地址 | 网口号 | MAC地址 | 网口号 |
aa-aa-aa-aa-aa-aa | 1 | aa-aa-aa-aa-aa-aa | 1 |
bb-bb-bb-bb-bb-bb | 2 | bb-bb-bb-bb-bb-bb | 1 |
cc-cc-cc-cc-cc-cc | 3 | cc-cc-cc-cc-cc-cc | 1 |
dd-dd-dd-dd-dd-dd | 4 | dd-dd-dd-dd-dd-dd | 1 |
gg-gg-gg-gg-gg-gg | 6 | ee-ee-ee-ee-ee-ee | 2 |
hh-hh-hh-hh-hh-hh | 6 | ff-ff-ff-ff-ff-ff | 3 |
ee-ee-ee-ee-ee-ee | 6 | gg-gg-gg-gg-gg-gg | 4 |
ff-ff-ff-ff-ff-ff | 6 | hh-hh-hh-hh-hh-hh | 6 |
4. 交换机的缺点
随着时代的发展,计算机越来越多,交换机的劣势也越来越明显:
- (1)网络中的每台交换机都需要维护大量的
MAC
地址,多个交换机连接起来之后,地址表重复的也越来越多(主要是因为那根红色的线),每台交换机的MAC
地址表也会越来越大; - (2)当网络中的计算机频繁通信时,很容易发生广播风暴,严重时会导致网络瘫痪。所谓广播风暴,指的是由于某些原因(网卡损坏、网络设备误用、网络病毒等)导致网络中存在大量无用的数据包,占用着大量的网络资源,正常的数据包也无法在网络中有效传送,网络设备也会因高负荷运转而受到影响。
四、路由器
1. 路由器的出现
计算机数量不断增多,交换机已经不能满足这么多计算机互联的需求了,其实问题的根本在于连出去的那根红色的网线,也就是交换机之间连接的那根线,后面不知道有多少个设备不断地连接进来,从而使得地址表越来越大。
这时候就会想,可不可以让那根红色的网线,接入一个新的设备,这个设备就跟电脑一样有自己独立的 MAC
地址,而且同时还能帮忙把数据包做一次转发呢?
于是,出现了路由器,路由器也是一种包含多个网口、能转发数据的设备,和交换机不同的是,路由器的每个网口都有独立的 MAC
地址。且可以帮我们把数据包做一次转发,它可以定义在网络层(后边会再学习)。
现在交换机的 MAC
地址表中,只需要多出一条 MAC
地址 ABAB
或者CDCD
与其占用的网口的映射关系,就可以成功把数据包转交给路由器了。也就是说对于跨交换机发送数据的情况,交换机 1
的 MAC
地址表中只需要记录 “路由器 MAC
地址 ABAB
~ 3
号网口” 这条信息即可,而不需要记录 C
、D
相关的信息。同样,交换机 2
也是如此。并且路由器可以缩小广播风暴的影响范围。比如交换机1
所在的局域网发生广播风暴,不会影响交换机 2
所在的局域网。
注意,路由器的每一个端口,都有独立的 MAC 地址。
2. IP
地址的出现
数据已经可以从计算机A
或者B
发送到路由器了,那怎么继续把数据包发送给 C
和 D
的数据包统统先发送给路由器呢?假如电计算机C
和 D
的 MAC
地址拥有共同的前缀,比如分别是:
1 | C 的 MAC 地址:FF-FF-FF-FF-CC-CC |
那我们是否可以说,将目标 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 |
这下就人性化多了嘛。最后我们可以给这个地址一个响亮的名字,IP 地址。现在局域网中的每一台计算机,既有自己的 MAC
地址,又有自己的 IP
地址;路由器的每个网口也是既有唯一的MAC
地址,也有唯一的IP
地址。 IP
地址是软件层面上的,可以随时修改,MAC
地址一般是无法修改的。
这样一个可以随时修改的 IP 地址,就可以根据我们规划的网络拓扑结构,来调整了。如上图所示,假如我想要发送数据包给 ABCD 其中一台设备,不论哪一台,我都可以这样描述,**”将 IP 地址为 192.168.0 开头的全部发送给到路由器,之后再怎么转发,交给它!”**。那交给路由器之后,路由器又是怎么把数据包准确转发给指定设备的呢?我们后面继续看。
3. 重新组网后数据格式
我们先给上面的组网方式中的每一台设备,加上自己的 IP
地址:
路由器的存在,使得交换机的 MAC
地址表中不再需要记录网络中所有机器的信息,例如图中的交换机 1
就不需要记录 C
、D
的信息。在这样的网络中传输数据,数据包中除了要携带 MAC
地址,还要携带 IP
地址。
3.1 不跨路由传输
假如 A
给 B
发送数据,由于它们直接连着交换机,所以 A
直接发出如下数据包即可,这个时候网络层还没有体现出作用。
3.2 跨路由传输
现在要是想从A
发送数据到C
,A
就需要先转交给路由器,然后再由路由器转交给 C
。由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的。
4. 几个问题的解决
上边A->B
数据传输应该没什么问题,主要是A->C
数据传输,有以下几个问题:
(1)问题一:A
给 C
发数据包,怎么知道是否要通过路由器转发呢?
(2)问题二:大家都有MAC
和IP
,A
怎么知道哪个是路由器的?
(3)问题三:路由器怎么知道C
在哪?
(4)问题四:刚才说的都是 IP
层,但发送数据包的数据链路层需要知道 MAC
地址,可是只知道 IP
地址该怎么办呢?
4.1 问题一:子网和子网掩码
先来解决一下问题一:A
给 C
发数据包,怎么知道是否要通过路由器转发呢?
如果 A
向 B
发送数据,数据包可以直接经交换机转发给 B
,不需要发送给路由器;如果 A
向 C
发送数据,A
必须先将数据包发送给路由器,再由路由器转发给 C
。也就是说,不同的机器之间通信,有时需要将数据包发送给路由器,有时就不需要,那么机器是如何判别两种情况的呢?答案就是子网。
先深入了解一点IP
地址的知识,就是IP
地址其实是有两部分组成的:
1 | IP 地址 = 网络号 + 主机号 |
网络号和主机号一共是 32
位二进制数,它们各自占用的二进制位数并不固定。所谓子网,指的是一个局域网内所有 IP
网络号相同的机器组成的网络。
如果发送方IP
与接收方IP
处于同一个子网,就直接将数据包通过交换机发送出去,发送方IP
与接收方IP
不是在同一个子网中,就需要将数据包通过路由器转发出去。
192.168.0.1
和192.168.0.2
的网络号都是192.168.0
,所以A
、B
两台计算机处于同一个子网,所以它俩传输数据直接通过交换机就可以了;192.168.0.1
和192.168.1.1
的网络号都是192.168.1
,所以C
、D
两台计算机处于相同子网,但是它俩与A
、B
不在同一个子网,所以A
与C
之间就需要通过路由器转发一下数据包了。
这是我们人为规定的,也就是说我们想表示,对于 192.168.0.1
来说:192.168.0.xxx
开头的,就算是在一个子网,否则就是在不同的子网。对于 192.168.1.1
也是一样的。那么这只是我们自己这样理解,计算机不理解没用啊,计算机不理解就无法判断两个IP
地址是否处于同一个子网。
于是就出现了子网掩码 ,例如,上图中,我们将计算机的子网掩码定为 255.255.255.0
这表示,将发送方 IP
与接收方 IP
分别同这个子网掩码进行与运算,若结果相等则是在一个子网,不相等就是在不同子网。比如
1 | A计算机: 192.168.0.1 & 255.255.255.0 = 192.168.0.0 |
这样便很容易得出,A
与 B
在同一个子网,C
与 D
在同一个子网,但是 A
与C
就不在同一个子网,与 D
也不在同一个子网,如此这般,上边的图片就划分为了两个子网。
所以A
给 C
发数据包,先计算A
和C
是否在一个子网中,若在同一个子网,那么就不需要通过路由器转发,若不再在同一个子网,就需要通过路由器转发了。
所以如果 A 给 C 发消息,A 和 C 的 IP 地址分别 & A 机器配置的子网掩码,发现不相等,则 A 认为 C 和自己不在同一个子网,于是把包发给路由器,就不管了,之后怎么转发,A 不关心。
4.2 问题二:默认网关
然后是问题二:大家都有MAC
和IP
,A
怎么知道哪个是路由器的?
这个问题的答案是默认网关Default Gateway
,也叫缺省网关。A
发送数据到路由器这个说法其实并不准确,应该说A
将数据包发给默认网关。
对 A
来说,A
只能直接把包发给同处于一个子网下的某个 IP
上,所以发给路由器还是发给某个计算机,对 A
来说也不关心,只要这个设备有个 IP
地址就行。所以其实默认网关,就是 A 在自己计算机里配置的一个 IP 地址,以便在发数据包给不同子网的机器时,可以先发给这个 IP
地址。
这里我就有些迷了,我们听到过的概念有路由器,网关,默认网关,它们有什么关系?
- 网关
网关实质上是一个网络通向其他网络的
IP
地址,是自己出口的IP
地址,也是别人入口的IP
地址,就像一个出入的网络关口。它主要是用来连接两种不同的网络,同时,网关还能够同时与两边的主机之间进行通信,但是两边的主机是不能够直接进行通信,是必须要经过网关才能进行通信。网关的工作是在应用层当中的。网关它可以是路由器,交换机或者是PC。
- 默认网关
一台主机可以有多个网关。默认网关就是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。默认网关必须是计算机自己所在的网段(将
IP
地址和子网掩码作与运算,得到网段)中的IP
地址,而不能填写其他网段中的IP
地址。
- 路由器
路由器它是属于网络层设备,通常是以包为单位进行数据的发送。路由器它是一个网络层系统。我们在这个路由器的子接口处设置的
IP
地址就是网关。
4.3 问题三:路由表
接下来是问题三:路由器又是如何知道C
在哪里的?
一台路由器有多个网口,每个网口都可以连接一个局域网。接收到数据包的路由器,必须先判定出目标机器所在局域网占用的网口号,才能将数据包转发出去。
和交换机类似,路由器的内部也维护着一张表格,记录着各个网络占用的网口号,通常称为路由表。路由器中的路由表是通过一些算法建立的,比如向量-距离算法、链路-状态算法等(没学过,不是很懂,不过问题不大,重点暂时不在这里)。不同于 MAC
地址表的是,路由表并不是一对一这种明确关系:
目的地址 | 子网掩码 | 下一跳 | 端口 |
192.168.0.0 | 255.255.255.0 | 0 | |
192.168.0.254 | 255.255.255.255 | 0 | |
192.168.1.0 | 255.255.255.0 | 1 | |
192.168.1.254 | 255.255.255.255 | 1 |
先来看一下另一种IP地址的表示方式。对于IP
地址的写法,还有一种,由于子网掩码其实就表示前多少位表示子网的网段,所以如 192.168.0.0
(255.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 |
整个过程就是:
A
向C
发送数据,借助子网掩码判断出它们处于不同的子网,因此A
会将数据发送给默认网关,在这个图中也就是路由器。发送数据包之前,A
机器必须先通过ARP
协议获得路由器的MAC
地址并存入数据包中,才能将数据包发出;- 数据包首先经过交换机
1
,根据数据包中的目标MAC
地址,在MAC
地址表中查到路由器1
占用的网口,将数据包从该网口转发给路由器; - 接收到数据包的路由器会做两件事,首先是获取包中的目的
IP
地址,借助路由表查到计算机C
所在局域网占用的是1
号网口;然后再通过ARP
协议获得C
的MAC
地址并作为目的MAC
地址更新到数据包中,最后将数据包从1
号网口发出; - 交换机
2
接收到数据包后,根据数据包中的目的MAC
地址,从MAC
地址表查到C
占用的网口号,于是从该网口将数据包发给C
; C
收到数据包后,发现此数据确实是发给自己的,于是收下了数据。
4.4 问题四:ARP
最后一个问题:前边说的都是 IP
层,但发送数据包的数据链路层需要知道 MAC
地址,可是只知道 IP
地址,不知道MAC
地址的话,该怎么办呢?
我们只知道IP
地址,所以我们需要通过某种方式,由IP
地址来找到对应的MAC
地址。也就是通过某种方式,找到 192.168.0.2 对应的 MAC 地址 BBBB。这种方式就是ARP
(Address Resoloution Protocol
)全称地址解析协议,该协议就是专门根据目标机器的 IP
地址获取它的 MAC
地址。该种协议是怎么实现IP
到MAC
的获取的呢?跟前边一样,也是一张表。
同一局域网内的每台计算机(包括路由器)都维护着一张表格,用来记录其它机器 IP
地址和 MAC
地址的对应关系,通常称为 arp
表。
IP 地址 | MAC 地址 |
192.168.0.2 | BBBB |
一开始的时候这个arp
表是空的,计算机A
为了知道 B
(192.168.0.2
)的 MAC
地址,将会广播一条 arp
请求,B
收到请求后,带上自己的 MAC
地址给 A
一个响应。此时 A
便更新了自己的 arp
表。这样通过大家不断广播 arp
请求,最终所有计算机里面都会将 arp
缓存表更新完整。
五、一个通信实例
1. 下一跳地址
如下图所示的网络拓扑图:
图中有两个路由器连接,现在假设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 |
如果匹配到了有下一跳地址的一项,则需要再次匹配,找到其端口,并找到下一跳 IP
的 MAC
地址。也就是说找来找去,最终必须能映射到一个端口号,然后从这个端口号把数据包发出去。
2. 通信过程分析
A
到路由器1
(1)A
的 IP
地址为 192.168.0.1
,F
的 IP
地址为 192.168.2.2
。 A
的子网掩码为 255.255.255.0
,分别和两个 IP
地址做按位与运算,计算出的结果不同,说明 A
和 F
位于不同的子网。所以A
决定将数据包转发给默认网关(192.168.0.254
),在这里也就是路由器 1
。
(2)A
通过 ARP
找到默认网关 192.168.0.254
的 MAC
地址。
(3)A
将源 MAC
地址(AAAA
)与网关 MAC
地址(ABAB
)封装在数据链路层头部,又将源 IP
地址(192.168.0.1
)和目的 IP
地址(192.168.2.2
)(注意这里千万不要以为填写的是默认网关的 IP
地址,从始至终这个数据包的两个 IP
地址都是不变的,只有 MAC
地址在不断变化)封装在网络层头部,然后发出数据包,数据包的格式如下:
(4)数据包会途径交换机 1
,借助交换机内部的 MAC
地址表,可以查到路由器 1
占用着交换机的 3
号网口,交换机 1
会将数据包从 3
号网口转发给路由器 1
。
- 路由器
1
到路由器2
(5) 数据包来到了路由器 1
,路由器1
从路由表中查找到目标 IP
(192.168.2.2
)对应的下一跳地址为 192.168.100.5
。这种情况下,路由器 1
会做两件事:一是再次去路由表中查找 192.168.100.5
所在子网对应的网口号,结果为 3
号;二是借助 ARP
协议查找 192.168.100.5
对应的 MAC
地址,也就是路由器 2
的 MAC
地址 D2D2
,然后更新数据包,如下图所示:
(6)更新后的数据包会被路由器1
从 3
号网口转发给路由器 2
。
- 路由器
2
到F
(7)数据包来到了路由器 2
,路由器2
从路由表查找目标 IP
(192.168.2.2
) 所在子网占用的网口号(假设为 1
号网口)。此时路由器 2
需要知道 192.168.2.2
的 MAC
地址了,于是借助 ARP
协议找到 192.168.2.2
对应的 MAC
地址是 FFFF
,然后更新数据包,如下图所示:
(8)更新后的数据包会被路由器 2
从 1
号网口转发给交换机3
。
(9)交换机3
收到了数据包,发现目的 MAC
地址为 FFFF
,查询其 MAC
地址表,发现应该从其 6
号网口出去,于是从 6
号网口把数据包发出去。
- 完成
A
→F
的数据传输
(10) F
最终收到了数据包,并且发现目的 MAC
地址就是自己,于是收下了这个包。
六、端口和端口号
现在可以想一个问题,就是我们会在电脑上运行QQ、微信、钉钉、网页浏览器等 ,这些进程都需要进行网络连接,它们都可通过网络发送/接收数据,那么这里就有一个问题?主机接收到网络数据之后,如何确定该数据是哪个进程对应的接收数据呢?
1. 什么是端口号
在前边,我们已经了解了IP
地址,MAC
地址,有了这两个,我们就可以找到目标计算机,但是呢其实仍然不能进行通信。一台计算机可以同时提供多种网络服务,例如 Web
服务(网站)、FTP
服务(文件传输服务)、SMTP
服务(邮箱服务)等,仅有IP
地址和MAC
地址的话,计算机虽然可以正确接收到数据包,但是却不知道要将数据包交给哪个网络程序来处理,这个时候通信还是就会失败。
一台拥有IP
地址的主机可以提供许多服务,比如上面说的Web
服务、FTP
服务、SMTP
服务等,这些服务都是能够进行网络通信的进程,IP
地址只能区分网络中不同的主机,并不能区分主机中的这些进程,而一台主机通常只有一个IP
地址,所以不能只靠IP
地址。
在这个时候,计算机会为每个网络程序分配一个独一无二的端口号(Port Number
),例如,Web
服务的端口号是 80
,FTP
服务的端口号是 21
,SMTP
服务的端口号是 25
。所谓端口(Port
)其实是一个虚拟的、逻辑上的概念。我们可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号,门的后边就是一个小房间,房间里就是一种网络服务。于是,我们现在就可以通过 IP
地址+
端口号 来区分主机不同的进程了。需要注意的是,前边的说交换机和路由器的时候,虽然没有提及端口,但传输的数据包中也会还是会记录通信双方的端口号,最终用端口号来确定将数据包发送给机器里的哪个网络程序。
端口号一般由IANA
(Internet Assigned Numbers Authority
) 管理。TCP/IP
协议中的服务端口,通过不同的逻辑端口来区分不同的服务。一个IP
地址的端口通过16 bit
(比特)进行编号,最多可以有65536
个端口。端口是通过端口号来标记的,端口号本质上就是一个数字编号,用来在一台主机中唯一标识一个能上网(能够进行网络通信) 的进程, 端口号只有整数,范围是从0
到65535
。
2. 端口号分类
端口号一般有以下几类:
公认端口 | 1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用) |
注册端口 | 1024~49150 |
动态或私有端口 | 49151~65535 |
3. 常用端口号
常用端口号汇总:
点击查看常用端口号
服务 | 端口号 | 说明 |
FTP | 20 | 文件传输协议,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远程桌面的服务端口,本地服务器开放此端口,去连接到远程的服务器 |
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
系列,HBO
与NBO
是一致的。Intel X86
系列,HBO
与NBO
不一致。
2. 字节序转换
小端序系统和大端序系统通信时会发生数据解析错误。因此在发送数据前,要将数据转换为统一的格式——网络字节序。在C
语言编程中,有以下函数可以帮助我们完成转换。
1 | u_short htons (u_short short); /* host to network 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
缓存表用于缓存IP
和MAC
地址的映射关系。
4.2怎么来的?
MAC
地址表是通过以太网内各节点之间不断通过交换机通信,不断完善起来的。- 路由表是各种路由算法
+
人工配置逐步完善起来的。 arp
缓存表是不断通过arp
协议的请求逐步完善起来的。