在学校里学习计算机网络的过程中,由于《计算机网络》课本内容较为底层基础,许多人在学习完这本书后都会产生一定的困惑。譬如,现在互联网有哪些地方运用到了哪些协议,这些协议最新的标准是什么样子的等等。为了解决心中的困惑,我决定先对日常中最常用的http-web中所采用的协议进行更深一步的了解,为此我在图灵社区中购置了《图解http》一书。接下来将按照自己的思路从书中获取一些问题的答案。
本文是购置该书籍后发表的第一篇记录,在这篇记录里,我将揭秘在浏览器中输入url后发生的一系列事情。
浏览器中输入url后主要会发生下面的几件事
一 负责域名解析的DNS服务
计算机可以被赋予ip地址,同样的也可以被赋予主机名和域名。例如本博客的ip地址是185.199.109.153(github io服务器地址),域名地址为 blog.100innovate.com。我们通常使用域名去访问不同的计算机和网站,域名相比一串数字来说更有利于人们的记忆,但是计算机更擅长于处理ip地址这样的数字。
为了解决计算机和人的矛盾,DNS服务在这个时候就产生了,通过DNS服务我们可以通过域名查询ip,或者利用ip查询域名。(通常而言,人们仅利用域名查询ip,很少利用ip查询域名)
在浏览器中输入url并键入回车后的第一步,浏览器将会向DNS服务器发送查询请求,从而获取目标服务器的ip地址。
二 互联网的基础TCP/IP协议
计算机想要相互通信,就需要一个标准的数据交换协议,这个协议就是TCP/IP协议。通常而言浏览器访问web网站时采用的是TCP协议,TCP协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,为了保证通信的可靠新,首先需要进行三次握手,三次握手的主要流程为:
1.客户端向服务器端发送SYN标记的数据包
2.服务器端向客户端发送SYN/ACK标记的数据包
3.客户端向服务器端发送ACK标记的数据包
采用三次握手而不是两次握手有许多原因,原因之一是防止延期到达的数据包传输到服务器,服务器会因此创建一个无效的连接。
三 通过HTTP协议传输数据
HTTP协议的职责是生成针对目标Web服务器的HTTP请求报文,主要有如下的请求方法:
GET:获取资源
POST:传输实体主体
HEAD:获取报文首部
PUT:传输文件
DELETE:删除文件
OPTIONS:询问支持的方法
TRACE:追踪路径
……
利用上述的数种请求报文向服务器发送请求报文,从而获取用户需要访问的内容。请求报文主要包含请求方法、URI、协议版本三个信息。
在向服务器发送完请求报文后,服务器会返回请求的结果。当然每一次返回的结果并非绝对正确,为了表达服务器对用户请求的各种状态,http协议设置了规定了状态码,通过返回状态码告知浏览器服务器处理的情况,状态码通常的定义如下:
状态码 | 类别 | 含义 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
通常来说,只要遵守上述状态码的规则,服务提供商可以自行创建状态码。
通过上述请求协议和服务器返回报文,最终浏览器可以获得用户需要的数据和信息。
四 浏览器解析并渲染页面
在浏览器成功获取html信息后,将会按照顺序从头至尾解析html文件,在解析到外部的css、js等其他外部资源文件的时候,根据服务器、浏览器的版本不同将会直接向服务器请求资源文件,或者重新建立TCP连接,然后请求资源文件。值得一提的是,在解析html文件时,浏览器将会构建DOM树,为了加速这一过程,浏览器还会使用预解析等功能。
在完成html的解析后,浏览器还需要根据浏览器的窗口位置等信息,逐像素的将网页绘制出来。最终我们可以获得想要看到的网页。
五 小结
通过对《图解http》进行全篇大致浏览,解决了一大问题。但是需要学习的仍然还有人多,譬如现代浏览器一些处理机制问题以及近年来我们常常使用的https与http有什么不同,这些疑惑就留到日后逐一破解。