网卡与路由器

2019/03/22 计算机网络

整理自:网卡与路由器

TODO: 以下只是梗概

DHCP

  • 网卡都有一个全球唯一的地址,这个地址在网卡制造时就是确定的,称为 MAC 地址。如:11:27:F5:8A:79:54。

  • 电脑初接网络时,需要确定 IP 地址,由 DHCP(动态主机配置协议)分配。

  • 但是电脑刚接入网络,不知道 DHCP 在哪里,如何配置?操作系统在应用层创建 DHCP 发现报文,由 UDP 报文封装,再被 IP 数据报封装:

    收件人:255.255.255.255: 67
    发件人:0.0.0.0: 68
    内容:新电脑需要租用一个 IP 地址,谁有?
    
  • 以上 IP 数据报到达网卡处,网卡工作在数据链路层,必须要知道对方的 MAC 地址才可以发送数据,如果不知道的时候就对外广播,使所有电脑都收 到该数据,现在不知道 DHCP 服务器 MAC 地址,所以要广播。于是把 IP 数据报再次封装:

    目的地:FF:FF:FF:FF:FF:FF(广播到同一子网内的所有电脑)
    发件人:11:27:F5:8A:79:54(当前电脑)
    

    之后把数据通过网线发给了交换机。

  • 交换机收到目的地为 FF:FF:FF:FF:FF:FF,转发给所有连到交换机的设备;

  • 局域网内存在 DHCP 服务器,且不止一台,交换机把 DHCP 的回信转回当前电脑,其中一封信的内容如下:

    我是 DHCP 服务器 192.168.1.1,我这里有空闲 IP `192.168.1.2`,你要不要租?
    

    其他信内容也差不多,提供了另外的 IP。

  • 操作系统选择了其中一个 IP,如上步骤向写了回信广播出去:

    你好,服务器 192.168.1.1,我要 IP 192.168.1.2 了。
    
  • DHCP 服务器确认后向本机发回信:

    这是确认信,IP 192.168.1.2 就给你了。网关路由器是 192.168.1.1,DNS 服务器地址是 202.102.224.68。
    

    操作系统把这些网络信息都保存下来:

    IP: 192.168.1.2
    Gateway: 192.168.1.1
    DNS: 202.102.224.68
    

    除非手动配置,否则电脑重启后都要重复以上步骤。

DNS 和 ARP

  • 访问互联网,得先有 IP 地址。一般使用的是可读性更好的域名,则需要把域名翻译为 IP 地址才行,这通过 DNS 来实现。

  • 操作系统向 DNS 服务器写了一封信交给网卡发送:

    发件人:192.168.1.2(本机 IP)
    收件人:202.102.224.68(DNS 服务器)
    内容:哥们,给我查查 www.baidu.com 的 IP 地址吧 
    
  • 但是网卡并不知道 DNS 服务器的 MAC 地址,也不在同一子网内,总不能广播吧(注:通过子网掩码判断是不是在同一子网)。由于不在同一子网,则 要把信发送网关路由器,由其转给 DNS 服务器。这时需要查一下网关的 MAC 地址,如果没有缓存的话就需要通过 ARP (地址解析协议)广播查询一 个 IP 地址对应的 MAC 地址,把以下消息广播出去,子网内所有机器都会收到,网关路由器也不例外:

    收件人:FF:FF:FF:FF:FF:FF(同一子网内所有电脑)
    发件人:11:27:F5:8A:79:54(本机)
    内容:呼叫网关路由器(192.168.1.1),请问你的 MAC 地址是什么?
    

    电脑收到 ARP 应答:

    88-25-93-79-E0-C8
    

    并缓存下来。

  • 查到网关路由器的 MAC 地址后,把之前的 DNS 查询发给网关即可。

  • DNS 服务器很快返回 www.baidu.com 的 IP:115.239.211.112,电脑缓存该地址。

  • 所有工作都准备好了,可以正式上网了。创建 TCP 连接,通过 TCP 发送 HTTP GET 请求,轻松把百度的主页获取到本机,浏览器对主页内容进行解析显示。

网关路由器

router

网关,访问广域网必经的一关,IP 由 ISP(网络服务提供商,Internet Service Provider)提供并与其网络相连。

NAT(网络地址转换)

网关不仅仅是路由器,还是一个 DHCP 服务器,局域网内主机无法使用 DHCP 分配的 IP 无法直接上网,因为这是内网 IP,外网主机并不知道这个内网 IP 是谁的。因此内网主机要上网必须通过路由器。在内网主机访问外网时,通过交换机给路由器发去一个数据帧:

以太网帧
目的地:88:25:93:79:E0:C8
源地址:11:27:F5:8A:79:54
    IP 数据报
    目的地:115.239.211.112
    源地址:192.168.1.2
        TCP 报文
        目的地端口:80
        源地址端口:3345
            HTTP 报文
            GET / HTTP/1.1
            Host: www.baidu.com

路由器收到后把数据链路层解开,发现 IP 数据包中的目标地址是 115.239.211.112,就知道这是发向外网的请求。于是把 IP 数据包中的源地址 192.168.1.2 替换成路由器的外网 IP,并创建一个新的端口号 2001,把 TCP 数据包中的源端口也替换掉,数据包就变成了这样:

IP 数据报
目的地:115.239.211.112
源地址:61.52.247.112
    TCP 报文
    目的地端口:80
    源地址端口:2001
        HTTP 报文
        GET / HTTP/1.1
        Host: www.baidu.com

这样就让外网认为这是路由器发出的请求,因为外网并不知道内网主机的存在。接着查询路由表,确定到底转发到哪个端口去,再给这个 IP 数据报封装到 数据链路层,把数据包发给 ISP 的网络,剩下的事就不是路由器管的了。

以太网帧
目的地:XX:XX:XX:XX:XX:XX
源地址:88:25:93:79:E0:C8
    IP 数据报
    目的地:115.239.211.112
    源地址:61.52.247.112
        TCP 报文
        目的地端口:80
        源地址端口:2001
            HTTP 报文
            GET / HTTP/1.1
            Host: www.baidu.com

以太网帧的 MAC 地址,源地址已经变成路由器的了,而不是内网主机的。这个替换源地址和源端口过程称为网络地址转换(NAT)

由于内网主机不止一台,路由器需要把这些转换信息以表形式记下:

WAN 端 LAN 端
61.52.247.112:2001 192.168.1.2:3345
…… ……

当百度的响应通过别的路由转回来,路由器需要反过来处理:去掉数据链路层,查 NAT 表把 IP 和端口转为对应的内网主机。

NAT 穿越

P2P 软件电驴。P2P 就是 Peer to Peer,网络中的机器是对等的。

所有使用电驴的机器不仅仅是一个发起请求下载数据的客户端,同时也是一个能够接受请求,向外发送数据的服务器。这样一样,当下载大文件时,就可以 从很多安装了电驴的机器上分块下载,而不仅仅从一个服务器上下载,速度快了很多。

一般情况下,局域网内某台主机试图做服务器时,其他电驴根本连不上它,因为局域网主机的 IP 是路由器分配的,是个内网地址,外网主机根本不知道。

这时候,主机可以主动要求路由器建立一个 NAT 映射192.168.1.2:4096 <-> 61.52.247.112:3001,路由器把该映射保存到 NAT 表中,内网主机就 可以对外通告自己是电驴服务器,谁要连接的话就连61.52.247.112:3001,这样外网连接的时候,路由器必须把请求转到该映射主机。

这些都可以通过路由器来设置。

Search

    Table of Contents