《图解HTTP》读后感
HTTP基础的简单理解
在了解HTTP协议之前,我们先了解下TCP/IP的参考模型,TCP/IP参考模型分为四层:应用层、传输层、网络层、链路层(数据链路层)。
应用层:为不同的网络应用提供所需的服务。
传输层:为应用层实体提供端到端的通信/传输功能,确保数据包的按顺序传送及数据的完整性。
网络层:处理网络上流动的数据包,它所包含的协议涉及到数据包在整个网络上的逻辑传输。
链路层:监控数据交换,处理网络连接的硬件部分。
TCP/IP通信传输流如下图所示:
HTTP在各层的封装处理:
与HTTP协议密切相关的协议/服务:IP,TCP,DNS
IP协议负责数据包的传送,当然,这需要配合IP地址和MAC地址,IP间的通信依赖MAC地址,这就涉及到用以解析地址的ARP协议了。
TCP提供了可靠的字节流服务,对要发送的大块数据进行分割成小数据包以易于传输,并且该协议可确认数据包是否送达到目的方。
DNS服务负责解析域名
URI(统一资源标识符)和URL(统一资源定位符)
URI:一个用于标识某一互联网资源名称的字符串。组成:主机名(含端口号)+相对路径+标识符
URL:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。组成:协议+主机名(含端口号)+相对路径
区别:URI表示请求资源在互联网上存在的位置,URL在表示请求资源的位置同时还要说明如何访问到这个资源,URL是URI的一个子集。参考资源:URL和URI的区别
Cookies
HTTP协议用于客户端和服务端之间通过请求和响应的交换所达成的通信,并且它是一种无状态的协议,不会对请求和响应之间的通信状态进行保存(无法根据前一次请求对这次请求做出处理),但为了能够有保存状态的功能,引入了cookies技术。
持久连接
HTTP初始版本时,每进行一次HTTP请求就会断开一次TCP连接,这情况在早期传输文本很小的时候倒也不觉得如何,但是随着时代的进步,所需传输的内容种类越来越多和内容越来越大了,每次连接后都会断开请求就大幅度的增加了通信量的开销了。幸好,自HTTP/1.1和部分HTTP/1.0来,有了持久连接这么个神奇的东西,它规定了只要任何一方没有明确的提出断开连接,那么就保持TCP连接状态。而在维持的TCP连接期间,可以多次进行HTTP请求来传输需要的内容。
HTTP/1.1默认保持持久连接,在HTTP的头部信息中会有Connection: Keep-alive属性,我们也可以通过浏览器开发工具的NetWork面板查看这个属性的状态及HTTP请求信息:
如何关闭持久连接:在响应头设置Connection属性为close.
得益于持久连接,HTTP实现了管线化,能够做到同时并行发送多个请求,而无需一个接一个的等待响应。
HTTP请求的内容结构
HTTP协议交互的信息称为HTTP报文,通过下面的图来看看HTTP报文的结构:
除却空行(回车符、换行符),大致分为报文首部和报文主体。报文首部包含请求行(请求的方法、URI、HTTP版本)和状态行(响应状态码、原因短语、HTTP版本),首部字段(请求和响应的条件和属性),其他(未定义的首部)。
首部字段
首部字段规定了客户端如何处理请求和服务端如何处理响应,根据用途可分为四种:请求首部(请求报文使用的首部),响应首部(响应报文使用的首部),通用首部(请求和响应通用的首部),实体首部(报文实体部分使用的首部)。
HTTP/1.1首部字段列表
通用首部字段
请求首部字段
响应首部字段
实体首部字段
此外,还有一些如Cookie、Set-Cookie和Content-Disposition等在其他RFC中定义的首部字段也经常会被用到。
传输编码
HTTP传输数据的时候可以传输原数据,也可以在传输过程中编码以提升传输速率。通过传输时的编码处理,能有效的处理大量的访问请求。常用的内容编码有以下几种
· gzip(GUN zip)
· compress(UNIX系统的标准压缩)
· deflate(zlib)
· identity(不进行编码)
多部分对象集合
HTTP协议中采纳了多部分对象集合,允许发送的报文主体内可含有多类型实体。多用于上传文件或者图片时使用,可以设置Content-Type属性对其进行规定。如以下几种常见的形式:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据
Application:用于传输应用程序数据或者二进制数据