这篇文章来讲一下我对交换机(Switch)和路由器(Router)的理解。

进入正文之前,我们先来画一下TCP/IP的网络层次图:

     +++++++++++++++++++
     |  Application    |
     +++++++++++++++++++
     |  Transportation |
     +++++++++++++++++++
     |  Network        |  <- router
     +++++++++++++++++++
     |  Data Link      |  <- switch
     +++++++++++++++++++
     |  Physical       |    
     +++++++++++++++++++

图中我们看到,交换机是工作在数据链路层(Data Link)的,而路由器工作在网络层(Network)。

数据链路层之间通信的时候,靠的是机器48位的MAC(Media Access Control)地址。交换机也是 根据MAC地址与自身端口之间关系来对Ethernet Frame进行转发,注意,这句话中的“端口”指的是 交换机的网线插口,而不是我们常说的应用层(Application)通信时的端口。下面我们来看一个 例子:

    A      B      C
    |      |      |
  --o------o------o--  <-switch
    1      2      3

从图中我们可以看到,主机A,B和C接在一个交换机上,其中,A接在端口1,B接在端口2,C接在端口3。 交换机把这三个主机连接在一起,所以它们之间可以互相通信。交换机内部还维护着一张MAC地址 -- 端口 的哈希表,用于Ethernet Frame的转发。在上图中,这个表长这个样子:

    +++++++++++++++++++++++++++
    |  MAC Address |  Port    |
    +++++++++++++++++++++++++++
    |  A's MAC     |  Port 1  |
    +++++++++++++++++++++++++++
    |  B's MAC     |  Port 2  |
    +++++++++++++++++++++++++++
    |  C's MAC     |  Port 3  |
    +++++++++++++++++++++++++++

如果某一端口中传出来的Ethernet Frame的源MAC地址与该端口在表中对应的MAC地址不匹配,那么交换机会 更新表中的这一行。这个机制也可以用来增加新加入的设备的信息。假如此时交换机的端口4接入了一个主机D, 但是这张表中没有主机D的数据。这时交换机就可以通过主机D发来的Ethernet Frame来增加它与端口的映射 关系。比如A想向D发送数据,这个数据到达交换机这边,交换机查表发现没有D的端口映射关系,于是 就发一个广播Ethernet Frame,目的地址为“FF:FF:FF:FF:FF:FF”,意思是群发给当前Ethernet的所有主机, 因为D在这个Ethernet中,所以D也会收到这个Ethernet Frame,然后一看是A传给自己的,所以就发一个回复 Ethernet Frame给A,交换机接收到这个Frame,发现源MAC地址是D的MAC地址,且是从端口4传进来的,就去 表中查D的端口对应关系,一看表中没有D的数据,于是就在表中加入一行,最终表就变成了这个样子:

    +++++++++++++++++++++++++++
    |  MAC Address |  Port    |
    +++++++++++++++++++++++++++
    |  A's MAC     |  Port 1  |
    +++++++++++++++++++++++++++
    |  B's MAC     |  Port 2  |
    +++++++++++++++++++++++++++
    |  C's MAC     |  Port 3  |
    +++++++++++++++++++++++++++
    |  D's MAC     |  Port 4  |
    +++++++++++++++++++++++++++

通过上面的文字,我们知道交换机工作在数据链路层,根据机器的MAC地址进行通信,同时内部还维护着 一张主机MAC地址和自身端口对应的哈希表。同时我们还了解到,因为交换机是根据机器的MAC地址进行通信, 所以它主要服务于LAN(Local Area Network),我们的工作中常用的集线器(Hub)就是一个小型交换机:

好了,说完了交换机,我们再来看看路由器。与交换机工作在数据链路层不同,路由器是工作在网络层。 网络层传输的是IP Packet,靠32位的IP地址(IPv4)进行通信,路由器的功能就是对这些IP Packet进行转发。 我们家用的路由器通常是用来上网的,对吧,结构大致如下:

   ------        ----------        ---------        -------
   | PC |--------| router |--------| modem |--------| ISP |
   ------        ----------        ---------        -------

一台PC机器通过网线连在路由器上,路由器再用一根网线接在modem上,modem就是我们平时说的“猫”。 modem再与ISP(Internet Server Provider)连接,ISP就是我们常说的网络服务提供商,在中国一般 就是三家:中国移动,中国联通和中国电信。等这些连接都完成,那么我们就可以用PC在网上冲浪啦。

路由器有管理IP地址的功能。连接在一台路由器的设备都属于一个子网,通常来说,这些设备的IP地址 都是路由器去分配的,用的是DHCP(Dynamic Host Configuration Protocol)协议。这些设备本地运行着 DHCP的客户端,路由器这边运行着DHCP的服务器端,客户端可以向服务器端请求IP地址。这是本地的Ethernet, 也就是LAN,这里的IP地址被称为私有IP(Private IP)。但是我们如果想在网上冲浪的话,除了私有IP地址 外,我们还需要一个WAN(Wide Area Network)的IP,也就是公有IP(Public IP)。这个IP是由ISP来提供的。 比如你想访问Google,你发出的IP Packet会先到本地的路由器,路由器把IP Packet的源IP地址换成ISP提供的 公网IP,然后再转发出去。再收到回复后,再把目的IP地址换成私有IP,再转发给你,你就能看到Google的 页面啦。这种替换IP地址的机制被称为NAT(Network Address Translation)。

顺便说一句,现在的路由器长这个样子:

可以看到,它中间有一组LAN端口,说明它已经集成了Hub的功能,也就是说,就算不连modem和ISP,你也可以用它来 像Hub一样组一个Ethernet。这也很好理解,因为路由器就是一个小计算机,它里面实现了Physical, Data Link和Network三个层并运行着相应的网络进程,自然就可以做Hub的Ethernet Frame转发的事情。

以上。