当我们浏览器访问某个网站时,中间经历了什么,如何到达对方的?

Posted 优质网络系统领域创作者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我们浏览器访问某个网站时,中间经历了什么,如何到达对方的?相关的知识,希望对你有一定的参考价值。

前言

前一篇介绍了OSI参考模型/TCP/IP协议体系每层的作用以及分层的好处,但是对于一个应用数据访问来说,在TCP/IP协议体系中,它不是独立完成的,而是各层之间共同完成,直到从物理层介质变成比特流发送出去,这一篇就以一个平时常用的网站访问来了解下整个的通信过程。(这个过程不严谨,只是让初学者理解起来更加方便,省去了一些细节的过程。)

当我打开浏览器,访问自己博客时,中间经历了什么,它是如何到达对方服务器的呢?

这里只是讲解重点部分,很多协议的细节或者网络环境都进行了简化,这个其实就是后面我们要学的,但是对于初学者来说,先了解一个通信的大致过程,以及数据包在处理过程中,每一层发生了什么事情,这样在后续的学习中就会一个很大的帮助。

(1)打开浏览器,输入www.baidu.com,这个时候应用程序浏览器会查找hosts文件或者DNS缓存,是否有这个域名对应的IP信息,如果没有则会发送给DNS进行请求,转换成对应的IP。(这里假设ccieh3c.com的地址是1.1.1.1,浏览器知道,DNS协议在后续会讲解)得到IP后,浏览器开始打包访问的请求,使用HTTP或者HTTPS,不管使用哪种,里面请求的是www.baidu.com的首页,对应的协议会把这个请求给组织好进行封装,然后通过socket接口交给下一层传输层去完成。

(2)传输层有两种协议,一种TCP(面向连接协议),一种UDP(无连接协议),而HTTP使用的是TCP协议,简单理解面向连接就是TCP能够保证数据能够到达对方,如果对方没收到,就会重新发送,直到对方收到为止。(这里暂时省去了TCP的细节)TCP会产生两个端口号,一个是访问者自己浏览器随机生成的端口号(假设为21345),服务器WEB的端口号为标准端口号(80),这个端口号我们在后续会在提及,传输层封装完毕,会交给下一层网络层。

(3)在TCP/IP中网络层使用的是IP协议,IP协议里面涉及两个重要地址,一个是源IP地址,一个是目的IP地址,源地址表示访问者,目的就是我们要去访问的服务器地址1.1.1.1,大家可能好奇,平时我打开电脑就能上网了呀,并没有去设置过什么IP地址,那是因为在网络里面有另外一个协议帮助电脑自动获取地址,这个协议就是DHCP。

这个时候电脑操作系统知道了服务器的目标IP,就开始根据这个IP找服务器,并且操作系统会做一个判断,这个目标IP地址是不是本地,还是其他的地方的,显然在服务器IP 1.1.1.1与本地电脑IP 192.168.255.2不在一个地方,不在一个地方的话,那怎么去往对方呢?操作系统会进行一个操作,把这个数据丢给默认网关,192.168.255.254,让网关来进行转发。

(4)这个时候是不是就万事大吉了,知道了服务器的IP地址,也知道去往对方交给网关处理就行了,但是要考虑这样一个问题,这个数据是要继续往下面封装的,下一层是数据链路层,在数据链路层里面可能存在着多个设备,那访问者怎么来确定你就是我要找的网关呢?

这个时候就要介绍另外一种地址了,物理地址(MAC地址),当设备出厂的时候,厂家会把这个地址烧录进网卡接口里面,它的作用就是在链路层里面来进行通信,并且这个地址由于出厂就已经固定烧录在网卡里面了,具有唯一性,所以能够来定位确认到某一台设备,明白了这个,访问者只要在链路层里面找这个物理MAC地址,不就能够确认网关是谁了吗?又出现一个新的问题了,访问者他不可能天生就知道网关的MAC地址是多少,那如何得知呢?访问者这个时候会在本地链路里面大吼一声,谁是192.168.255.254啊,告诉我!!网关听到这个后,发现找的是自己,也大吼一声,我就是!这是我的物理MAC地址!,这样访问者就知道了网关的MAC地址了,这个靠大吼一声的协议就是ARP协议,而这种链路层网络叫做以太局域网。(这个也是我们学习的重点)链路层封装完毕后,最终交给物理层(网卡)变成比特流1010101010,通过物理介质网线发送出去。

到这里,访问者电脑总算是完成了整个的数据封装流程,把这个浏览器的请求发送出去,交给网关了。

(5)网关收到以后,需要考虑一个问题,这个数据是给自己的呢?还是交给其他地方的?这个时候网关就需要做一个操作,就是把数据给解封装,因为网关只有看到了对应的信息,它才能够判断这个包到底是给自己的还是交给其他。

