HTTP 协议
- Web客户端和服务器是如何通信的
- Web页面的资源来自何方
- Web事务是怎样工作的
- HTTP通信所使用的报文格式
- 底层TCP网络传输
- 不同的HTTP协议变体
HTTP是什么?
超文本传输安全协议, Web客户端和服务器是通过HTTP相互通信的,也需要遵守HTTP的规则。
简单的说,常见的客户端就是Web浏览器,我们在地址栏输入网址,点击Enter的动作就是向这个网址所在的服务器发起请求,来获取这个网页上的资源。服务器接收到这个请求后,根据请求的内容,发送相应的资源文件给到客户端,于是我就可以在浏览器上查看这个网站的内容了。
一般我们说网址都是说URL,第一次看到URI这个概念的时候有点发懵。URI: Uniform Resource Identifier,统一资源标识符。URI有2中形式,一种是URL,另外一种是URN。
URL的格式:http://superchilli.github.io/blog
http代表访问资源所使用的协议类型,通常就是HTTP协议。
superchilli.github.io 代表这个网站的地址。
/blog 代表了具体资源所在的位置。
现在,几乎所有的URI都是URL。
URN是作为特点内容的唯一名称使用的,与资源所在的位置无关。
事务:
一个HTTP事务由一条从客户端发往服务器的请求命令和一个从服务器发挥客户端的响应结果组成。
这种通讯是通过名为HTTP报文的格式化数据块进行的。
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法。每条HTTP请求报文都包含一个方法,这个方法会告诉服务器要执行什么动作。
5种常见的HTTP方法:
- GET 从服务器向客户端发送命名资源
- PUT 将来自客户端的数据存储到一个命名的服务器资源中去
- DELETE 从服务器中删除命名资源
- POST 将客户端数据发送到一个服务器网关应用程序
- HEAD 仅发送命名资源相应中的HTTP首部
状态码:每条HTTP相应报文返回时都会携带一个状态码,状态码是一个三位数字的代码。告知客户端请求是否成功,或者是否需要采取其他动作。
HTTP报文都是纯文本,由一行一行的字符串组成。
HTTP报文由三部分组成:起始行,首部字段,主体。
HTTP是一个应用协议层,无需操心网络通信的具体细节,而是交给TCP/IP协议。
TCP提供了:
- 无差错的数据传输;
- 按需传输(数据总是会按照发送的顺序到达);
- 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)。
只要建立了TCP链接,客户端和服务器之间的报文交换就不会丢失,不会破坏,也不会在接收时出现错序了。
在HTTP客户端向服务器发送报文之前,需要用IP地址和端口号在客户端和付钱之间建立一条TCP/IP连接。
在TCP中,需要知道服务器的IP地址以及在服务器上允许的特定软件的相关TCP端口号。服务器的IP地址和端口号是依靠URL获取的。HTTP的URL中没有端口号时,可以假设默认端口号是80。
具体的步骤:
- 浏览器从URL中解析出服务器的主机名
- 浏览器将服务器的主机名转换成服务器的IP地址
- 浏览器将端口号从URL中解析出来
- 浏览器建立一条与Web服务器的TCP连接
- 浏览器向服务器发送一条HTTP请求报文
- 服务器向浏览器回送一条HTTP响应报文
- 关闭连接,浏览器显示文档
协议版本
HTTP/0.9
HTTP的1991原型版本称为HTTP/0.9。这个协议有很多严重的设计缺陷,只应该用于与老客户端的交互。HTTP/0.9只支持GET方法,不支持多媒体内容的MIME类型、各种HTTP首部或者版本号。
HTTP/1.0
1.0是第一个得到广泛使用的HTTP版本。HTTP/1.0添加了版本号,各种HTTP首部,一些额外的方法,以及对多媒体对象的处理。
HTTP/1.0+
在20世纪90年代中叶,很多流行的Web客户端和服务器都在飞快的向HTTP中添加各种特性,以满足需要。这种非正式的HTTP扩展版本通常称为HTTP/1.0+
HTTP/1.1
HTTP/1.1重点关注的是校正HTTP设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性。HTTP/1.1是当前使用的HTTP版本。
HTTP-NG(又名HTTP/2.0)
HTTP-NG是HTTP/1.1后继结构的原型建议,它重点关注的是性能的大幅优化,以及更强大的服务器逻辑远程执行框架。
Web的结构组件
代理:位于客户端和服务器之间的HTTP中间实体。接收所有客户端的HTTP请求,并将这些请求转发给服务器。
缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。客户端从附近的缓存下载文档会比从远程Web服务器下载快得多。
网关:连接其他应用程序的特殊Web服务器。
隧道:对HTTP通信报文进行盲转发的特殊代理。
Agent代理:发起自动HTTP请求的半智能Web客户端。
状态码
- 100-199 信息提示
- 200-299 成功
- 300-399 重定向
- 400-499 客户端错误
- 500-599 服务器错误
HTTP请求格式:<method> <request-URL> <version>
<headers>
<entity-body>
HTTP相应格式:<version> <status> <reason-phrase>
<headers>
<entity-body>