平时冲浪的网络是咋样的?
1. 设备连接wifi
2. 设备发送请求
3. 服务器响应
哈哈 就是这么简单,我好像说了个废话。那我们从网络角度来看这个是咋搞的。
1. 手机连接wifi 路由器接收到手机发送的DHCP数据包,然后路由器给手机就分配一个内网ip
2. 手机发送网络数据包经过路由器转发至公网
3. 请求经过下一跳,下一跳... 跳至 服务器前面的网络设备,再转发至服务器
4. 服务器响应 又经过下一跳,下一跳 又跳回我们自己的路由器
5. 路由器再次转发至 手机
下面的咱来看看比较详细的图
下面我们来抓包来详细分析分析这个过程
我们的设备连接wifi是怎么获取ip的呢?
手机连接wifi,就会自动获取ip,这个可以通过点击wifi设置 可以看到 IP设置(默认DHCP),DHCP是一个自动帮助设备获取ip(还有网关和dns信息)的技术,一般我们的路由器就是一个DHCP服务器。
设备通过发送广播,hey DHCP你在哪里?我想要一个ip还有DNS信息,我们的路由器接收到这个广播之后
通过抓包如下所示(这个是我笔记本电脑连接wifi时发送的广播 然后路由器向我回复了数据)可以看到我们最开始的地址是0.0.0.0 然后通过255.255.255.255 发送广播
可以看到这个是DHCP请求的报文(由于这个wifi我已经连接过 所以他会带上我的之前的ip 192.168.1.102缓存) 还带上了我笔记本的mac地址
这个时候我们来看路由器给我们回的报文,可以看到路由器把我们想要的信息基本都给到我们了。
到此我们的ip就能拿到了。
拿到ip 我们一般怎么会咋样呢?怎么测试网络通不通呢?一般通过ping一下 尝试一下。
ping 命令全链路是什么样的呢?
比如我们本机是 192.168.1.102 需要ping 192.168.1.104
当我们发送ping命令时 是需要获取对应ip的mac地址,ping是ICMP协议 是一个网络层的协议 网络层的下一层协议是链路层,链路层的封包是需要对方的mac地址的,没有mac地址是不能发送数据包的。发送命令时会去查看自己的mac地址缓存表 arp -a(下图),如果没有找到,会尝试通过ARP协议广播 发现是否有人回应 设置的mac地址,最后实在没有,就查找路由表中最长的匹配项,如果没找到 就通过路由表当中的默认路由将数据包转发出去?怎么验证是否是这个逻辑呢?叮咚嘿嘿抓包,通过抓包来验证一下
这个时候我们把 192.168.1.104 arp表删除。
咋回事 奥 原来没有权限。管理员运行一下cmd ,可以看到 192.168.1.104 已被删除
开始ping 并且 抓包
分析
可以看到 我们的 arp已经有104的mac地址了 可以在截图中看到 路由器一直在问 192.168.1.104 你在哪里? 然后192.168.1.104 说 我在这 我的地址是 d8-ce-3a-fa-c3-3a,并且通过下面的ICMP 可 以看到没有经过网络路由器。所以这并不能证明他经过路由表啊 怎么验证呢?所以我们可以搞一个不存在的地址试试 192.168.1.8
本机ip(广播): 我尼玛 谁是192.168.1.104?狗日的赶紧告诉我 我是 192.168.1.102
1 second later
…
192.168.1.104:I’m here, 我mac地址是这个d8-ce-3a-fa-c3-3a 记住了没有
本机:ok 我记住了 保存到我的小本本了(arp表)
本机:终于可以发送数据包,zing…
192.168.1.104: 我回你一个包 嘿嘿嘿。。。
本机:我又发一个 嘿嘿 好玩
。。。。
。。。。
ping 一个不存在的ip 192.168.1.8
可以看到我本机通过ARP问了一下 谁是 192.168.1.8 告诉 我(192.168.1.102)一下,发现没人回复,所以拿不到mac地址 直接说丢包了。所以 同网段的是不会经过路由表的 而是直接通过arp,如果没人回复就直接丢包了.
本机ip(广播): 我尼玛 谁是192.168.1.8?狗日的赶紧告诉我 我是 192.168.1.102
two hour later
…
本机:卧槽 没人吗,算了 访问不了 肯定100%不可达了
ping一个不同网段(192.168.2.8)的试试 看是否会经过路由表
卧槽 可以看到他的目标ip是 192.168.2.8 但是 目标mac地址 是下一跳地址也就是 路由器的mac地址 所以此时肯定经过了路由表的默认路由,拿到的是路由表默认路由网段的mac地址。
结论
- 相同网段是不经过路由器的,而是通过arp获取对应ip的mac地址来发送网络层,链路层数据包
- 详细流程如下
不同网络的数据请求分析
不同网络的拓扑图如下
ping 命令全链路是什么样的呢?
由于没有合适的目标公网ip 所以这里就以百度搜索引擎的公网ip地址(157.148.69.74)为例
不同网络需要arp吗?
可以看到我们的arp并没有 这个157.148.69.74 记录,并且下一跳的mac地址是网关的mac地址,那是否说明 arp就是个局域网协议 用作广播的。那我手动加一条记录是否可以生效?
添加成功后 可以看到我们已经添加成功 但是mac地址 是广播地址 这个时候再试一下ping 看我们的配置是否可以成功,从截图看到 他喵的就是不起作用 说明这个arp仅仅是局域网发现mac地址
路由表是否在不同网络当中是否起了作用?
在网络中,数据包的转发是根据路由表中的最长匹配规则进行的。这意味着,当数据包需要从一个网段转发到另一个网段时,路由器会查找路由表中最长的匹配项,然后沿着该匹配项指定的路径进行转发。
怎么认证这个猜想?
嘿嘿他喵的每次都是走的默认的网关,那我就搞一个刚好最长的匹配项的路由试试 看是否可以起作用?
我们配置 157.148.69.74的 子网掩码 为 255.255.255.255 网关地址 为我 本地ip 192.168.1.105 看这条记录是否起作用 如果起作用那么将访问不通
route -p ADD 157.148.69.74 MASK 255.255.255.255 192.168.1.105 METRIC 1
可以看到我们添加成功了一条记录 但是 这条优先级比默认的优先级要大 ,虽然比他大 但是网络号是最长匹配的。
果然可以看到神奇的事情发生了,访问不通了。那么我们的记录生效了。
路由表起到了关键作用 我们需要获取 157.148.69.74的网络号 需要 & 子网掩码 发现 157.148.69.74 与上 255.255.255.255 之后= 157.148.69.74 走的是上图当中最长匹配的第4条路由。
可以通过 tracert(linux 是 traceroute) 看到每一个下一跳的ip 可以看到并没有经过 网关 192.168.1.1 ,而且可以抓包看到 这个目标mac地址是一个广播的mac地址 ???** 为啥呢?是我配置的arp生效了 起作用了吗**
我把arp修改之后再试试 可以看到真的是arp 表当中的mac地址?
为什么配置了一条在链路上的路由规则后 我们的arp中的记录起作用了?路由表的在链路上到底是啥意思?
在链路上的路由可以通过2层链路直接访问。不需要类似路由器一样进行拆包(拆第三层包) 看目标地址是否是自己。在链路上表示直连, 可以直接通讯,不需要路由,那他怎么封包呢?因为需要mac地址 所以就拿arp表中的我们配置的数据了
结论
结论
每一种通讯都有一张表来记录信息,总共有 arp表 ,路由表,mac表,nat表
arp表(面向局域网的通讯)
通过arp协议广播的方式获得arp信息,记录局域网内的mac地址与ip的映射
路由表 (不同网络(但不一定限定死 局域网也可以通过最长匹配来匹配路由))
不同网络时,通过ip &子网掩码 来得到网络号,并通过最长匹配规则来匹配路由,得到最终的输出接口和下一跳的地址,他是决定下一跳的关键组成部分
mac表 (二层网络数据交换时需要用到)
mac表通常在家用路由器(包含了交换机的功能),或者专业交换机当中。
通过二层数据包的目标mac地址 将数据转发送至指定端口,例如ff:f5:f4:f3:f1:f8:f9 ,将发送至端口1,如果发现mac表中没有记录,那么将通过局域网广播的方式,将数据包转发。
mac地址 | 端口/串口 | 所属vlan |
---|---|---|
ff:f5:f4:f3:f1:f8:f9 | GEN/0/2 | vlan1 |
ff:f6:f4:f3:f1:f8:f9 | GEN/0/1 | vlan2 |
NAT表
nat是为了解决内网与外网通讯的问题而存在的,例如在普通家庭网络当中,只有一个公网ip,而不是每一个设备有一个公网ip,他们都是内网ip 例如192.168.1.2 等,当从192.168.1.2:9999端口发送数据包至其他公网ip时,如果没有这个NAT 对应公网数据包返回的时候是 路由器不知道这个数据包要给到哪台机器。数据包转到路由器时,是需要利用路由器的公网ip加端口与 内网ip+端口做一一对应建立关系,才能达到双向通讯,准确发送数据的目的。
公网ip+端口 | 内网ip+端口 |
---|---|
113.116.216.123:4545 | 192.168.1.2:9999 |
113.116.216.123:4546 | 192.168.1.3:9999 |
好的文章:
7层协议
20张图深度详解MAC地址表、ARP表、路由表
37张图详解MAC地址、以太网、二层转发、VLAN
21张图详解交换机MAC地址表的五大要素:MAC地址、VLAN、出接口等