这一次!我在百度告诉你,当你请求百度时都发生了什么...(二)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 这一次!我在百度告诉你,当你请求百度时都发生了什么...(二)

三、跨网段不同主机的互联#


通过上面的描述,如下这张图描述同一个局域网内的不同主机192.168.1.3192.168.1.2互联的原理大家已经很清楚了。



那不同网段的主机之间是如何互联的呢?

或者说,当你访问:www.baidu.com 时,都发生了什么?你的请求是如何打到百度的服务器机房里面去的?


那,我们先尝试ping一下百度,如下,可以看到百度服务对外暴露的ip地址是220.181.38.148


~ % ping baidu.com
PING baidu.com (220.181.38.148): 56 data bytes
64 bytes from 220.181.38.148: icmp_seq=0 ttl=48 time=38.812 ms
64 bytes from 220.181.38.148: icmp_seq=1 ttl=48 time=38.944 ms
64 bytes from 220.181.38.148: icmp_seq=2 ttl=48 time=23.507 ms
64 bytes from 220.181.38.148: icmp_seq=3 ttl=48 time=33.429 ms
^C
--- baidu.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 23.507/33.673/38.944/6.277 ms


那,再通过ifconfig命令看下我的本机ip地址是192.168.0.64



像这种192.168.xx.xx这种局域网机器的ip通常使用dhcp动态分配

我们也可以设置手动设置静态ip


那,另外我的机器还有运营商分配的公网ip地址:121.36.30.75



有了上面这些信息,于是我们就能画出下面这张图:

然后我们再看一下当我们使用192.168.0.64访问百度时,数据包是如何被一层层转发到百度的IDC机房的,然后我电脑又是如何处理百度的回包的!



对我的机器来说,我想访问百度的服务器,也就是往百度的服务器发数据包的话,那我的电脑得先封装好数据包吧!


那数据包里面起码要包含哪些信息呢?其实在上面的第一节中我们已经说过了,也就是src ipsrc macdst ipdst mac

对于我的电脑来说:


src ip = 192.168.0.64
src mac = fa:16:3e:6b:ab:64 (本机mac地址)
dst ip = 220.181.38.251 (通过DNS服务解析www.baidu.com获取到)
dst mac = ???


dst mac目的mac地址是多少呢?这是个问题!


因为我是192.168.0.X网段,百度的服务器在220.181.38.X网段,我们都不在一个网段中!我的机器没法直接获取到百度对外暴露的网关的mac地址。

那怎么我的机器怎么办呢?


答案是:我的机器会先查看一下自己的路由表,路由表会记录该将这个数据包转发到哪里去。具体可通过route -n命令可以查看到,如下:



具体的做法就是,拿着dst ip 220.181.38.251,分别和路由表中的Genmask做与操作,ip地址 与 子网掩码可以得到该ip地址所在的网段,那得到了dst ip所在的网段之后呢,就拿着这个网段和路由表中的Destination对比,如果相同的话,就将数据包准发给他。


在我们这个例子中,很明显dst ip 220.181.38.251跟后三条路由相与得到的结果和route表期望的Destination都不匹配。


但是dst ip 220.181.38.251跟第一条路由表中的记录想与,得到的结果肯定符合route预期的Destination,毕竟谁与0,结果都是0嘛。(它的Flags为UG,表示它就是网关,也就是网络的出口)


找到了符合预期的路由后,我的机器就会先将数据包发送给网关,对应的网卡就是eth0 ,那这也就意味着我们找到了第一个跳目的ethernet地址。于是数据包被封装成下面这样


src ip = 192.168.0.64
src mac = fa:16:3e:6b:ab:64 (本机mac地址)
dst ip = 220.181.38.251 (通过DNS服务解析www.baidu.com获取到)
dst mac = eth0网卡的mac地址。(ip地址是:192.168.0.1)



同样的道理,当eth0网卡收到这个数据包后,路由器进行如下的判断。


