用户从浏览器输入网址到页面显示,细分了一下基本上由八大快原理组成,他们是:
dns解析原理、TCP三次连接、http请求数据包、数据包的封装、数据包的解封装、集群内部的一个请求、服务器的响应报文、四次断开
> dns解析原理:
当用户在客户端输入网址后,客户端会先访问本地的hosts文件和dns缓存,我们hosts一般都是做测试使用来配置的。所以设备第一访问这个网址,在本地的hosts和local是没有这个解析的,这个时候会向LDNS(也交本地dns寻求解析),如果lDNS这里有记录,就会反馈给客户端,如果LDNS没有这个记录,LDNS就会向全球13台的根服务器去解析。这13台服务器是“层级式”域名解析体系,最上面的服务器叫做根服务器,在我们网址的后面都会影藏一个. 这个点就代表的是根服务器,根服务器下面的13台服务器叫做一级域也叫顶级域,再下面的是二级域,当根服务器收到请求后,根服务器只有下面的13台顶级域的解析,他会告诉LDNS去访问对应的一级域名,一级域名服务器收到请求后,查看自己的A记录,告知LDNS去找etiantian这个服务器,LDNS再次找到etiantian服务器,etiantian服务器查看自己的A记录,把信息告知LDNS。lDNS把信息告知客户端。LDNS和本地的dns都会把这条记录缓存下来也叫做A记录还有一些的记录例如邮件的MX记录,prt反向解析记录,cname记录。A记录不是一对一的,他可以一对多。这里有个ttl (time to live)是控制dns的缓存周期的,ttl是什么那?就是dns多长时间刷新一下,对于网站修改量小的可以把ttl改的时间长一点。例如3600秒,这样dns缓存的时间长,用户访问数据可直接从本地读取,加快了流量,如果一个网址修改量大,我们就要把ttl时间改小点,如果太大,服务器那边已经修改了,本地缓存的还是旧的。如果太小也不好,假如1秒,dns就刷新的太快,全球dns刷新一次要12个小时多,所以用户一直是同通过递归和迭代的方式去解析给后端dns解析服务器带来了很大的压力。到处dns解析就介绍了。客户端得到了网址对应的ip了;下面用户将要去访问这个ip的服务器了
> tcp的三次握手
客户端向服务器端发送一个syn的请求,状态从closed变成了syn_sent,服务器在收到客户端的syn请求后,把syn发回给客户端,同时也会回发送一个ack,服务器从状态变成syn_rcvd状态,客户端收到服务器返回的syn和客户端后,返回一个ack给服务端,客户端的状态变成establish,服务器收到客户端发回的ack后状态变成established,到此tcp的连接建立成功
>http请求报文
为什么要先连接后进行http的协议?
http协议是在tcp协议之上,所以只有tcp连接建立了以后应用层的http协议才可以通信~~~~~~~~~~~~~~~~~~~~~~~
http的请求报文一般有请求行,请求头,请求主体三部分组成,在请求行里面包含了请求方法,URL和http的协议版本还有一个空行,他们之间都是用空格分隔的,现在使用的请求方法有GET.PUT,POST,HEAD,DELETE,MOVE.GET方法是把客户端请求指定的内容,从服务器端获得该内容;PUT方法是把客户端的资源上传到服务器来代替指定的内容;POST方法将客户的资源提交到服务器,例如注册表单,delete和move不经常用,这里就不介绍。下面看请求头都有哪些东西?在请求头里面包含了:媒体类型,语言类型,压缩方法,客户端信息,主机头,连接状态等一些信息,这里与这个请求头相关的最常用的请求头就是Content-Type媒体和Content-Length请求长度这两种。在请求头的下面是一个“空行”,这里通过发送回车或者换行符来告诉空行以下不会有请求头的内容了。在空行的下面是请求主体,如果是get方法这里是没有请求主体的。到此http的请求报文包含这些东西,然后经过OSI的七层模型开始给这个请求头进行数据封装
> 数据包封装
请求报文在应用层封装数据,在传输层会封装上tcp头转换成数据段,在网络层封装上ip数据段转换成数据包,在数据链路层封装进去mac和llc头,把数据包转换成帧,下面会在物理层把帧转换成bit流来传送,现在客户端这的所有工作都结束了,下面bit流会到达远程的Lb负载服务器,负载服务器通过解封装把数据提取出来,解封装的过程正好是封装数据包的反向,从物理层开始,一直到应用层。在应用层分析出请求报文的信息后,负载会向后面的内容集群查找指定的内容,我们常用的软件负载有‘nginx LVS HAproxy’优缺点自己了解,当然还有硬件的负载A10和′F5等。如果请求的信息是静态信息,复制会请求后方的静态服务器,公司如果有CDN的情况,会把这些静态文件放在CDN前面,这样客户访问速度快,也能给内部集群减少压力;如果请求包含css,jss等一些是动态数据,由于这些结构的化的动态数据都存放在后台的数据库,或者nfs,所以会去请求数据库或者nfs服务器,当然在数据库和nfs前面有缓存服务器类似mamcache ,会直接访问缓存,这样都是对内部的一个优化。把用户想要的数据经过内部集群的一个调用,最后要返回到客户端,在这里就出现了http的响应报文
http的响应报文包含有:起始行(也叫状态行),响应头部,空行和响应主体。起始行内包含了协议及版本,状态码以及状态信息。http协议有0.9 1.0.1和1.1现在0.9已经淘汰找不到了。1.0和1.1相比,1.0版本服务器和客户端只能保持短连接,请求完毕会关闭这个连接,而1.1增加了keep-alive持久连接,可扩展性,缓存处理等特点,持久连接也是在请求头里面体现,当收到客户端的请求头包含close信息时,请求断开。协议版本后面是数字的一个状态码,这个状态码是反馈给客户端的信息,告知是否连接成功,以及故障大体的方向,状态码范围100-199,指定客户端应响应的动作,200-299请求成功,还有300-399 400-499客户端的错误导致 500-599,服务器的错误导致,我们工作中经常能见到几个代码,需要注意下,例如:200 表示请求成功,301 永久跳转,但是请求是成功的,403 forbidden 禁止访问,这里一般是服务器一端的权限配置问题,404 not found 这个也是服务器端的,造成这个原因有很多,有可能是集群内部数据的返回超时,或者请求的内容在服务器上已经不存在,500这是一个内容服务器的笼统报错,造成这个的原因很多,502 bad gateway一般是代理服务器请求后端,后端没有放回或者请求超时,一般为方向代理的下面的节点问题;503 services unavailable  服务器不可用,可能是服务器超载或者宕机,或者反向代理后面没有提供服务的节点 504 Gateway timeout 代理向后请求,后端在一定时间内没有给反馈,造成的超时。下面看看响应头部,这里主要包含了,媒体类型MIME,时间,服务器服务版本,连接状态,字符集类型,MIME是一种文本标记,中间由一条斜杠来分割的;在响应头部下面是一个空行,告诉响应头部内容结束,下面是响应主体,这里装载了给客户端的数据,这些数据都是文本,也可以是二进制的(图片,视频)
客户端收到响应报文后,向服务器发送一个fin的信号,客户端从established状态变成了FIN_wait1,服务器收到客户端的FIN后返回一个ACK,同时服务器状态变为close_wait,客户端收到服务器返回的ack,状态变成了fin_wait2,这个时候客户端会等服务器,如果服务器还没有发送完数据,就继续发送,如果发送完毕 会给客户端发送一个FIN,此时服务器变为LAST_ACK状态,客户端收到服务器的fin后,马上返回一个ack给服务器告知收到,状态进入到time-wait,此时客户端在等2msl时间后进入到closed状态,服务器收到客户端ack后进入到closed状态。到此四次断开结束,还有一种情况就是closing状态,这是由于客户端发送了fin给服务器,而没有收到服务器的ack 却收到了服务器的fin,发生ack丢包的情况,这有可能是网络原因。。。上面就是用户从浏览器输入网址到看到页面内容的一个过程