初窥http(3)——浅析http报文

 今天一天给18级新生讲算法,但是呢日更还是得维持,所以就晚上更新一个简单一点的内容。今天的内容主要浅要分析http报文

一 请求报文和结构

 由上图可知,请求报文和响应报文的内容由下面的数据组成。

  1. 请求行

     用于表示请求的方法,请求的URI和HTTP版本
  2. 状态行

     包含表明响应结果的状态码,原因短语和 HTTP 版本。
  3. 首段字段

     包含表示请求和响应的各种条件和属性的各类首部。

     一般有4种首部,分别是:通用首部、请求首部、响应首部和实体 首部。
  4. 其他

     可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等)

二 HTTP传输与压缩

 在http协议中有一种被称为内容编码的功能可以进行内容压缩。常用的内容编码如下:

  • gzip(GNU●zip)
  • compress(UNIX 系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

三 分割发送的分块编码

 分块传输编码会将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)” 来标记。

 使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。

 HTTP/1.1 中存在一种称为传输编码(Transfer Coding)的机制,它可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。

四 获取部分内容的范围请求

 http协议中该部分的功能是为了在网速较慢的情况下,能够对大文件断点重传。通过在首部定义Range字段即可完成该功能。

1
2
Range: bytes=5001-10000  单范围
Range: bytes=-3000, 5000-7000 多范围

初窥http(2)——加密版本的http协议https协议

 紧随初窥http(1),这次探索的是现代网站常用的加密协议https。https的主要功能是确保web安全。它主要弥补了http下面的几个不足:

使用明文通信,内容可能会被窃听

无法验证通信方的身份,可能存在伪装的情况

无法验证报文的完整性,报文可能遭到修改。

 这些问题通常会出现在所有非加密的信息传输协议中。为了解决上述的三个问题https应运而生。

一 什么是https

 利用SSL或者TLS的组合使用,加密HTTP的通信内容。通过SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信。与SSL组合使用的HTTP被称为HTTPS或者HTTP over SSL。

二 对称加密非对称加密

 对称加密和非对称加密是我们常常使用的加密算法,对称加密时通信双方使用同一个密钥,此时如何保障该密钥的传输成为一个重大难题,通常来说在一些必要的情况下设备厂商会在设备内预置一些密钥对,这样在一定程度上保证通信安全。而非对称加密,一对密钥由公钥和私钥组成,私钥解密公钥加密数据,公钥解密私钥加密数据。私钥只能由一个设备保管,但是公钥可以公开给所有人,根据算法相关的知识我们可以知道,这种通信方式更为安全,但是传输速度收到加密解密速度的影响。

 所以在https中,同时使用到了对称加密和非对称加密,非对称加密主要用于服务器的验证,对称加密主要用于大量数据的传输,利用对称加密和非对称加密的特点,共同解决http数据传输时的安全问题。

三 https过程详解

 关于HTTPS安全通信机制和HTTPS的通信步骤,不同人有不同的理解办法,这里引用《图解http》里面的内容来详细介绍这一过程。

摘选书中的内容主要分为下面12个步骤。

  1. 客户端通过发送Client Hello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
  2. 服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
  3. 之后服务器发送Certificate 报文。报文中包含公开密钥证书。
  4. 最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
  5. SSL第一次握手结束之后,客户端以Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
  6. 接着客户端继续发送Change Cipher Spec报文。该报文会 提示服务器,在此报文之后的通信会采用Pre-master secret 密钥加密。
  7. 客户端发送Finished报文。该报文包含连接至今全部报文 的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
  8. 服务器同样发送Change Cipher Spec报文。
  9. 服务器同样发送Finished报文。
  10. 服务器和客户端的Finished 报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
  11. 应用层协议通信,即发送HTTP响应。
  12. 最后由客户端断开连接。断开连接时,发送close_notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP 的通信。

初窥http(1)——浏览器中输入url后到底发生了什么

 在学校里学习计算机网络的过程中,由于《计算机网络》课本内容较为底层基础,许多人在学习完这本书后都会产生一定的困惑。譬如,现在互联网有哪些地方运用到了哪些协议,这些协议最新的标准是什么样子的等等。为了解决心中的困惑,我决定先对日常中最常用的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有什么不同,这些疑惑就留到日后逐一破解。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×