双绞线
局域网网线使用的是双绞线,其中“双绞”的意思就是以两根信号线为一组缠绕在一起,这种拧麻花一样的设计是为了抑制噪声的影响。
产生噪声的原因是网线周围的电磁波,当电磁波接触到金属等导体时,在其中就会产生电流。因此,如果网线周围存在电磁波,就会在网线中产生和原本的信号不同的电流。由于信号本身也是一种带有电压变化的电流,其本质和噪声产生的电流是一样的,所以信号和噪声的电流就会混杂在一起,导致信号的波形发生失真,这就是噪声的影响.
首先,信号线是用金属做成的,当电磁波接触到信号线时,会沿电磁波传播的右旋方向产生电流,这种电流会导致波形发生失真。
如果我们将信号线缠绕在一起,信号线就变成了螺旋形,其中两根信号线中产生的噪声电流方向就会相反,从而使得噪声电流相互抵消,噪声就得到了抑制。
另一种电磁波是从网线中相邻的信号线泄漏出来的。由于传输的信号本身就是一种电流,当电流流过时就会向周围发出电磁波,这些电磁波对于其他信号线来说就成了噪声。这种内部产生的噪声称为串扰(crosstalk)。
距离发生源越远,电磁波就会因扩散而变得越弱,但在同一根网线中的信号线之间距离很近,这些电磁波还没怎么衰减就已经接触到了相邻的信号线。因此,尽管信号线产生的电磁波十分微弱,也能够在相邻的信号线中产生感应电流。
除此之外还有其他一些工艺也能够帮助提升性能。例如在信号线之间加入隔板保持距离,以及在外面包裹可阻挡电磁波的金属屏蔽网等。
由于集线器只是原封不动地将信号广播出去,所以即便信号受到噪声的干扰发生了失真,也会原样发送到目的地。
这时,接收信号的设备,也就是交换机、路由器、服务器等,会在将信号转换成数字信息后通过FCS校验发现错误,并将出错的包丢弃。当然,丢弃包并不会影响数据的传输,因为丢弃的包不会触发确认响应。因此协议栈的TCP模块会检测到丢包,并对该包进行重传。
交换机
交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓冲区中。
交换机端口的MAC模块不具有MAC地址。将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。MAC地址表主要包含两个信息,一个是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上
交换电路的输入端和输出端分别连接各个接收端口和发送端口,网络包通过这个网格状的电路在端口之间流动。
假设现在要将包从2号端口发送到7号端口,那么信号会从输入端的2号线进入交换电路,这时,如果让左起的6个开关水平导通,然后将第7个开关切换为垂直导通,信号就会像图上一样流到输出端7号线路,于是网络包就被发送到了7号端口。
每个交叉点上的交换开关都可以独立工作,因此只要路径不重复,就可以同时传输多路信号。
当网络包通过交换电路到达发送端口时,端口中的MAC模块和PHY(MAU)模块会执行发送操作。
首先应该确认没有其他设备在发送信号,也就是确认信号收发模块中的接收线路没有信号进来。如果检测到其他设备在发送信号,则需要等待信号发送完毕。
如果在发送过程中检测到其他设备发送信号,就意味着出现了信号碰撞,这时需要发送阻塞信号以停止网络中所有的发送操作,等待一段时间后再尝试重新发送,这一步和网卡也是一样的。
交换机在转发包的过程中,还需要对MAC地址表的内容进行维护,维护操作分为两种。
第一种是收到包时,将发送方MAC地址以及其输入端口的号码写入MAC地址表中,因此只要某个设备发送过网络包,它的MAC地址就会被记录到地址表中。
另一种是删除地址表中某条记录的操作,这是为了防止设备移动时产生问题。
比如,我们在开会时会把笔记本电脑从办公桌拿到会议室,这时设备就发生了移动。从交换机的角度来看,就是本来连接在某个端口上的笔记本电脑消失了。这时如果交换机收到了发往这台已经消失的笔记本电脑的包,那么它依然会将包转发到原来的端口,通信就会出错,因此必须想办法删除那些过时的记录。然而,交换机没办法知道这台笔记本电脑已经从原来的端口移走了。因此地址表中的记录不能永久有效,而是要在一段时间不使用后就自动删除。
综合来看,为了防止终端设备移动产生问题,只需要将一段时间不使用的过时记录从地址表中删除就可以了。
过时记录从地址表中删除的时间一般为几分钟,因此在过时记录被删除之前,依然可能有发给该设备的包到达交换机。这时,交换机会将包转发到老的端口,通信就会发生错误,这种情况尽管罕见,但的确也有可能发生。不过大家不必紧张,遇到这样的情况,只要重启一下交换机,地址表就会被清空并更新正确的信息,然后网络就又可以正常工作了。
当交换机发现一个包要发回到原端口时,就会直接丢弃这个包。
地址表中找不到指定的MAC地址,这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收包,而其他设备则会忽略这个包。
全双工模式是交换机特有的工作模式,它可以同时进行发送和接收操作,集线器不具备这样的特性。
人们对以太网规范进行了修订,增加了一个无论网络中有没有信号都可以发送信号的工作模式,同时规定在这一工作模式下停用碰撞检测。这种工作模式就是全双工模式。
在全双工模式下,无需等待其他信号结束就可以发送信号,因此它比半双工模式速度要快。由于双方可以同时发送数据,所以可同时传输的数据量也更大,性能也就更高。
全双工模式和半双工模式最开始是手动切换,这个太麻烦,后来实现了自动切换,这一功能可以由相互连接的双方探测对方是否支持全双工模式,并自动切换成相应的工作模式。此外,除了能自动切换工作模式之外,还能探测对方的传输速率并进行自动切换。这种自动切换的功能称为自动协商。
在没有数据信号时就填充连接脉冲,这使得网络中一直都有一定的信号流过,从而能够检测对方是否在正常工作。
以太网设备的网线接口周围有一个绿色的LED指示灯,它表示是否检测到正常的脉冲信号。如果绿灯亮,说明PHY(MAU)模块以及网线连接正常。
人们又设计出了具有特定排列的脉冲信号,通过这种信号可以将自身的状态告知对方。自动协商功能就利用了这样的脉冲信号,即通过这种信号将自己能够支持的工作模式和传输速率相互告知对方,并从中选择一个最优的组合。
假设现在连接双方的情况如下图,网卡一方支持所有的速率和工作模式,而交换机只支持到100 Mbit/s全双工模式。当两台设备通电并完成硬件初始化之后,就会开始用脉冲信号发送自己支持的速率和工作模式。当对方收到信号之后,会通过读取脉冲信号的排列来判断对方支持的模式,然后看看双方都支持的模式有哪些。按照优先级排序的,因此双方都支持的模式就是第3行及以下的部分。越往上优先级越高,因此在本例中100 Mbit/s全双工模式就是最优组合,于是双方就会以这个模式开始工作。
路由器
路由器包括转发模块和端口模块两部分就可以了。其中转发模块负责判断包的转发目的地,端口模块负责包的收发操作。
路由器在转发包时,首先会通过端口将发过来的包接收进来,这一步的工作过程取决于端口对应的通信技术。对于以太网端口来说,就是按照以太网规范进行工作,而无线局域网端口则按照无线局域网的规范工作,总之就是委托端口的硬件将包接收进来。接下来,转发模块会根据接收到的包的IP头部中记录的接收方IP地址,在路由表中进行查询,以此判断转发目标。然后,转发模块将包转移到转发目标对应的端口,端口再按照硬件的规则将包发送出去,也就是转发模块委托端口模块将包发送出去的意思。
路由器的端口模块负责接收和发送的工作。
以以太网端口为例,路由器的端口具有MAC地址,因此它就能够成为以太网的发送方和接收方。端口还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。当转发包时,首先路由器端口会接收发给自己的以太网包,然后查询转发目标,再由相应的端口作为发送方将以太网包发送出去。这一点和交换机是不同的,交换机只是将进来的包转发出去而已,它自己并不会成为发送方或者接收方。路由器的各个端口都具有MAC地址和IP地址。
路由器中的表叫作路由表。
路由器路由表这里的IP地址只包含表示子网的网络号部分的比特值,而表示主机号部分的比特值全部为0。
路由器查找路由表匹配的ip地址时,则会忽略主机号部分,只匹配网络号部分。打个比方,路由器在转发包的时候只看接收方地址属于哪个区,××区发往这一边,××区发往那一边。
经过路由聚合,多个子网会被合并成一个子网,子网掩码会发生变化,同时,目标地址列也会改成聚合后的地址。聚合子网可以减少路由表的存储。具体的分发由那边的路由器来。
从结果上看,路由表的子网掩码列只是用来在匹配目标地址时告诉路由器应该匹配多少个比特。而且,目标地址中的地址和实际子网的网络号可能并不完全相同,但即便如此,路由器依然可以正常工作。
路由表的子网掩码列只表示在匹配网络包目标地址时需要对比的比特数量。
在子网掩码的右边还有网关和接口两列,它们表示网络包的转发目标。根据目标地址和子网掩码匹配到某条记录后,路由器就会将网络包交给接口列中指定的网络接口(即端口),并转发到网关列中指定的IP地址。
最后一列是跃点计数,它表示距离目标IP地址的距离是远还是近。这个数字越小,表示距离目的地越近;数字越大,表示距离目的地越远。
对路由表进行维护的方法有几种,大体上可分为以下两类。(a)由人手动维护路由记录(b)根据路由协议机制,通过路由器之间的信息交换由路由器自行维护路由表的记录其中(b)中提到的路由协议有很多种,例如RIP、OSPF、BGP等都属于路由协议。
路由器接收包,路由器以太网端口的结构和计算机的网卡基本相同,接收包并存放到缓冲区中的过程也和网卡几乎没有区别。
完成包接收操作之后,路由器就会丢弃包开头的MAC头部。MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器端口的MAC地址。因此,当包到达路由器之后,MAC头部的任务就完成了,于是MAC头部就会被丢弃。
接下来,路由器会根据MAC头部后方的IP头部中的内容进行包的转发操作。
首先是查询路由表判断转发目标。
判断转发目标的第一步,就是根据包的接收方IP地址查询路由表中的目标地址栏,以找到相匹配的记录。
这个匹配并不是匹配全部32个比特,而是根据子网掩码列中的值判断网络号的比特数,并匹配相应数量的比特。
子网掩码列为255.255.255.0,就表示需要匹配从左起24个比特。网络包的接收方IP地址和路由表中的目标地址左起24个比特的内容都是192.168.1,因此两者是匹配的,该行记录就是候选转发目标之一。
按照这样的规则,我们可能会匹配到多条候选记录。
路由器首先寻找网络号比特数最长的一条记录。网络号比特数越长,说明主机号比特数越短,也就意味着该子网内可分配的主机数量越少,即子网中可能存在的主机数量越少,这一规则的目的是尽量缩小范围,
有时候路由表中会存在网络号长度相同的多条记录,例如考虑到路由器或网线的故障而设置的备用路由就属于这种情况。这时,需要根据跃点计数的值来进行判断。跃点计数越小说明该路由越近,因此应选择跃点计数较小的记录。
如果在路由表中无法找到匹配的记录,路由器会丢弃这个包,并通过ICMP消息告知发送方。
交换机遇到无法匹配的情况,交换机连接的网络最多也就是几千台设备的规模,这个规模并不大。如果只有几千台设备,遇到不知道应该转发到哪里的包,交换机可以将包发送到所有的端口上,虽然这个方法很简单粗暴,但不会引发什么问题。
路由表中的最后一行的作用就相当于把所有目标都配置好了。这一行的子网掩码为0.0.0.0,关键就在这里,子网掩码0.0.0.0的意思是网络包接收方IP地址和路由表目标地址的匹配中需要匹配的比特数为0,换句话说,就是根本不需要匹配。只要将子网掩码设置为0.0.0.0,那么无论任何地址都能匹配到这一条记录,这样就不会发生不知道要转发到哪里的问题了。相当于一个默认的转发地址。
只要在这一条记录的网关列中填写接入互联网的路由器地址,当匹配不到其他路由时,网络包就会被转发到互联网接入路由器。因此这条记录被称为默认路由,这一行配置的网关地址被称为默认网关。在计算机的TCP/IP设置窗口中也有一个填写默认网关的框,意思是一样的。
因为有了默认路由,所以在匹配不到路由的时候就会走这里,也不会丢包了。
路由器还有一些工作要完成。第一个工作是更新IP头部中的TTL(Timeto Live,生存时间)字段。TTL字段表示包的有效期,包每经过一个路由器的转发,这个值就会减1,当这个值变成0时,就表示超过了有效期,这个包就会被丢弃。
发送方在发送包时会将TTL设为64或128,也就是说包经过这么多路由器后就会“寿终正寝”。
现在的互联网即便访问一台位于地球另一侧的服务器,最多也只需要经过几十个路由器,因此只要包被正确转发,就可以在过期之前到达目的地。