网络概念(二)
以太网的基本知识
以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术。这种网络的本质其实就是一根网线。
收发器的功能只是将不同网线之间的信号连接起来而已。
当一台计算机发送信号时,信号就会通过网线流过整个网络,最终到达所有的设备。这就好像所有人待在一个大房间里,任何一个人说话,所有人都能够听到,同样地,这种网络中任何一台设备发送的信号所有设备都能接收到。因此需要在信号的开头加上接收者的信息,也就是地址。这样一来就能够判断信号的接收者了,与接收者地址匹配的设备就接收这个包,其他的设备则丢弃这个包,这样我们的包就送到指定的目的地了。
通过 MAC 头部中的接收方 MAC 地址,就能够知道包是发给谁的;而通过发送方 MAC 地址,就能够知道包是谁发出的;此外,通过以太类型就可以判断包里面装了什么类型的内容。
有了交换式集线器,现在信号只会流到根据 MAC 地址指定的设备,而不会到达其他设备了。
路由器等网络设备的网卡是集成在设备内部的,其电路的设计也有所不同,尽管结构有差异,但功能和行为是没有区别的。
网卡的 ROM 中保存着全世界唯一的 MAC 地址,这是在生产网卡时写入的。
网卡中保存的 MAC 地址会由网卡驱动程序读取并分配给 MAC模块。
制定以太网标准的组织 IEEE 出于历史原因使用了“帧”而不是“包”,因此在以太网术语中都是说“帧”,其实我们基本没必要讨论两者的区别,可以认为包和帧是一回事,只是说法不同罢了。
图中显示了协议栈和网卡对包的处理过程。MAC 头部很容易被误解为是由网卡来处理的,实际上它是由 TCP/IP 软件来负责的。
用电信号来表示数字信息时,采用将数据信号和时钟信号叠加在一起的方法。由于时钟信号是按固定频率进行变化的,只要根据时钟信号的变化周期,就可以从数据信号中读取相应的电压和电流值,并将其还原为 0 或 1 的比特了。这里的重点在于如何判断时钟信号的变化周期。时钟信号是以 10 Mbit/s或者 100 Mbit/s 这种固定频率进行变化的,因此,不能一开始就发送包的数据,而是要在前面加上一段用来测量时钟信号的特殊信号,这就是报头的作用。
末尾的 FCS(帧校验序列)用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串 32 比特的序列,是通过一个公式对包中从头到尾的所有内容进行计算而得出来的。它和磁盘等设备中使用的 CRC A 错误校验码是同一种东西,当原始数据中某一个比特发生变化时,计算出来的结果就会发生变化。在包传输过程中,如果受到噪声的干扰而导致其中的数据发生了变化,那么接收方计算出的 FCS 和发送方计算出的 FCS 就会不同,这样我们就可以判断出数据有没有错误。
发送信号的操作分为两种,一种是使用集线器的半双工模式,另一种是使用交换机的全双工模式。
网卡的 MAC 模块生成通用信号,然后由 PHY(MAU)模块转换成可在网线中传输的格式,并通过网线发送出去。
半双工模式中,为了避免信号碰撞,首先要判断网线中是否存在其他设备发送的信号。如果有,则需要等待该信号传输完毕,因为如果在有信号时再发送一组信号,两组信号就会发生碰撞。
PHY(MAU)的职责并不是仅仅是将 MAC 模块传递过来的信号通过网线发送出去,它还需要监控接收线路中有没有信号进来。在开始发送信号之前,需要先确认没有其他信号进来,这时才能开始发送。
UDP协议:
如果数据很短,用一个包就能装得下。如果只有一个包,就不用考虑哪个包未送达了,因为全部重发也只不过是重发一个包而已,这种情下我们就不需要 TCP 这样复杂的机制了。而且,如果不使用 TCP,也不需要发送那些用来建立和断开连接的控制包了。此外,我们发送了数据,对方一般都会给出回复,只要将回复的数据当作接收确认就行了,也不需要专门的接收确认包了。这种情况就适合使用 UDP。像 DNS 查询等交换控制信息的操作基本上都可以在一个包的大小范围内解决,这种场景中就可以用 UDP 来代替TCP。
还有另一个场景会使用 UDP,就是发送音频和视频数据的时候。音频和视频数据必须在规定的时间内送达,一旦送达晚了,就会错过播放时机,导致声音和图像卡顿。如果像 TCP 一样通过接收确认响应来检查错误并重发,重发的过程需要消耗一定的时间,因此重发的数据很可能已经错过了播放的时机。一旦错过播放时机,重发数据也是没有用的,因为声音和图像已经卡顿了,这是无法挽回的。当然,我们可以用高速线路让重发的数据能够在规定的时间内送达,但这样一来可能要增加几倍的带宽才行。