下面我们从系统网络的角度分析输入www.baidu.com后的过程:
1、客户端浏览器通过DNS解析到www.baidu.com的IP地址202.108.22.5,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到202.108.22.5,然后通过TCP进行封装数据包,输入到网络层。
2、在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。
3、客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,无非就是通过查找路由表决定通过那个路径到达服务器。
4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。
事件顺序:
(1) 浏览器获取输入的域名www.baidu.com
(2) 浏览器向DNS请求解析www.baidu.com的IP地址
(3) 域名系统DNS解析出百度服务器的IP地址 (详细介绍DNS)-通过网关出去;发起TCP的3次握手
(4) 浏览器与该服务器建立TCP连接(默认端口号80)
(5) 浏览器发出HTTP请求,请求百度首页
(6) 服务器通过HTTP响应把首页文件发送给浏览器
(7) TCP连接释放(四次挥手)
(8) 浏览器将首页文件进行解析,并将Web页显示给用户。
简单理解: 域名解析DNS --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
事件顺序(1)--->涉及到的协议:
(1) 应用层:HTTP(WWW访问协议),DNS(域名解析服务)
DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话,然后通过运输层TCP协议封装数据包,在TCP协议基础上进行传输。
(2) 传输层:TCP(为HTTP提供可靠的数据传输),UDP(DNS使用UDP传输),HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作。
(3)网络层:IP(IP数据数据包传输和路由选择),ICMP(提供网络传输过程中的差错检测),ARP(将本机的默认网关IP地址映射成物理MAC地址)为数据包选择路由,IP协议进行主要工作,相邻结点的可靠传输,ARP协议将IP地址转成MAC地址。
1.URL是什么?
URL统一资源定位符,用于定位互联网上的资源。
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
而https://www.baidu.com/正是这样一个URL,当我们在地址栏中输入https://www.baidu.com/并按下回车后,DNS服务器(域名解析系统)会根据用户提供的域名查找对应的IP地址。
域名:以百度为例,baidu.com就是一个域名,大多数情况下,我们输入网址都是输入它的域名,相比输入IP地址或者一整串URL来说,输入域名会更加方便更容易记忆。
二、过程中使用到的协议
该过程中使用到了ARP,IP,SOFP
ARP(地址解析协议):他主要解决的是同一个局域网内主机或路由器IP地址和MAC地址之间的映射问题。
工作过程:当源主机要发送数据的时候,他会查看自己的ARP高速缓存中是否有目的主机IP地址对应的MAC地址,如果与,则直接发送,如果没有,他就会向本网段所有主机发送ARP请求分组,接到请求的主机查看目的IP与自己的IP是否相等,如果不等就忽略,如果相等,就把源主机的IP和MAC写入自己的ARP高速缓存,如果之前有就覆盖掉,然后把自己的MAC写入ARP相应包,源主机接到ARP响应包后把目的主机的IP和MAC地址写入ARP高速缓存,并且利用此信息发送数据。
路由选择协议
1.内部网关协议
1)RIP协议
RIP基于UDP的应用层协议,他认为一个好的路由是他通过的路由器少,RIP允许一条路径最多可以包含15个路由,16个即为不可达了。
工作过程:假设路由器R0向R1发送一个报文段
首先修改R0发来的RIP报文中所有的项目,把吓一跳字段的地址改为R0,把所有距离字段值加1,
对于修改后的RIP报文的每一项进行如下步骤,步骤一、首先看原来的路由表中是否有目的网络N,如果没有直接加入到路由表中,如果有进行步骤2 步骤二、然后看吓一跳,如果吓一跳的地址是R0则用新的项目替换原来的项目,如果吓一跳不同则进行步骤三步骤三、对比距离,如果距离小于源路由器的项目,那么更新,否则什么都不做。
首先将R0发来的路由更新信息的距离都+1,下一跳都改为R0
Net1在源路由表中没有所以直接写入,Net2中吓一跳相同,直接覆盖原路由表中的Net2那一行,Net3的吓一跳不同,所以选择路径最小的。
2)OSPF(最短路径优先)
OSPF是网络层协议基于IP,当路由的链路状态发生变化时,他会使用洪泛法向本自治系统中所有路由发送自己的的链路状态(链路状态就是自己和那些路由相邻)
2.外部网关协议
2)BGP
BGP是不同自治系统路由器之间交换路由信息的协议,他只是力求寻找能达到目的网络的比较好的协议,而并非最佳路由。
BGP发言人:每一个自治系统的管理员都需要至少有一个路由器作为BGP发言人,BGP发言人一般是边界路由器,当然也有不是边界路由器的情况。
BGP交换路由信息:BGP发言人如果想和别的自治系统的BGP发言人交换信息(到达某个网络所要经历的一系列AS),他需要先建立起TCP连接,连接建立成功后在此链接上交换BGP报文,建立BGP会话,使用TCP是因为可以提供可靠的服务,也简化了路由选择协议。
在应用层,浏览器会给web服务器发送一个HTTP请求;
请求头为:GET http://www.baidu.com/HTTP/1.1
在传输层,(上层的传输数据流分段)HTTP数据包会嵌入在TCP报文段中;
TCP报文段需要设置端口,接收方(百度)的HTTP端口默认是80,本机的端口是一个1024-65535之间的随机整数,这里假设为1025,这样TCP报文段由TCP首部(包含发送方和接收方的端口信息)+ HTTP数据包组成。
在网络层中,TCP报文段再嵌入IP数据包中;
IP数据包需要知道双方的IP地址,本机IP地址假定为192.168.1.5,接受方IP地址为220.181.111.147(百度),这样IP数据包由IP头部(IP地址信息)+TCP报文段组成。
在网络接口层,IP数据包嵌入到数据帧(以太网数据包)中在网络上传送;
数据帧中包含源MAC地址和目的MAC地址(通过ARP地址解析协议得到的)。这样数据帧由头部(MAC地址)+IP数据包组成。
数据包经过多个网关的转发到达百度服务器,请求对应端口的服务;
服务接收到发送过来的以太网数据包开始解析请求信息,从以太网数据包中提取IP数据包—>TCP报文段—>HTTP数据包,并组装为有效数据交与对应线程池中分配的线程进行处理,在这个过程中,生成相应request、response对象。
请求处理完成之后,服务器发回一个HTTP响应;
事件顺序(2)--->点击网址后,<应用层>的DNS协议会将网址解析为IP地址;
一、DNS查找过程(由域名→IP 地址):
- 浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。
- 如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存(hosts文件)中是否有这个域名对应的DNS解析结果。
- 若还没有,此时会发送一个数据包给DNS服务器(操作系统向根域名服务器发起请求得到顶级域名服务器的IP,然后根域名服务器向顶级域名服务器发起请求得到权限域名服务器的IP,顶级域名服务器再向权限域名服务器发起请求得到IP,本地域名服务器返回给操作系统IP,同时将IP缓存起来,操作系统将IP返回给浏览器,同时将IP缓存起来),DNS服务器找到后将解析所得IP地址返回给用户。
简单理解: 寻找 IP 地址的过程依次经过了浏览器缓存、系统缓存、hosts文件、路由器缓存、 递归搜索根域名服务器。
事件顺序(3)--->解释TCP的三次握手。
1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同 时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候 Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收 到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这 是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的 确认。
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效 (代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说 的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
事件顺序(4)--->建立TCP连接
费了一顿周折终于拿到服务器IP了,下一步自然就是链接到该服务器。对于客户端与服务器的TCP链接,必然要说的就是『三次握手』。
客户端发送一个带有SYN标志的数据包给服务端,服务端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息,最后客户端再回传一个带ACK标志的数据包,代表握手结束,连接成功。
上图也可以这么理解:
客户端:“你好,在家不,有你快递。”
服务端:“在的,送来就行。”
客户端:“好嘞。”
事件顺序(5)--->发送HTTP请求
与服务器建立了连接后,就可以向服务器发起请求了。这里我们先看下请求报文的结构(如下图):
在浏览器中查看报文首部(以google浏览器为例):
请求行包括请求方法、URI、HTTP版本。首部字段传递重要信息,包括请求首部字段、通用首部字段和实体首部字段。我们可以从报文中看到发出的请求的具体信息。具体每个首部字段的作用,这里不做过多阐述。
事件顺序(6)--->服务器处理请求
服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。
事件顺序(6)--->返回响应结果
在HTTP里,有请求就会有响应,哪怕是错误信息。这里我们同样看下响应报文的组成结构:
在响应结果中都会有个一个HTTP状态码,比如我们熟知的200、301、404、500等。通过这个状态码我们可以知道服务器端的处理是否正常,并能了解具体的错误。
状态码由3位数字和原因短语组成。根据首位数字,状态码可以分为五类:
事件顺序(7)--->关闭TCP连接
为了避免服务器与客户端双方的资源占用和损耗,当双方没有请求或响应传递时,任意一方都可以发起关闭请求。与创建TCP连接的3次握手类似,关闭TCP连接,需要4次握手。
上图可以这么理解:
客户端:“兄弟,我这边没数据要传了,咱关闭连接吧。”
服务端:“收到,我看看我这边有木有数据了。”
服务端:“兄弟,我这边也没数据要传你了,咱可以关闭连接了。”
客户端:“好嘞。”
事件顺序(8)--->浏览器解析HTML
准确地说,浏览器需要加载解析的不仅仅是HTML,还包括CSS、JS。以及还要加载图片、视频等其他媒体资源。
浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。渲染树与DOM树不同,渲染树中并没有head、display为none等不必显示的节点。
要注意的是,浏览器的解析过程并非是串连进行的,比如在解析CSS的同时,可以继续加载解析HTML,但在解析执行JS脚本时,会停止解析后续HTML,这就会出现阻塞问题,关于JS阻塞相关问题,这里不过多阐述。
事件顺序(8)--->浏览器布局渲染
根据渲染树布局,计算CSS样式,即每个节点在页面中的大小和位置等几何信息。HTML默认是流式布局的,CSS和js会打破这种布局,改变DOM的外观样式以及大小和位置。