接下来的流程就不提物理层了,只要是正常规范的网卡跟线路它都能够去处理这些比特流的内容,后续重点放在二层、三层上面(这个也是路由交换的重点。)网关通过解封装后,得到以太网头部,发现目标MAC是自己,继续解封装,得到IP头部,发现目标IP地址是1.1.1.1,这个地址不是自己,那就是需要交给其他地方的,网关会执行一个操作,查找路由表,选择去往1.1.1.1的最优路径。这里从图上面可以发现去往目的地可以通过B,也可以通过C到达,也非常像我们去往一个地方,比如去北京,都知道做飞机是最快的,但是可能从你源地方那没有机场,你需要做班车或者地铁到最近的机场才行。同样的,网关查路由表发现去往目的IP 1.1.1.1,有B、C两条路径可以发送,它会通过路由算法做出一个计算,选择一条最优的路径抵达到对方,然后发送出去,比如这里从B去往目的地最优,这个条目会体现在路由表里面,网关知道去往1.1.1.1,发送给B,这个时候就有2个疑问了,第一:链路层与网络层的头部已经被解封装去掉了,路由器需要重新封装,第二:封装的内容怎么填写。

从访问者电脑到网关,以太网的头部源MAC地址是电脑的,目的MAC地址是网关的,那么到了网关这里,网关的网卡接口也有自己的MAC地址,B路由器的接口也有自己的MAC地址,这时候网关封装链路层的以太网头部在用之前的信息就不行了,因为它表示的是电脑找网关这段链路中用的,而到了这里则变成了网关去往1.1.1.1,交给B处理,那是不是以太网头部的源MAC变成了网关接口的MAC,而目的MAC变成了B的,这样B在收到这个包以后,它会发现原来是找它的,它也跟网关一样执行一样的解封装,查路由表,在封装,最终到达D。(网关到B,B到D获取的MAC同样通过ARP协议)

在这个结构里面,D的身后就是WEB服务器了,D在收到这个数据以后,也跟之前网关、B的操作一样,解封装链路层,发现目的MAC是找自己,解封网络网络层后 ,发现IP是1.1.1.1,就在自己身后,通过ARP得到服务器的MAC,然后封装好 ,交给服务器。

服务器收到以后,开始如下的解封装。

(6)服务器收到请求后会进行回包,最终跟来的时候一样,通过封装,然后中间经过路由器转发,最终也到达客户端,解封装,最终内容呈现在了浏览器的界面上。(是不是觉得不可思议,平时我们打开浏览器输入一个域名回车,中间竟然发生了这么多的事情。)

从上面例子划出重点

从上面的通信例子,跟我们生活中寄快递是不是有点类似,在某平台购买了一个商品,卖家作为发送方,将商品进行打包,通过快递平台选择一家,让其收件、打印单号(包含收件人信息:地址+姓名+电话),快递小哥会上门收件,回到快递点,快递公司会通过去往相近地区统一装车发往下一个转运中心,可能中间会经过一个或者多个转运中心,期间也可能会经历一次或者多次卸车、装车的过程,以及去往的路径也不一样,可能某一段走的陆运、某一段走的是空运,到达了最近的转运中心,开始卸车,将同一个区域的送往代理点,代理点的送货员将对应快递送到指定的地址(这个地址可能是某公司、某小区、某学校,这是没办法确定具体的收件人),最终会通过电话号码联系到最终的收件人进行收件,这样完成了整个的运输过程, 买家收到以后,就是一个拆件的过程。这里说下,快递的举例是没法全部跟上面的通信过程全部对应上的,只是说很多流程比较相似,便于初学者理解,毕竟用生活的例子代入进来比枯燥的协议流程要容易理解些,通过一个网络通信的流程以及生活的例子,这里列出几个重点信息(也是我们后续要学的内容)

从上面的例子可以看出来,从客户端的应用程序发送数据到服务器,是一层一层的往下封装,最终发送出去,这个过程叫做封装,服务器收到以后,要看到实际的数据,必须一层一层的解封装,看到最终的数据,然后进行回复。

封装的作用是为了把这个数据发送出去,应用层的应用程序负责产生数据,交给下层,这里有一个关键的点记住,应用程序是知道对方服务器的具体地址的,它会告诉下层。比如这里访问的是域名ccieh3c.com,这个ccieh3c.com是用户输入告诉浏览器的,浏览器它必须知道域名对应的IP,所以会通过另外一个应用层协议DNS来获取对应的IP,这个时候浏览器就知道了对应的IP。(DNS协议在后面会介绍到的)

传输层负责建立双方的逻辑通信,并且能够正确表示上层应用,因为在实际中,可能对方服务器运行了WEB、FTP、邮件等应用功能,那客户端在封装的时候要明确标识出来上层的应用是什么,这样对方在读取的时候才知道,哦,原来你是访问我WEB应用,这个能够标识上层应用的功能叫做端口号。从这里也可以发现,地址加端口号能够确定最终去往的目的服务器是哪台以及访问这台服务器的什么应用。

