输入网址到显示网页的过程

1.HTTP

输入一个网址,网址首先会被浏览器解析,得到该网址的网络协议(如http、https)、域名(www.baidu,com)、请求路径(../dir/index.html)

对网址解析后,就会生成对应的请求报文

  • 请求行:包括resful方法(Get,Post、Put等)、请求路径URL,协议的版本号
  • 请求头:一些请求方的附加信息,由“键/值”对组成,每行一对,名和值之间使用冒号分隔
  • 请求体:需要服务器接收的请求数据,Get方法就没有请求体内容,Post方法的请求体如json形式的表单键值对

服务端处理请求后会返回一个响应报文:

  • 响应行:包括传输协议的版本、响应状态码、响应状态码对应的短语
  • 响应头:包括描述服务器的基本信息,返回数据的信息
  • 响应体:可以是服务端返回的处理数据,也可以是页面代码

2.DNS

生产了请求报文后,需要知道报文发往的目的地(IP地址),这时就需要根据域名解析出对应的IP地址了。

例如查询www.server.com这个域名:

  1. 客户端先向本地DNS服务器发送一个查询请求,如果本地存在域名和IP的对应缓存,则直接返回;否则本地DNS服务器询问根域名服务器,根域名服务器是最高层次的,它不直接用于域名解析,但能指明一条道路。
  2. 根域名解析器发现后置是.com,告知本地DNS服务器去询问相应的顶级域名服务器。顶级域名服务器告知该域名的权威DNS服务器的地址,本地DNS服务器询问权威服务器,它是域名解析结果的原出处。
  3. 权威DNS服务器查询后将对应的IP告知本地DNS服务器,本地服务器将此次查询到的对应数据缓存起来,以便下次直接在本地查询。

3.协议栈

请求报文的生成和报文的传输目的地确认后,就需要与接收方建立网络连接来发送数据包(Http报文)了。

在建立连接之后,数据包发送之前,需要有多个协议的帮助来将数据包变成一个合格的网络包。、

应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。

网络包结构如下:

  • HTTP报文:存放着传输需要的数据、传输协议、URL、协议版本等
  • TCP头部:在建立了TCP连接后,就会在HTTP报文的基础上加上TCP头部。包括发送方和接收方的端口号、包的序号、状态位等
  • IP头部:包括接收双方的IP地址等。TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。
  • MAC头部:MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。

发送方的MAC地址很容易获得,毕竟是在使用的网卡生产时就写入的。但发送方要怎么知道接收方的MAC地址呢?

答案就是ARP协议,ARP协议使得发送方的主机 会在局域网中通过广播对其中的所有设备询问这个IP是谁的。IP所属者收到询问后进行回答返回自己的MAC地址。后续接收到的MAC地址会被存入主机的一片叫做APR缓存的内存空间中。

以上是对于同一局域网下的操作。如果目的主机不是本地局域网,接收方的MAC地址填的就是路由器的MAC地址,毕竟需要路由器转发去公网中寻找目的地

MAC 层报文

4.网卡

网络包在内存中是一串二进制数据,并不能就这样直接发送给对方。需要网卡将这数字信号转化为电信号,网络包才能在网线上传输。所以说,互联网上的数据传输本质上是电信号的传输。

负责执行这一操作的是网卡,要控制网卡还需要靠网卡驱动程序

网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列(FCS)。

  • 起始帧分界符:标志一个网络包的起始位置
  • 帧校验序列:检查网络包在传输过程中是否有损坏

image-20230322220421728

至此,一个网络包就离开了主机,踏上网络探索之路了。

5.交换机

在讲网络包是如何通过交换机之前,需要先解释一下什么是交换机,什么是路由器。

  • 交换机:主要工作在数据链路层,基于以太网设计的,俗称二层网络设备。交换机的端口不具有 MAC 地址。能够将一个区域的主机连接成一个局域网,使得一个局域网下的主机能够互相通信,但无法访问外部的互联网。
  • 路由器:主要工作在网络层,基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;。能够将多个交换机组成的多个局域网连接起来。也就是说,局域网需要路由器才能访问外网。

一般的家用路由器是集成了交换机的。

首先,电信号到达网线接口,交换机进行接收,将电信号转为原本的数字信号,然后通过网络包末尾的FCS检验传输是否有错,如果没问题就放入缓存中。

将包存入缓冲区后,接下来需要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。

交换机的 MAC 地址表主要包含两个信息:

  • 一个是设备的 MAC 地址,
  • 另一个是该设备连接在交换机的哪个端口上。

image-20230322232200726

如果MAC地址表存在记录,交换机就会把网络包从对应的端口发出去

如果地址表中不存在对应记录,说明该目的MAC地址的设备没有通过交换机发过数据

交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。

6.路由器

路由器的端口具有 MAC 地址,因此它就能够成为以太网的发送方和接收方

两个地区的主机通讯时,以太网包是怎么找到对方的MAC地址的?

按我的个人理解,局域网内的主机通讯的话通过交换机就可以了。但如果是两个不同公网ip下的主机通讯的话,肯定是需要路由器的。交换机内部在查MAC地址表的时候,以太网包的MAC头部的接收者地址应该是被设置为路由器的MAC地址,所以查到后以太网包才会被发往连接路由器的交换机端口

路由器将接收到的电信号转化为数字信号后(只要数据需要在网线上传输,物理设备就肯定有这一数电转化过程),查看以太网包中的MAC头部的接收方MAC地址,检查这个地址是否是自己的,如果不是则丢弃这个包。

如果是,完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

MAC 头部的作用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。因此,当包到达路由器之后,MAC 头部的任务就完成了,于是 MAC 头部就会被丢弃

接下来根据IP头的内容查询路由表,知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。

网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。

发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

不知你发现了没有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

image-20230322220126360

总结:

  1. 如果目的ip是在同一个局域网内,查询MAC头部的接收者MAC如下:主机先通过目的ip查询rap缓存,如果缓存命中则返回目的MAC地址;如果没有命中,则通过RAP协议广播询问同一局域网下的所有主机,得到答应后将结果写入rap缓存。

  2. 如果目的ip不在同一局域网内,MAC头部填入的是路由器的MAC地址,通过然后网络包发送到交换机,交换机解析出包中的接收方MAC地址。根据这个地址查询内部的MAC表(对应形式为:mac和端口,如果表中没有的话会发到除了源端口之外的所有端口上),然后将包发往对应端口(发往路由器)。

​ 路由器发送arp请求查到目的主机的MAC地址


 上一篇
HTTPS之加密 HTTPS之加密
HTTP 与 HTTPSHTTP 与 HTTPS 有哪些区别? HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS
2023-03-24
下一篇 
Mysql-日志篇 Mysql-日志篇
一.日志篇该篇所提到的日志用途实际上用于数据更新方面(insert、update、delete) undo log(回滚日志):Innodb存储引擎生成的日志,用于事务回滚 redo log(重做日志):Inoodb存储引擎生成的日志,用
2023-03-08
  目录