if 数据包.mac == 自己的mac{
  // mac地址相同,说明这是发送给自己的包,所以它不会丢弃。
  if 数据包.ip == 自己的ip{
    // 继续OSI的7上层传递,解包,一直到我们的应用层。  
  }else{
    // 继续查看自己的路由表,找到合适的下一跳地址(扔给网关)。
  }
}else{
  // 直接丢弃
}


经过上面伪代码的判断,eth0知道了这个包虽然是发给它的,但它并不能继续处理这个数据包,他需要将这个数据包准发给下一跳。

对它现在来说:


src ip = 192.168.0.1 (上图LAN口的ip地址)
src mac = eth0的mac地址,
dst ip = 220.181.38.251
dst mac = ???


dst mac地址怎么获取到呢? 其实和上面的流程类似,需要查询路由表。使用src ip和路由表中的子网掩码相与,得到网段后再与Desitantion对比。由于这个路由器上确实没有连接220.180.38.xxx的网段,所以数据包最终依然会被转发到这个路由器的公网网关。


经过这一步,数据包流转到路由器的WAN口,再往下走就流入公网啦!

数据包在公网中各个路由节点之间跳转,最终会流转到百度对外暴露的网关路由器的公网WAN口。


然后数据包会从这个WAN口流入百度内网的IDC机房集群。



你可能会问:那这次请求会打向百度IDC机房中的那台机器呢?

嗯,这就没法再展开了,百度肯定会有他自己的负载均衡机制。我们只需知道这个数据包最终肯定会流转到某一台具体的物理器、或者是某个容器内就好啦!


四、百度的响应包如何再打回到你的机器?#


这就要讲到NAT技术了,看下面的这张图:



数据包传输出去的过程中,虽然dst ip始终都是百度对外暴露公网网关的ip地址,但是src ip却一直不断的被改变。从一开始的192.168.0.64 =>192.168.0.1 => 121.36.30.75


---------------我的机器------------
=> src ip = 192.168.0.64 ....   
---------------我的机器------------
---------------路由器----------------
然后=> src ip = 192.168.0.1 .... (路由器的LAN口)
然后=> src ip = 121.36.30.75 ....(路由器的WAN口)
---------------路由器----------------


在数据包在被发送到公网之前会被路由器做一次SNAT处理,全称是:source network address translator源网络地址转换,它的目的就是将私网ip转换成路由器的公网ip。


当然了,路由器也都会记录下SNAT转换前和转换后的状态。毕竟如果不出意外话,路由器总能接受到百度给他的回包,但他是不能解析处理这个数据包的。(只有请求的发送者192.168.0.64这台机器的应用层才能正确解析出这个响应包)。所以路由器需要根据转发记录将这个包转发给我们起初发送请求的机器(也就是192.168.0.64)。

而路由器将这些记录 记录地址转换表中。


如下:



看上图中绿色的部分,在地址转换表中记录,数据包的原地址从192.168.0.64:1234被转成了121.36.30.75:1234。(这种带端口号的地址转换其实叫NAPT)

那我们继续往下看,假如我们的路由器收到百度的响应包长下面这样:


src ip = 220.181.38.251 (百度公网网关路由器WAN口ip地址)
src mac = 百度公网网关路由器的mac地址
dst ip = 121.36.30.75:1234 (我们家里路由器的WAN口ip地址)
dst mac = 我们家里路由器的mac地址


同样的道理,我们家里路由器会有下面伪代码的判断逻辑。


if 响应包.mac == 自己的mac{
  // 说明这是发给自己包,所以不能丢弃
  if 响应包.ip == 自己的ip{
    // 哎?ip也是自己的ip!
    // 但是它只是一个路由器,只有OSI7层网络模型的前三层
    // 所以路由器并不能真正的处理解析这个数据包,只能根据NAT表继续转发
    if 地址转换表.Contains(响应包.dstIp){
      // 通过查地址转换表发现:
      // dst ip = 121.36.30.75:1234 的流量,需要转给:192.168.0.64:1234
      // 转发...
    }  
  }else{
    // 查自己的route表,找下一跳
  }
}else{
 // 直接丢弃
}


