初识HTTP
以下为我当前阶段所学的HTTP知识的小结,以下对HTTP相关内容的叙述可能并不全面和准确
参考谢希仁的《计算机网络》第七版的6.4.3
HTTP的基本特征
HTTP是一个无状态的、本身无连接的、面向文本的协议
“无状态的”是指一个用户访问HTTP服务器时,服务器的响应和用户第一次访问时得到的响应是一样的。这样的无状态特性简化了服务器的设计,使得服务器可以支持大量并发的HTTP请求
“本身无连接”是指HTTP在正式交换HTTP报文前是不需要先建立连接的。HTTP协议使用的运输层协议是面向连接的TCP协议,当客户浏览器要向HTTP服务器发送请求时,需要先和服务器建立起TCP连接,当“三次握手”的前两次完成后,HTTP请求报文就作为“第三次握手”报文的数据发送到HTTP服务器中,接着HTTP服务器就把请求的万维网文档作为响应报文返回给客户
“面向文本的”是指HTTP的报文中的每一个字段都是一些ASCII码串(每个字段的长度都是不确定的)
HTTP报文的结构
HTTP报文分为请求报文和响应报文,它们都由三部分组成:开始行、首部行、实体主体,它们唯一的结构差异在于开始行
开始行:用于区分是请求报文还是响应报文。开始行分三个字段,以空格分隔,以回车结尾
-
请求报文的开始行叫做请求行,它的三个字段分别是方法、URL、HTTP版本
方法就是指对所请求对象的操作,这些方法实际是一些命令,常见的如GET、POST、OPTION、PUT、HEAD等
URL就是要请求的页面的地址
HTTP版本字段就是用于指明使用的HTTP版本 -
响应报文的开始行叫做状态行,它的三个字段分别是HTTP版本、状态码、短语
HTTP版本字段就是用于指明使用的HTTP版本
状态码是用于表示本次响应的状态,状态码有五类- 1xx,表示通知信息
- 2xx,表示成功
- 3xx,表示重定向
- 4xx,表示客户的差错
- 5xx,表示服务器的差错
短语是用于解释状态码的简单短语,如 404 的 Not Found,202 的 Accepted等
首部行:用来说明服务器、浏览器或报文主体的一些信息。首部可以有好几行,也可以不使用。每个首部行由首部字段名和值组成,以回车结尾(后续还有一个回车来把首部行和实体主体分开)
实体主体:在请求报文中一般都不使用这个字段,在响应报文中也可能没有这个字段(所以有什么迪奥用吗???
HTTP数据传输的连接问题
上文说到HTTP本身是无连接的,使用的运输层协议是面向连接的TCP协议,在浏览器请求一个万维网文档时会首先通过TCP和HTTP服务器建立连接,并在“第三次握手”时将HTTP请求报文作为报文数据部分发送到服务器
这样的一次请求要花费的时间为“两倍的RTT时间 + 页面文档传输完成所需时间”
当有多个HTTP请求向HTTP服务器请求页面时,都要和服务器反复的建立和断开连接,这就需要服务器反复地分配和释放缓存和变量,这会增大服务器的负担。将这种每请求一次页面就需要建立一次连接的情况称为非持续连接,这是早期比较多使用的HTTP1.0的做法
这种非持续连接的做法也导致了每次访问页面对象的时间花销都为2倍的RTT
后续出现的HTTP1.1采用了持续连接,也就是当浏览器和服务器建立了一个TCP连接后,在一段时间内不会断开连接,当浏览器需要访问多个存在于同一个服务器的页面,就可以通过同一条连接访问
而持续连接在工作时又分为非流水线方式和流水线方式
非流水线方式是指当浏览器发送了一个HTTP请求后,必须要等到浏览器收到响应之后才能发送下一个请求,这就导致了在等待响应的过程中TCP连接处于空闲状态,这样就浪费了服务器资源。但相比非持续连接,这样的工作方式在访问页面对象时节省了一个RTT时间
流式线方式是指浏览器收到响应之前就可以接着发送新的请求,这就使得请求可以一个接着一个的发送到服务器,而服务器可以连续地返回响应报文,这就减少了TCP连接空闲的时间,提高了下载文档的效率。如果浏览器要访问完服务器的所有对象,只需要一个RTT时间