什么是http呢?对于http的概念总是存在着模糊的概念,对它了解得并不透彻。现在我们来系统结合计算机的一些网络通信基础来彻底弄懂HTTP。
HTTP:全称是超文本传输协议(Hypertext transfer protocol),是用于从WWW服务器传输超文本到本地浏览器的传送协议,它运行在TCP上,是一个应用层通信协议。
可以看出WWW只是Internet提供的一种服务,Internet还有很多包括FTP,E-mail等等服务。
百度百科对于WWW的解释是这样的:
WWW是基于客户机/服务器方式的信息发现技术和超文本技术的综合。WWW服务器通过超文本标记语言(HTML)把信息组织成为图文并茂的超文本,利用链接从一个站点跳到另个站点。这样一来彻底摆脱了以前查询工具只能按特定路径一步步地查找信息的限制。WWW (World Wide Web,万维网)是存储在Internet计算机中、数量巨大的文档的集合。
从这里我们可以知道WWW是网页文档的集合,提供网页服务。
下图是实现数据通信的分层概念:
可以看到TCP/IP协议栈里,各个层级中有不同作用的协议,HTTP处于应用层中,在传输层中的TCP之上。
当我们在客户端和服务端的请求和响应相互数据传输前,首先会进行TCP连接。
建立连接的三次握手:
HTTP0.9: HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。
HTTP1.0
1.增加了请求方式POST和HEAD
2.且支持多种格式资源文件
3.支持cache
4.增加了头信息
注意:每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive。
HTTP1.1:
1.新增了请求方式PUT、PATCH、OPTIONS、DELETE等,
2.引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,Connection:keep-alive;
3.身份认证机制
4.支持文件断点续传
5.新增了24个错误状态响应码
HTTP2.0:
1.增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题
2.头信息压缩机制。HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在2.0版本中将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段
3.增加服务器推送的功能,即不经请求服务端主动向客户端发送数据。
到这里我们已经清楚了什么是HTTP。
1.请求行:请求方法 URL 协议版本\r\n
2.请求头:头部字段名:值\r\n…(User-Agent/Host/Connection/Cache-Control/Cookie/Accept)
3.空行:\r\n
4.请求数据
HTTP0.9支持定义GET;
HTTP1.0支持定义三种:GET, POST 和 HEAD
HTTP1.1 支持:GET、POST 、 HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT总共九种
1.状态行:协议版本 状态码 状态信息\r\n
2.响应头:头部字段名:值\r\n…(Content-Type/Date/Server/Cache-Control/Connection)
3.空行:\r\n
4.响应数据
/**
* 1XX:相关信息,信息,服务器收到请求,需要请求者继续执行操作
* 2XX:操作成功,操作被成功接收并处理
* 3XX:重定向,需要进一步的操作以完成请求
* 4XX:客户端错误,请求包含语法错误或无法完成请求
* 5XX:服务器错误,服务器在处理请求的过程中发生了错误
* 2.1XX状态码
* 100:Continue 继续。客户端应继续其请求。
* 101:Swiching Protocols 切换协议。服务器根据客户端请求切换协议,只能切换到更高级的http协议
* 3.2XX状态码
* 200:OK '请求成功,一般用于GET和POST请求
* 201:Created 已创建。成功请求并创建了新资源,通常在POST请求
* 202:Accepted 已接受请求,但未处理完成
* 203:Non-Authoritative infomation 非授权信息。请求成功,但返回的meta信息不在原始的服务器,而是一个副本
* 204:No Content 无内容。服务器成功处理,但未返回内容。
* 205:Reset Content 重置内容。浏览器应重置文档视图,如清空表单
* 206:Partial Content 部分内容,服务器成功处理了部分GET请求
* 4.3XX状态码
* 301:Mutiple Choices 永久移动
* 302:Moved Permanently 暂时移动
* 303:See Other 查看其它地址。与301类似。使用POST或GET请求查看
* 304:Not Modified 未修改
* 305:Use Proxy 使用代理,所请求的资源必须通过代理访问
* 306:已废弃的状态码
* 307:Temporary Redirect 临时重定向,与302类似。使用GET请求重定向
* 5.4XX状态码
* 400:Bad Request 客户端请求的语法错误,服务器无法理解
* 401:Unauthorized 请求要求用户的身份认证
* 402:Payment Required 保留的状态码
* 403:Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
* 404:Not Found 服务器无法根据客户端的请求找到资源
* 405:Mehtod Not Allowed 客户端请求中的方法被禁止
* 406:Not Acceptable 服务器无法根据客户端的内容特性完成请求
* 407:Proxy Authentication Required 请求要求代理的身份认证,与401类似,但是是要使用代理进行授权
* 408:Request Time-out 服务器等待客户端发送的时间过长,超时
* 409:Conflict 服务器完成客户端的PUT请求是可能返回此代码,服务器处理请求时发生了冲突
* 410:Gone 客户端请求的资源不存在。与404不同,401是资源以前存在但现在被永久删除了
* 411:Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息
* 412:Precondition Failed 客户端请求信息的先决条件错误
* 413: Request Entity Too Large 由于请求实体太大,服务器无法处理,因此拒绝请求
* 414:Request-URI Too Large 请求的URI过长,服务器无法处理
* 415:UNsupported Media Type 服务器不支持请求附带的媒体格式
* 416:Requested range not satisfiable 客户端请求的范围无效
* 417:Expectation Failed 服务器无法满足Expect的请求头信息
* 6.5XX
* 500:Interval Server Error 服务器内部错误,无法完成请求
* 501:Not Implemented 服务器不支持请求的功能,无法完成请求
* 502:Bad GateWay 充当网关或代理的服务器,从远程服务器接收到了一个无效请求
* 503:Service Unavailable 由于超载或者系统维护,服务器暂时的无法处理客户端的请求
* 504:GateWay time-out 充当网关或代理的服务器,未及时从远程服务器获取请求
* 505:HTTP Version not Supported 服务器不支持请求的HTTP协议的版本,无法完成处理
*/
HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。 HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。
TLS/SSL全称安全传输层协议Transport Layer Security, 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议
TLS/SSL是在传输层上的,它基于TCP与HTTP之间。
TSL/SSL的握手过程非常复杂,分初次握手,有session ticket会话缓存握手,重建连接这些情况。这里只说初次验证证书握手,可使用wireshark进行抓包验证加深理解,如下图是我画的基本流程:
所以在TCP三次握手之后,就会进行这个TSL/SSL握手。具体参考这里深入了解。
明白了HTTP以及HTTPS,那我们在浏览器输入URL后的整个流程又是怎么样的呢?
URI:Uniform Resource Identity统一资源标识符,是一个用于标识某一互联网资源名称的字符串
URL:Uniform Resource Locator统一资源定位符,是因特网的万维网服务程序上用于指定信息位置的表示方法
URL指的是一个网站的入口地址,而这个网站的某个文件访问路径,则是URI。
例如:http://xxx.com是一个URL,http://xxx.com/xxx.jpeg称它为URI。
protocol // hostname[:port] / path / [;parameters][?query]#fragment
虽然我们知道了URL的地址组成,但我们现实中拿到的URL是一个域名地址,而输入URL域名地址后首先就是DNS域名解析拿到真实IP。
DNS:英文:Domain Name System,缩写:DNS,域名系统,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。采用了域名系统来管理名字和IP的对应关系。
所以有了这个域名,我们就可以拿到这个网站对应的IP了,也就是它的主机,从而找到目标服务器。
首先域名的语法是:xxx.xxx.xxx,从右到左,以“.”符号隔开分别对应为:三级域名.二级域名.顶级域名。DNS规定,域名中的标号都有英文和数字组成,每一个标号不超过63个字符。
页面解析大致渲染过程:解析DOM生成DOM树->解析css生成CSSOM树->合成render树->计算布局->绘制页面。
其中浏览器有GUI线程、js线程和其他线程,但在一个时间里,只能运行一个线程,也就是说这些线程是互斥的,会有阻塞的情况出现。
其中解析构建DOM树的时候并不会等所有的HTML都解析完再去解析CSS渲染,浏览器为了更快的显示页面,会边构建边渲染,而每次遇到js都会停下GUI渲染,运行JS线程,当遇到js修改DOM或CSS时会引起重绘或重排。直到js执行完毕后继续GUI线程,具体查看这里。所以我们通常会把JS放在最低部,为避免阻塞渲染。
整个流程环环相扣,可以延伸的地方实在太多,一个篇幅肯定无法涵盖。其实在HTTP请求后我们加载的资源,这里又可以引伸出HTTP缓存的知识,而在页面渲染中可以延伸出要如何优化页面的知识,还有网络协议等更底层的计算机知识。
这篇总结有点长,是我对于HTTP知识的疑惑后学习整理出来的,若有错误请大佬指出。