网络是怎样连接的-IP与以太网的包收发操作(三)
2.5.6 以太网的基本知识
以太网的定义
完成 IP 模块的工作之后,下面就该轮到网卡了。
在此之前,我们先来了解一些以太网的基本知识。
以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术。
这种网络的本质其实就是一根网线。
图上还有一种叫作收发器的小设备,它的功能只是将不同网线之间的信号连接起来而已。
使用MAC地址找到目标
因此,当一台计算机发送信号时,信号就会通过网线流过整个网络,最终到达所有的设备。
这就好像所有人待在一个大房间里,任何一个人说话,所有人都能够听到。
同样地,这种网络中任何一台设备发送的信号所有设备都能接收到。
不过,我们无法判断一个信号到底是发给谁的,因此需要在信号的开头加上接收者的信息,也就是地址。
这样一来就能够判断信号的接收者了,与接收者地址匹配的设备就接收这个包,其他的设备则丢弃这个包,这样我们的包就送到指定的目的地了。
为了控制这一操作,我们就需要使用 MAC 头部。
通过 MAC 头部中的接收方 MAC 地址,就能够知道包是发给谁的;
通过发送方 MAC 地址,就能够知道包是谁发出的;
通过以太类型就可以判断包里面装了什么类型的内容,以太网其实就这么简单。
实际上,多台设备同时发送信号会造成碰撞,当然也有相应的解决方案,不过这部分比较复杂。
随着交换式集线器的普及,信号已经不会发生碰撞了,因此在实际工作中也不需要在意这个复杂的部分。
中继式集线器和交换式集线器
这个原型后来变成了图 2.22(b)中的结构。
这个结构是将主干网线替换成了一个中继式集线器,将收发器网线替换成了双绞线。
不过,虽然网络的结构有所变化,但信号会发送给所有设备这一基本性质并没有改变。
后来,图 2.22(c)这样的使用交换式集线器的结构普及开来,现在我们说的以太网指的都是这样的结构。
这个结构看上去和(b)很像,但其实里面有一个重要的变化,即信号会发送给所有设备这一性质变了,现在信号只会流到根据 MAC 地址指定的设备,而不会到达其他设备了。
当然,根据MAC 地址来传输包这一点并没有变,因此 MAC 头部的设计也得以保留。
定性为以太网的三个性质
尽管以太网经历了数次变迁,但其基本的 3 个性质至今仍未改变,即将包发送到 MAC 头部的接收方 MAC 地址代表的目的地,用发送方 MAC地址识别发送方,用以太类型识别包的内容。
因此,大家可以认为具备这3 个性质的网络就是以太网。
以太网中的各种设备也是基于以太网规格来工作的,因此下面的内容不仅适用于客户端计算机,同样也适用于服务器、路由器等各种设备。
此外,以太网和 IP 一样,并不关心网络包的实际内容,因此以太网的收发操作也和 TCP 的工作阶段无关,都是共通的。
2.5.7 将 IP 包转换成电或光信号发送出去
以太网的包收发操作
数字信息需要转成电或光信号
IP 生成的网络包只是存放在内存中的一串数字信息,没有办法直接发送给对方。
我们需要将数字信息转换为电或光信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。
网卡负责转换信息
负责执行这一操作的是网卡,但网卡也无法单独工作,要控制网卡还需要网卡驱动程序。
驱动程序不只有网卡才有,键盘、鼠标、显卡、声卡等各种硬件设备都有。
当然,不同厂商和型号的网卡在结构上有所不同,因此网卡驱动程序也是厂商开发的专用程序。
网卡的内部结构如图 2.23 所示,这是一张网卡主要构成要素的概念图,并不代表硬件的实际结构,但依然可以看清大体的思路。
记住这一内部结构之后,我们再来介绍包收发的操作过程。
网卡的初始化过程
网卡并不是通上电之后就可以马上开始工作的,而是和其他硬件一样,都需要进行初始化。
打开计算机启动操作系统的时候,网卡驱动程序会对硬件进行初始化操作,然后硬件才进入可以使用的状态。
这些操作包括硬件错误检查、初始设置等步骤,这些步骤对于很多其他硬件也是共通的。
但也有一些操作是以太网特有的,那就是在控制以太网收发操作的 MAC 模块中设置 MAC 地址。
网卡读取MAC地址
网卡的 ROM 中保存着全世界唯一的 MAC 地址,这是在生产网卡时写入的。
将这个值读出之后就可以对 MAC 模块进行设置,MAC 模块就知道自己对应的 MAC 地址了。
也有一些特殊的方法,比如从命令或者配置文件中读取 MAC 地址并分配给 MAC 模块。
这种情况下,网卡会忽略ROM 中的 MAC 地址。
有人认为在网卡通电之后,ROM 中的 MAC 地址就自动生效了。
其实真正生效的是网卡驱动进行初始化时在 MAC 模块中设置的那个 MAC 地址。
在操作系统启动并完成这些初始化操作之后,网卡就可以等待来自 IP 的委托了。
2.5.8 给网络包再加3个控制数据
网卡是如何将包转换成电信号并发送到网线中的
网卡驱动将包复制到缓冲区
网卡驱动从 IP 模块获取包之后,会将其复制到网卡内的缓冲区中,然后向MAC 模块发送发送包的命令。
MAC模块将包取出
接下来MAC 模块会将包从缓冲区中取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列(图 2.24)。
制定以太网标准的组织 IEEE 出于历史原因使用了“帧”而不是“包”,因此在以太网术语中都是说“帧”。
其实我们基本没必要讨论两者的区别,大家可以认为包和帧是一回事,只是说法不同罢了。
报头用来确定包的读取时机
报头是一串像 10101010…这样 1 和 0 交替出现的比特序列,长度为 56比特,它的作用是确定包的读取时机。
当这些 1010 的比特序列被转换成电信号后,会形成如图 2.25 这样的波形。
接收方在收到信号时,遇到这样的波形就可以判断读取数据的时机。
关于这一块内容,我们得先讲讲如何通过电信号来读取数据。
如何通过电信号读取数据
用电信号来表达数字信息时,我们用 0 和 1 两种比特分别对应特定的电压和电流。
通过测量信号中的电压和电流变化,就可以还原出 0 和 1 两种比特的值。
实际的信号并不像图 2.26 所示的那样有分隔每个比特的辅助线,因此在测量电压和电流时必须先判断出每个比特的界限在哪里。
使用时钟信号判断界限并读取电压和电流的值
连续出现111或000的信号,由于电压和电流没有变化,我们没办法判断出其中每个比特到底应该从哪里去切分。
我们可以在数据信号之外再发送一组用来区分比特间隔的时钟信号,如下图b。
当时钟信号从下往上变化时,读取电压和电流的值,然后和 0 或 1 进行对应就可以了。
但是当距离较远,网线较长时,两条线路的长度会发生差异,数据信号和时钟信号的传输会产生时间差,时钟就会发生偏移。
将数据信号和时钟信号叠加解决偏移问题
采用将数据信号和时钟信号叠加在一起的方法解决偏移问题。如上图c所示,发送方将这样的信号发给接收方。
找到时钟信号的变化周期,就可以从信号c中提取出时钟信号b,通过接收信号c和时钟信号b计算出数据信号a。
然后根据时钟信号b的变化周期,从数据信号a中读取相应的电压和电流值,并将其还原为 0 或 1 的比特了。
使用报头判断时钟信号的变化周期
时钟信号是以10Mbit/s或者100Mbit/s 这种固定频率进行变化的,就像我们乘坐自动扶梯一样,只要对信号进行一段时间的观察,就可以找到其变化的周期。
我们不能一开始就发送包的数据,而是要在前面加上一段用来测量时钟信号的特殊信号,这就是报头的作用。
以太网根据速率和网线类型的不同分为多种派生方式,每种方式的信号形态也有差异。并不都是像本例中讲的这样,单纯通过电压和电流来表达 0 和 1 的。
因此,101010…这样的报头数字信息在转换成电信号后,其波形也不一定都是图 2.25 中的那个样子,而是根据方式的不同而不同。但是,报头的作用和基本思路是一致的。
使用起始帧分界符标记包起始位置
报头后面的起始帧分界符在图 2.25 中也已经画出来了,它的末尾比特排列有少许变化。
接收方以这一变化作为标记,从这里开始提取网络包数据。也就是说,起始帧分界符是一个用来表示包起始位置的标记。
使用FCS帧校验序列检查数据错误
末尾的 FCS(帧校验序列)用来检查包传输过程中因噪声导致的波形紊乱、数据错误。
它是一串 32 比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的。
具体的计算公式在此省略,它和磁盘等设备中使用的 CRC 错误校验码是同一种东西,当原始数据中某一个比特发生变化时,计算出来的结果就会发生变化。
在包传输过程中,如果受到噪声的干扰而导致其中的数据发生了变化,那么接收方计算出的 FCS 和发送方计算出的 FCS 就会不同,这样我们就可以判断出数据有没有错误。