传输层完毕后,会继续封装给网络层,网络层必要知道2个重要功能,(1)通过上层给的地址信息,生成IP头部(IP头里面有两个最重要的信息,源IP,目的IP,源IP表示客户端自己,目的IP表示访问的最终目标)(2)查找目标地址怎么走然后继续封装交给下一层链路层。

链路层目前主流使用的是以太网(局域网),以太网头部有三个重要的信息(1)必须包含源目MAC,否则无法进行封装(2)源目MAC应该怎么填写呢,从上面的流程来看,会发现一个特点,从客户端最终抵达服务器,以太网头部的变化从客户端–网关,网关–B,B–D,D–服务器,每经过一个设备,源目MAC是会变化的,是不是可以理解成以太网的源目MAC只在本地链路内有效。(3)不管是客户端–网关、B–D,它本身是不知道对端的MAC地址的,它依靠一个协议去获取,那就是ARP协议,最终封装完成,交给物理层转换成比特流从网线发送出去到网关。

中间设备收到,比如B、D,它们是会进行解封装的,查看以太网头部,发现MAC是自己,继续解封 装,查看IP头部,发现去往的目的IP不是自己,那就查路由表转发,交给下一个传递设备,然后封装以太网头部的时候,源MAC更新为自己,目的MAC为下一个传递设备,这里的重点是什么呢?(1)能把数据在本地链路内准确的发送给下一个传递设备 (2)下一个传递设备收到以后,通过解封装发现MAC是自己,又解封装,查看IP,发现不是自己,通过路由表查询下一个传递设备,重新封装以太网头部,打上新的MAC,这样在传递过程中就不会出错了,否则客户端–网关,网关–B的时候,以太网头部没有更改MAC地址,它看目的MAC是网关,而不是自己,那说明不是找我的,直接就把这个给丢弃了,不做处理了。

最终服务器收到这个数据,它开始解封装,查看以太网头部,发现目的MAC地址是自己,继续解封装,查看IP头部,发现目的IP还是自己,这个时候服务器可以断定这个数据是给我的了,继续开始解封装,从传输层头部(TCP)中得到上层的端口号,最终通过端口号知道客户端访问什么服务,交给对应的应用程序处理,完成交互。

整个通信过程就是一个不断封装、解封装的过程,不通的终端读取的层次不一样,并且在强调下之前提到过的,应用程序它不关心这个数据最终如何抵达对方的,同样网络层以及数据链路层,它也不关心你上层的应用是网页浏览、QQ、微信、还是游戏,各层负责各自的事情,下层为上层提供对应的服务。

总结

到这里呢,这篇内容就接近尾声了,这里先说下,最开始的案例有部分的流程是不对的,但是对于初学者来说,只能简化按这样的顺序讲解,否则就非常的复杂,不易于理解,后续在随着深入,博主会继续把这个流程在梳理一次,这样印象就更加深刻了,从最开始的举例,到中间的生活中的快递举例,在到后面的重要细节总结,一直在重复的讲解数据在传递过程中发生的事情,因为这个流程很关键,也是我们学习的重点,所以不断的重复加深印象,了解了整个通信过程,好处在于后续学习协议的时候会更加理解,并且排错的时候知道如何下手,因为清楚的知道每一层的作用,大致能够定位卡在哪个地方,比如网络层,目的IP在路由表中不存在,那自然数据就发不出去了,又或者以太网头部封装中,网关设备的MAC获取错误,自然数据会转发给错误的设备,希望大家可以多花时间去理解这个大致通信过程,做到心底有底,剩下的内容就是我们接下来要慢慢去学习的细节部分,完善整个路由交换的知识框架,这样才好进行网络的规划、对接、运用什么技术实现客户的需求等。顺便接下来留几个疑问,这样也是下面要开始涉及的内容了。

什么是IP地址,它的作用是什么呢?

电脑系统是怎么知道要把这个数据交给网关处理呢?以及什么情况下才需要交给网关处理?

DNS是做什么用的?

ARP协议它如何实现的?

服务器在解封装的时候,它是在下一层的时候就知道上一层使用的是什么协议?还是必须解封装后,抵达上一层,才能知道呢?

电脑的IP地址是哪里来的?

在网络传输中,IP与MAC哪个变化,哪个是不变化的?

像网关这样有多个接口的设备,它在封装MAC的时候以哪个口进行封装呢?

(可以尝试自己根据上面的举例理解下,这样提高学习兴趣,后面会更有动力哇,但是切记不要钻牛角尖,这样很容易卡死在胡同里面,降低学习兴趣。)

以上是关于当我们浏览器访问某个网站时,中间经历了什么,如何到达对方的?的主要内容,如果未能解决你的问题,请参考以下文章

浏览器访问一个网站的背后到底经历了什么?

通过浏览器访问一个网站的背后到底经历了什

一个页面从输入url到页面加载显示完成,中间都经历了什么

使用Fiddler分析Youtube访问协议

从浏览器输入网址回车到看到页面过程到底经历了什么?

nginx配置使用笔记:三