一个路由器最少有两张网卡,一张网卡对外即公网网卡,是运营商在出厂的时候赋予的.
另一张网卡对内, 即内网网卡
路由器的路由表中最少也有两条规则
1>第一条规则匹配的 是 默认网关 (后面会有解释) —公网网卡
2>第二条规则匹配的 是 局域网 —内网网卡
路由器是怎样分配IP地址呢?
每当我们的pc连接wifi的时候,路由器就会给这台pc一个IP地址. 因为路由器上面跑这一个服务, DHCP server 程序. 对应的是,pc上肯定也会跑着 DHCP client .
如图:查看DHCP client
当我们的DHCP client拿到 ip 地址之后就会把它设置在对应的网卡上面.
为什么连上wifi就能上网 ?
思考这样一个问题, 我们的pc没有公网的ip, 但是为什么连接上 wifi 就能和公网互通了呢? 立马想出的答案肯定是路由器搞的鬼
但是里面的具体操作是什么呢 ?
首先,我们先看数据包是怎样出去的
假设我们要访问百度 – 14.215.177.38 (只是其中一个服务器)
发包
我们首先查看pc路由表. 如图
简要说明一下:
Destination: 目的地址
Gateway: 网关
Genmask: 掩码
Flags: 标志位, 其中 G 代表网关 -即 Gateway 不为空
Iface: 网卡
其中 Iface 这个网卡和 Gateway 这个是直连的,属于同一个LAN
一个数据包发送的时候,会查看路由表
首先 目的地址 和 Genmask 进行 与 操作,然后和Destination 进行匹配.
14.215.177.38 与 0.0.0.0 = 0.0.0.0
匹配第一条
然后需要知道目标地址(路由器)的MAC地址.
此时通过ARP 协议得到路由器的MAC地址. 就可以发送数据包了
数据包 (mac 地址就不详细写了)
src ip | 192.168.30.214 |
---|---|
dst ip | 14.215.177.38 |
src mac | pc mac |
dst mac | 路由器 mac |
路由器的角度:
我(路由器)收到了一个数据包, 首先查看MAC地址和我的MAC地址是否一致, 不一致则丢弃 .
发现一致后,开始解包. 发现 ip 地址不是我的ip地址. 我就把数据包发给默认的网关.
默认网关: 公网的IP地址,这个地址是运营商给的.
路由器在把数据包发送到公网前会进行源地址改写 即 SNAT 源地址映射
同时 dst mac地址会变成 运营商的网络节点的MAC地址
此时的数据包
src ip | 路由器 ip |
---|---|
dst ip | 14.215.177.38 |
src mac | pc mac |
dst mac | 运营商的网络节点 mac |
好了,此时的包就可以顺利的发给百度了.
回包
百度收到数据包后会做对应的回应. 回应包的 四元组如下
src ip | 14.215.177.38 |
---|---|
dst ip | 路由器IP |
src mac | pc mac |
dst mac | 路由器 mac |
路由器接收到数据包后,它会还原目标地址 .因为在第一次改写的时候会有做一个记录, 当返回的包到来是会在返回为源目标只
src ip | 14.215.177.38 |
---|---|
dst ip | 路由器IP |
src mac | pc mac |
dst mac | 192.168.30.214 |
还原后发现这个数据包不是给它的, 它在此找到路由表 匹配到了 对内网卡的这条规则 - - 局域网
然后它会发给局域网中的pc. 此时回包也搞通了.
以上就说明了一个数据包从pc发往公网并且公网返回一个数据包到pc 的过程.