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

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

一、Hi All#


这一次,我在IDC机房告诉你,当你请求www.baidu.com时都发生了什么?以及数据包经历了怎样的过程才被转发到百度的IDC机房的、以及你的电脑又是如何接收到百度的返回的数据包的!


这篇文章会串讲:IPv4、MAC、DNS、交换机、ARP、路由器、路由表、NAT、NAPT、私网、公网、OSI7层网络模型、以及不同机器互联互通原理等计算机网络知识点。

好,我们开始吧!


二、同一个局域网中不同主机的互联#


先看个简单的,同一个局域网中的不同主机A、B之间是如何互联交换数据的。如下图:



那,既然是同一个局域网中,说明A、B的ip地址在同一个网段,如上图就假设它们都在192.168.1.0网段。

还得再看下面这张OSI 7层网络模型图。


主机A向主机B发送数据,对主机A来说数据会从最上层的应用层一路往下层传递。比如应用层使用的http协议、传输层使用的TCP协议,那数据在往下层传递的过程中,会根据该层的协议添加上不同的协议头等信息。



根据OSI7层网络模型的设定,对于接受数据的主机B来说,它会接收到很多数据包!这些数据包会从最下层的物理层依次往上层传递,依次根据每一层的网络协议进行拆包。一直到应用层取出主机A发送给他的数据。


那么问题来了,主机B怎么判断它收到的数据包是否是发送给自己的呢?万一有人发错了呢?


答案是:根据MAC地址,逻辑如下。


if 收到的数据包.MAC地址 == 自己的MAC地址{
  // 接收数据
  // 处理数据包
}else{
  // 丢弃
}


那对于主机A来说,它想发送给主机B数据包,还不能让主机B把这个数据包扔掉,它只能中规中矩的按以太网网络协议要求封装将要发送出去的数据包,往下传递到数据链路层(这一层传输的数据要求,必须要有目标mac地址,因为他是基于mac地址做数据传输的)。


那数据包中都需要哪些字段呢?如下:


src ip = 192.168.1.2  //源ip地址,交换机
dst ip = 192.168.1.3  //目标ip地址
//本机的mac地址(保证从主机B回来的包正常送达主机A,且主机A能正常处理它)
src mac = 主机A的mac地址
dst mac = 主机B的mac地址//目标mac地址


其中的dst ip好说,我们可以直接固定写,或者通过DNS解析域名得到目标ip。

dst mac怎么获取呢?


这就不得不说ARP协议了! ARP其实是一种地址解析协议,它的作用就是:以目标ip为线索,找到目的ip所在机器的mac地址。也就是帮我们找到dst mac地址!大概的过程如下几个step:



简述这个过程:主机A想给主机B发包,那需要知道主机B的mac地址。

  1. 主机A查询本地的arp 高速缓存中是否已经存在dst ipdst mac地址的映射关系了,如果已存在,那就直接用。
  2. 本地arp高速缓存中不存在dst ipdst mac地址的映射关系的话那就只能广播arp请求包,同一网段的所有机器都能收到arp请求包。
  3. 收到arp请求包的机器会对比arp包中的src ip是否是自己的ip,如果不是则直接丢弃该arp包。如果是的话就将自己的mac地址写到arp响应包中。并且它会把请求包中src ipsrc mac的映射关系存储在自己的本地。


补充:

交换机本身也有学习能力,他会记录mac地址和交换机端口的映射关系。比如:mac=a,端口为1。

那当它接收到数据包,并发现mac=a时,它会直接将数据扔向端口1。


当然,也可以看下维基百科中列举的同局域网中两台computer互联的简单例子:



再看下linux操作系统中的arp命令:


# 发送一个arp广播,如下:
~]# arp -a
gateway (192.168.0.1) at fa:16:3e:66:c8:15 [ether] on eth0
? (192.168.0.254) at fa:fa:fa:fa:fa:01 [ether] on eth0
# 可以看到网关ip地址:192.168.0.1,mac地址是:fa:16:3e:66:c8:15 网卡是eth0
# 广播地址:192.168.0.254,mac地址是:fa:fa:fa:fa:fa:01 网卡是eth0


嗯,在arp协议的帮助下,主机A顺利拿到了主机B的mac地址。于是数据包从网络层流转到数据链路层时已经被封装成了下面的样子:


src ip = 192.168.1.2
src mac = 主机A的mac地址
dst ip = 192.168.1.3
dst mac = 主机B的mac地址


网络层基于ip地址做数据做转发

数据链路基于mac地址做数据转发


根据OIS7层网络模型,我们都知道数据包经过物理层发送到机器B,机器B接收到数据包后,再将数据包向上流转,拆包。流转到主机B的数据链路层。

那主机B是如何判断这个在数据链路层的包是否是发给自己的呢?答案前面说了,根据目的mac地址判断。


// 主机B
if 收到的数据包.MAC地址 == 自己的MAC地址{
  if dst ip == 本机ip{
     // 本地处理数据包
  }else{
     // 查询路由表,根据路由表的规则,将数据包转某个某卡、或者默认网关
  }
}else{
  // 直接丢弃
}


这个例子比较简单,dst ip就是主机B的本机ip 所以它自己会处理这个数据包。

那数据包处理完之后是需要给主机A一个响应包,那问题又来了,响应包该封装成什么样子呢? 对主机B来说响应包也需要src ipsrc macdst ipdst mac


src ip = 192.168.1.3
src mac = 主机B的mac地址
dst ip = 192.168.1.2
src mac = 主机A的mac地址 (之前通过arp记录在自己的arp高速缓存中了,所以,这次直接用)


同样的道理,响应包也会按照如下的逻辑被主机A接受,处理。


// 主机A
if 收到的数据包.MAC地址 == 自己的MAC地址{
  if dst ip == 本机ip{
     // 本地处理数据包
  }else{
     // 查询路由表,根据路由表的规则,将数据包转某个某卡、或者默认网关
  }
}else{
  // 直接丢弃
}


然后再补充一点,我们可以通过下面的命令查看路由转发是否开启:


~]# cat /proc/sys/net/ipv4/ip_forward
1


嗯,同一个局域网中的不同主机的通信方式大概就是这样子。下面我们再来看一下跨网段的不同主机的互联原理。

相关文章
|
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
|
负载均衡 网络架构 容器
这一次!我在百度告诉你,当你请求百度时都发生了什么...(二)
这一次!我在百度告诉你,当你请求百度时都发生了什么...(二)
509 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 源码解析