这样的话,我们的发送请求的机器就接收到百度的响应包了,响应数据再一路往OIS7层网络模型的上层传递,最后到应用层根据http协议解析出响应报文,经过浏览器渲染html报文,于是下面的网页就展现在了我们面前!


网络异常,图片无法展示
|

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
7月前
|
搜索推荐 定位技术 UED
网站如何被百度快速收录?除了提交还有哪些方法?
常规更新:定期更新您的网站内容,这可以让搜索引擎更频繁地访问您的网站,从而加快被百度收录的速度。 网站速度:优化您的网站速度,确保它在百度搜索引擎中的加载速度较快,这可以提高您的网站的用户体验和搜索引擎的排名,也有助于快速被百度收录。 总之,如果您想快速被百度收录,您需要遵循最佳实践,包括优化您的内容、外部链接、社交媒体、站长平台、网站地图、常规更新和网站速度。
357 0
|
8月前
|
网络协议 JavaScript 前端开发
百度搜索:蓝易云【WebSocket是什么,怎么用?】
综上所述,WebSocket是一种在Web浏览器和服务器之间实现双向通信的协议,通过创建WebSocket对象、处理WebSocket事件、发送和接收消息以及关闭连接来使用WebSocket。它提供了实时、持久且高效的通信方式,适用于各种实时应用场景。
65 7
|
数据采集 Python
python网络爬虫,爬百度的示例
python网络爬虫,爬百度的示例
175 2
|
Python
正确姿势百度
正确姿势百度
660 0
|
人工智能 网络协议
新必应(New Bing)申请出错终极方案
随着ChatGPT的爆火,微软推出了AI驱动的新必应(New Bing),新必应大大提升了Bing的体验和效率,一时间吸引力众多申请和试用。 然而很多想要加入新必应候补名单时,却总是报出错了,请重试。
4350 1
新必应(New Bing)申请出错终极方案
|
算法 Java PHP
半天不到,实现仿微博URL短地址算法与解析
半天不到,实现仿微博URL短地址算法与解析
|
存储 安全
百度妙传浏览器脚本
百度妙传浏览器脚本
240 0
|
存储 网络协议 Linux
这一次!我在百度告诉你,当你请求百度时都发生了什么...(一)
这一次!我在百度告诉你,当你请求百度时都发生了什么...(一)
217 0
这一次!我在百度告诉你,当你请求百度时都发生了什么...(一)
|
人工智能 文字识别 网络协议
关于我尝试抓包微信失败后想到的新方法居然和奥特曼有关~
关于我尝试抓包微信失败后想到的新方法居然和奥特曼有关~ 以前 微信网页版 还可以登录的时候,我们还可以使用 python 帮助我们实现 自动化操作,调用各种各样的 API ,做做机器人啥的 ,但是现在呢~ 微信网页版 好像不开放了😐 扫码登录都会出现下面的画面 😵 来到之前 很火的 python 库 wxpy, 我看到下面这个场景, 果然也是一片哀嚎 哈哈哈 wireshark 抓包 于是我做了个大胆的决定,尝试用 wireshark 去抓取微信发出的数据包~ (我实在太天真了!🙃) 在电脑上打开微信,参考下面三次握手的图~ 可以看到这里就已经 发出了这么多信息 我晕
328 0
|
存储 缓存 算法
百度 UidGenerator 源码解析
Twitter 实现中使用前 5 位作为数据中心标识,后 5 位作为机器标识,可以部署 1024 (2^10)个节点。意思就是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器)。具体的分区可以根据自己的需要定义。比如拿出 4 位标识业务号,其他 6 位作为机器号。
百度 UidGenerator 源码解析