浏览器上访问得到百度网页的过程是如何实现的?

本贴最后更新于 1120 天前,其中的信息可能已经水流花落

如果你在浏览器上访问“https://baidu.com”的到百度网页,这个过程是怎么实现?你知道么?

为了弄清楚这个过程,我们需要先了解数据包是如何在网络中传输的,了解网络背后的秘密。

我们先来了解一下Internet(网络)的基本发展史:

  1. 1968年由美国ARPA机构提出“资源共享计算机网络”,让ARPA的计算机互联起来, 叫做阿帕网;
  2. 1974年,第一个TCP协议详细说明发布了。
  3. TCP协议分成了 TCP/IP 两个协议。
  4. TCP / IP 网络分层
    从上面的互联网发展可以发展,随着我们网络上的功能越来越复杂,人们就开始对网络进行分层,让每层分别负责自己的单独的工作,各司其职。然后就出现了我们现在非常重要的OSI七层网络模型,即开放式系统互联,其目的统一网络规范,来实现互联,也就是我们现在说的互联网。

OSI七层模型的七层分别是物理层--数据链路层--网络层---传输层---表示层--会话层---应用层,我们所有的网络活动都是通过这七层来实现的。

图片.png

我们刚刚讲过OSI模型最初就是想实现两台机器之间的互联。机器和机器之间怎么通信?这里就要用到我们的物理层了。

物理层:物理链路,使我们肉眼可见的有光纤、双绞线,以及无线电波。它的主要作用是传输比特流,就是从1/0转化为电流强弱来进行传输,到达目的之后再转化为1/0,也就是我们常说的数模转换。

数据链路层:现在通过物理介质我可以发送比特流了,但是纯比特流(01信号)有什么意义么?没有,所以我们要发送有意义的数据,就需要对这些比特流进行处理以帧为单位对 0 和 1 进行分组,然后按照分组的顺序依次发送。那对方是怎么接受的呢?怎么知道是发给我的呢?这就还需要我们知道一个概念:网卡。每台电脑上不是都有网卡么? 都会有一个物理地址,也就是我们说的MAC地址,数据包会带上目的MAC地址和源MAC地址,就知道是给谁的以及回复要给谁了。

网络层:现在能够在两台计算机之间传输数据包了,但是如果我有多台计算机,怎么发?怎么选最佳路径?还有不知道对方的AMC地址该怎么办呢?网路层就帮助解决了这些问题:

  1. 发送者如何知道接收者的MAC地址?在网络层定义了一个协议叫做ARP协议,全称是Address Resolution Protocol。它的工作原理和过程如下:
    1)主机A首先查看自己的ARP表,如果找到了的主机B的MAXAC地址,则直接对IP数据包进行帧封装,发送给主机B;
    2)如果主机A在ARP表中找不到主机B的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中带上源IP地址和源MAC地址(主机A),目标IP地址和目标MAC地址为主机B的IP地址和全0的MAC地址。广播,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
    3)主机B比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
    4)主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。

图片.png

那么发送者如何知道接收者和自己同属一个子网?如果接收者和自己不在同一个子网,数据包如何发给对方?解决这个问题网络层定了IP协议和路由协议。

传输层:现在我在网络里正确的发送数据包了,但是当我发大量数据的时候,可能需要很长时间,例如:一个视频格式的,网络会中断好多次,怎么保证中断后能重传?我还需要保证文件时的准确性。这就需要传输层对发出去的数据进行封装,就像发快递一样,一个个发送。

这一层定义了两个非常重要的协议就是TCP协议和UDP协议;并且定义了端口,确认主机上应用程序的身份,并将数据包交给对应的应用程序。比如数据包是从一个主机的某个应用程序发出,然后由对方主机的应用程序接收;而每台电脑都同时运行着很多个应用程序,所以当数据包被发送到主机上以后,怎么决定哪个应用程序要接收这个包。不通过的应用协议使用不同的端口,端口就可以明确应用程序的身份。

会话层:的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文库极为重要。所以我们要建立一个自动收发包,自动寻址的功能,比如可以实现断点续传;

表示层:我要用Linux给window发包,两个系统语法不一致,为异种机通信提供一种公共语言,以便能进行互操作。所以表示层起到一个翻译的作用。

应用层:理论上讲,有了以上层级协议的支持,数据已经可以从一个主机上的应用程序传输到另一台主机的应用程序了,但此时传过来的数据是字节流,不能很好的被程序识别,操作性差。因此,应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等。

现在大家对每一层的工作都有了一个很细致的了解,我们现在回到刚刚最开始的那个问题:在浏览器其里访问一个“https://baidu.con”网址,返回一个页面,过程是怎么实现的?

当你输入一个网址并按下回车键的时候:

  1. 首先,应用层协议对该请求包做了格式定义;
  2. 紧接着传输层协议加上了双方的端口号,确认了双方通信的应用程序;
  3. 然后网络协议加上了双方的IP地址,确认了双方的网络位置;
  4. 最后链路层协议加上了双方的MAC地址,确认了双方的物理位置,同时将数据进行分组,形成数据帧,采用广播方式,通过传输介质发送给对方主机。而对于不同网段,该数据包首先会转发给网关路由器,经过多次转发后,最终被发送到目标主机。

目标机接收到数据包后,采用对应的协议,对帧数据进行组装,然后再通过一层一层的协议进行解析,最终被应用层的协议解析并交给服务器处理。整个过程如下图所示:

图片.png

回帖
请输入回帖内容 ...