整理自:网卡与路由器
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 请求,轻松把百度的主页获取到本机,浏览器对主页内容进行解析显示。
网关路由器
网关,访问广域网必经的一关,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
,这样外网连接的时候,路由器必须把请求转到该映射主机。
这些都可以通过路由器来设置。