计算机网络杂谈
两台电脑,它们如何才能访问到对方?一个数据包在网络中是怎样转发的?
先来看一张图:

注:
1.图右边访问的虽然是服务器,但其实可以把它换成任何拥有公网IP的个人电脑。
2.图中的交换机可以省略,现在很多电脑都是直连路由器,原因是路由器集成了交换机的功能。
上图是一个常规的网络架构图,当我们要访问一个网站或者一台其他人的电脑时,网络包从我们的电脑出发,经过交换机到达路由器,然后路由器会把数据发送给我们的网络运营商,例如网通,电信。再后面数据就进入了互联网,经过各个路由器的转发以后到达了目的地,此时往往会经过目标服务器设置的防火墙,过滤掉一些存在潜在危险数据包,最后到达要访问的服务器。
整个过程中,数据包从起点到终点是通过IP进行转发到达,但在中间的每个节点之间是通过MAC地址进行转发。
因此很自然的,我们需要一种根据IP查找下一个发送目标的MAC地址的方法,这就是ARP协议,它是专门负责IP跟MAC地址转换的,如下表:
ARP协议:
IP地址 | MAC地址 | 其他信息 |
---|---|---|
10.10.0.1 | 00-60-97-A5-43-3C | ... |
192.168.0.1 | 00-00-C0-16-AE-FD | ... |
这张表会保存在我们的电脑中,这里如果我们要访问IP地址10.10.0.1,那么我们的电脑就会把数据发送给00-60-97-A5-43-3C机器。但如果在表中找不到要发送IP对应的MAC地址,那么就会进行一次广播,询问目标IP对应的MAC地址。
此外在交换机中也会维护一张MAC表,它在转发数据包的时候会按照这张表从对应的端口把数据发出去(表中的数据可以手动设置,另外交换机也会根据来往的包进行自学习),如下表:
MAC地址 | 端口 | 控制信息 |
---|---|---|
00-60-97-A5-43-3C | 2 | ... |
00-00-C0-16-AE-FD | 7 | ... |
00-02-B3-1C-9C-F9 | 8 | ... |
当交换机收到数据包是要发送给00-00-C0-16-AE-FD地址时,它会直接把数据从端口7发出。
交换机跟路由器的区别:
交换机:工作在数据链路层,使用MAC地址进行转发。
路由器:工作在IP层,针对网络包中的IP地址进行转发。
路由器中也会维护一张根据IP进行转发的路由表:
目标地址 | 子网掩码 | 网关 | 接口 | 跃点数 |
---|---|---|---|---|
10.10.1.0 | 255.255.255.0 | ---- | e2 | 1 |
10.10.1.101 | 255.255.255.255 | ---- | e2 | 1 |
192.168.1.0 | 255.255.255.0 | ---- | e3 | 1 |
192.168.1.10 | 255.255.255.255 | ---- | e3 | 1 |
0.0.0.0 | 0.0.0.0 | 192.0.2.1 | e1 | 1 |
从上表可以看出路由表中交换机中的MAC地址表差别很大。
公网IP:其他计算机可以直接访问。
私有IP:在同一个子网里的计算机可以互相访问,但外界无法访问。
一般来说,除了服务器,个人电脑使用的IP都是都是私有IP,外网是访问不到的,私有IP范围如下:
A类地址范围:10.0.0.0 - 10.255.255.255
B类地址范围:172.16.0.0 - 172.31.255.555
C类地址范围:192.168.0.0 - 192.168.255.255
可以查看下自己电脑的IP,看看是不是确实在这个范围内。
私有IP公有IP转换逻辑:
当数据包进入互联网之前,入口的路由器会把私有IP转换成公有IP后再进行转发,这是通过在路由器内部维护一张表,记录端口与私有IP的映射关系来实现的。如下表:
公有地址 | 端口 | 私有地址 | 端口号 |
---|---|---|---|
198.18.8.31 | 5436 | 10.10.1.1 | 1025 |
198.18.8.31 | 5437 | 10.10.1.2 | 1025 |
198.18.8.31 | 5438 | 10.10.1.3 | 2538 |
如上表,当收到响应数据时,如果是由端口5436接收的,那么就把数据转发给10.10.1.1主机。
这样带来的问题就是必须要先有数据出去,才能有数据进来,因为只有出去的时候才会在这张表里保存映射关系。同时这也说明了一个问题,如果人工在该表中进行配置,那么有机会实现直接让数据进来(之所以说有机会是因为还有防火墙的作用),也就是说访问你的私有IP。
公有IP私有IP的转换逻辑有效的解决的IP不够用的问题。
子网跟子网掩码:
IP是由网络号跟主机号组成的。
IP本身分为A,B,C,D,E五类地址,如下图:

其中D类地址和E类地址这两类地址用途比较特殊,D类地址称为广播地址,供特殊协议向选定的节点发送信息时用,E类地址保留给将来使用。这里不做详细讨论。
由上图可以看出,我们常用的IP中,主机ID的范围是由A,B,C三种类型规定死的,这其实在实际使用过程中会很不方便,不能灵活的设置网络ID与主机ID各自分配的位数,因此为解决自由分配主机数量的问题引入了子网掩码。子网掩码是由高位N个1跟低位M个0组成的32位数。计算时只需要把IP地址跟子网掩码取与运算,得出的值就是网络ID,剩下的就是主机ID,这里的M和N是可以按需求自由设置的。
最后再来说说浏览器访问网站时的DNS解析过程,如下图:

注:
1.上图是在没有缓存的情况下,不然就直接返回了。
2.DNS使用UDP协议。
上图中我们访问 www . b . a . com 网址是从左到右写的,但域名的解析过程却是从右到左,而且当我们请求域名服务器的时候,如果找不到,它会返回一个新的域名服务,然后我们再去请求新的域名服务器进行域名解析,以此类推(注意这里是我们再重新去请求,而不是正在访问的域名服务器帮我们去请求)。
鉴于解析过程比较复杂,因此一般来说域名服务器都会有缓存,优先使用缓存中的数据,它会维护一张域名查询表,如下图:
域名 | Class | 记录类型 | 响应数据 |
---|---|---|---|
www . lab . glasscom . com | IN | A | 192.0.2.226 |
glasscom.com | IN | MX | 10 mail.glasscom.com |
mail.glasscom.com | IN | A | 192.0.2.227 |
其中CLASS列中IN表示互联网类型,记录类型中A表示IP地址,MX表示邮件服务器。