两台电脑, 它们如何才能访问到对方? 一个数据包在网络中是怎样转发的?
先来看一张图:
网络流转图
注:
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 五类地址, 如下图:
IP 地址类型
其中 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 表示邮件服务器
来源: http://www.jianshu.com/p/5e68af10396b