结论: 1、首先请求DNS解析域名、解析为ip地址; 2、根据这个地址找到互联网上对应的服务器,向这个服务器发起一个请求,3、由服务器决定返回默认的数据资源给访问的用户; 4、浏览器根据数据渲染页面;
DNS域名解析过程
1、当用户在浏览器中输入域名并按回车键时,浏览器会检查缓存中该域名是否为对应解析的IP地址,如果缓存中有,解析过程将结束。 浏览器缓存大小有限制,而且也有时间限制,通常是几分钟到几个小时,这个时间限制是由域名的TTL属性来设置的。 2、如果用户的浏览器缓存没有,浏览器将缓存查找操作系统缓存是否有DNS域结果。其实操作系统也可以有一个域名解析的过程,在Windows中可以用C: Windows/System32/drivers/etc/hosts文件来设置,在Linux中是etc/hosts文件,可以取任意DNS到任意IP地址进行访问。如果这里的IP地址对应指定了域名,浏览器会先使用该IP地址。 例如,当我们在测试时可以将DNS发送到一个测试服务器,这样不需要更改任何代码就可以测试将业务逻辑代码发送到一个单独的服务器是否正确。因为本地的DNS纪律,所以黑客可以通过修改你的DNS来指定特定的DNS的IP地址吧,导致域名被劫持。因而通常情况下这个文件是只读的。 3、当浏览器缓存和操作系统上都没有时,进行域名服务器上的域名请求,DNS会在各个域名服务器上逐层向上查找,直到找到域名。域名服务器又分为: 1)、主域名服务器 负责维护一个区域的所有域名信息,是特定的所有信息的权威信息源,数据可以修改。 2)、辅助域名服务器 当主域名服务器出现故障、关闭或负载过重时,辅助域名服务器作为主域名服务器的备份提供域名解析服务。辅助域名服务器中的区域文件中的数据是从另外的一台主域名服务器中复制过来的,是不可以修改的。 3)、缓存域名服务器 从某个远程服务器取得每次域名服务器的查询回答,一旦取得一个答案就将它放在高速缓存中,以后查询相同的信息就用高速缓存中的数据回答,缓存域名服务器不是权威的域名服务器,因为它提供的信息都是间接信息。 4)、转发域名服务器 负责所有非本地域名的本地查询。转发域名服务器接到查询请求后,在其缓存中查找,如找不到就将请求依次转发到指定的域名服务器,直到查找到结果为止,否则返回无法映射的结果。
4、域名解析完成后,会在用户的本地机器和本地域名服务器上产生缓存,在Java应用中,JVM也会缓存DNS解析结果。以InteAddress类形式存在。在机器上使用ipconfig/flushdns可以刷新windows机器上的缓存,linux是etc/init.d/nscd restart ;JVM则需要在JAVA_HOME\lib\security\java.security文件中配置。
如何发起一个HTTP请求
当下来说,发起Http请求有很多工具包,比如HttpClient。而在浏览器上,打个url就行,在linux上使用curl命令+url也可快速发起一个Http请求。 请求发起的具体过程: 如果是HTTP2.0,发起一个请求需要首先由TCP发起一个连接请求,通过三次握手来实现,然后进行数据包的发送。 即在第三次握手时可以携带数据发送。 HTTP3.0使用QUIC来建立连接,Qick Udp Internet Connection简单来说就是 UDP的包装版,利用了UDP的连接快的特性,再加上应用层的包装,使整个协议拥有TCP+TLS的优点。基本连接采用DH密钥交换算法连接,具体连接过程简介如下: 1、首次连接时,客户端发送 Hello 给服务端,用于请求连接; 2、服务端生成 两个固定参数和一个随机参数,根据三个参数算出服务器密钥A,然后将固定参数和服务器密钥A放到 Server Config 中再发送 Rejection 消息给客户端; 3、客户端接收到数据后,自己再生成随机参数b,根据两个固定参数和随机参数b算出客户端密钥B,根据固定参数和服务器密钥A算出交易密钥K。B和K算好后,客户端会用交易密钥K加密 HTTP 数据,连同客户端密钥B一起发送给服务端; 4、服务端接收到客户端密钥B后,根据参数生成与客户端同样的密钥B,再用这密钥解密收到的 HTTP 数据。为了进一步的安全(前向安全性),服务端会更新自己的随机参数数 a 和公钥,再生成新的密钥 S,然后把公钥通过 Server Hello 发送给客户端。连同 Server Hello 消息,还有 HTTP 返回数据; 5、客户端收到 Server Hello 后,生成与服务端一致的新密钥 S,后面的传输都使用 S 加密。 这样,QUIC 从请求连接到正式接发 HTTP 数据一共花了 1 RTT,这 1 个 RTT 主要是为了获取 Server Config,后面的连接如果客户端缓存了 Server Config,那么就可以直接发送 HTTP 数据,实现 0 RTT 建立连接。从而节省时间。
HTTP的数据格式:一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。 请求行分为三个部分:请求方法、请求地址和协议版本。 请求头部由关键字/值对组成,请求头部用于通知服务器有关于客户端请求的信息;
服务器响应数据
当服务器收到请求后,取决于web应用架构,可能有多个服务器,常见的通过反向代理、负载均衡在加上网关处理就可以最终指定由那个服务器来响应请求。服务器响应过程; 1、首先收到的请求先要进行一个解析,通过对于Http请求的划分,可以得到请求的具体数据; 2、对于请求的数据也可能存在不同的地方,常见的静态资源和动态资源的划分,使得需要到不同地方去实现请求的响应,最终确定好由什么来处理请求,最后可能被划分为多个请求来进行多次处理。 3、请求处理完成后,服务器会构建Http响应包,格式同请求包类似; 4、发送完响应包,可能在服务器上需要做一些其他的处理,比如日志记录。
浏览器渲染数据
当浏览器接受到数据包时,如何从这里面拿到需要的数据;
1、对于不同的浏览器,首先确定他们不同的渲染引擎,负责对网页语法(如HTML、CSS、JavaScript等)的解释并显示网页。Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safari和Chrome使用webkit内核。 2、引擎选择结束后,进行一个Dom树和Render树的构建和布局,简单来说就是Html的渲染;当遇到CSS文件,发出CSS文件的请求,服务器返回这个CSS文件; 当遇到Javascript代码,进行代码执行; 偶尔遇到某些操作需要进行重新渲染。
|