HTTP协议基础
来源:互联网 发布:js导出excel兼容ie 编辑:程序博客网 时间:2024/06/01 09:12
概述
HTTP协议全称为超文本传输协议(HyperText Transfer Protocol),它使得网络上的Web浏览器、服务器和相关的Web应用程序之间的通信成为可能。HTTP是现代全球因特网中使用的公共语言。
上图是表示了Web客户端和服务器通信的大致过程。客户端对HTTP发送一个获取资源的请求,服务器端返回该资源给客户端,并且附加一些额外信息,这有利于客户端采取合理的方式解析资源。在这一过程中,有几个问题需要考虑:
- 寻址:客户端是如何知道资源在哪个服务器的哪个存储区间的?
- 协议:客户端和服务器端是如何相互识别对方的信息的?
- 数据:数据是放在什么地方以什么方式传送的?
- 连接:客户端和服务器端之间是如何进行数据传输的?
以下内容分别对这几个问题进行探讨。
资源
这一部分回答第一个问题。
HTTP被称为因特网的多媒体信使。它可以传输图片、HTML页面、文本文件、MPEG电影、WAV音频文件等各种各样的资源。这些资源存储在服务器中,它们被某个唯一的记号标记,从而被全世界各地的客户端访问而不会发生错乱。这种唯一的标记方式就是URI。
URI
URI的全称为统一资源标识符(Uniform Resource Identifier),也就是说用来为网络资源标识某个唯一性的东西。标识的方式可以采取多种多样,URI主要采取两种,URL和URN,前者通过地址标识,后者通过名字标识。
URL
在现在的网络环境中,基本上可以说URL就是URI。URL全称为统一资源定位符。它可以明确说明如何从一个精确、固定的位置获取资源。
URL语法
大多数URL方案的URL语法都建立在如下9部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
其中最终的3个部分为scheme(方案),host(主机),path(路径)。下表对各个组件进行了总结。
其中要特别说明的是参数和片段部分。
参数
参数为应用程序提供了访问资源所需的所有附加信息。HTTP URL的路径组件可以分成若干路径段。每段都可以有自己的参数。比如:
http://www.joes-hardware.com//hammers;sale=false/index.html;graphics=true
这个例子有两个路径段,hamaers和index.html。hammers路径段有参数sale,其值为false。index.html段有参数graphics,其值为true。
片段
片段是对资源级的再一次划分,使得我们在浏览如大型文本文档时可以分章节浏览。HTTP服务器通常处理整个对象,客户端不能将片段传送给服务器。浏览器从服务器获得了整个资源之后,会根据片段来显示你感兴趣的那部分资源。比如有下面URL:
http://www.joes-hardware.com/tools.html#drills
浏览器浏览该网页的过程如下图所示:
绝对URL和相对URL
上面的例子都是绝对URL,它们指定了一个完整的URL,根据这个URL就可以找到地址。相对URL只给出一个相对路径,然后根据再和基础URL的推导进行拼接组成。
例如,有资源名为./hammers.html,其基础URL为:
http://www.joes-hardware.com/tools.html
那么可以用这个URL作为基础,推导出其方案和主机名,然后拼接为一个新的绝对URL
http://www.joes-hardware.com/hammers.html
URN
URN是统一资源名(uniform resource name)的缩写,它使用资源名而不是位置来标记,因此无论资源移到何处,都能追踪到。只是现在还没怎么投入使用,或许将来发展的方向。因此,基本上我们所提到的URI也就等于URL,URL也就是URI。
报文
该部分回答了第二和第三个问题。
URL帮我们标识了某个资源的位置,使我们的通信有了目的地。然而就像打电话一样,双方必须基于都能理解的语言,否则便鸡同鸭讲了。HTTP协议的做法与此类似,它定义了一系列双方都能理解的格式,使得客户端和服务器的通信成为可能。这些格式体现在报文中。可以这样理解报文,它包括了双方传递的内容,以及对此内容的语法说明。比如一个说英语的和说中文的不能进行通信,但如果双方都有一部实时翻译的字典就可能了。HTTP的报文于此类似:
报文内容
报文只有请求报文和响应报文两种。请求报文从客户端流向服务器,响应报文从服务器流向客户端。两种报文都由三部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header)块,以及可选的、包含数据的主体(body)部分。
而请求报文与响应报文之间又有所不同,下图是它们的结构对比:
注:由上图可知,起始行的各组件之间以空格分离。首部字段最后以一个空行与主体部分分隔。即使在没有主体部分的情况下,也需要空行。
下面分别对报文的各组件进行阐述。
起始行
请求报文和响应报文的起始行有所不同,下面先介绍二者不同之处,由于二者都拥有HTTP版本号,因此放在统一说明。
请求行
请求报文的起始行被称为请求行。请求行包含请求方法、请求URL以及HTTP版本号。这三个部分之间以空格分隔。
方法(method)
方法用来告知服务器要做些什么。我们比较通用的就是GET和POST方法了。下表描述了现在常用的7种方法。
注:POST和PUT容易造成混淆,POST是用来向服务器发送数据,比如发送账号和密码到服务器。而PUT则是用于向服务器上的资源中存储数据。
请求URL
请求URL可以是绝对的URL,也可以是相对的URL(注:这样得在首部字段的Host字段指定主机名,之后详细解释)。
响应行
响应报文的起始行叫做响应行。它包含了HTTP版本号、状态码和原因语句。
状态码
状态码用来告诉客户端,发生了什么事情。客户端向服务器端发送请求时,由可能成功,也有可能失败,还有可能资源被移动了。状态码就是用来告诉客户端程序,发生了什么事情。
下表列出了状态码的分类:
常见的状态码比如200表示成功、401表示未授权需要输入账号和密码、404表示没有找到URL对应的资源。
另外,也可以自定义扩展状态码,虽然HTTP没有定义,但当我们收到一个515的状态码时,我们可以立马发现这是服务器错误了,然后将之作为服务器错误的普通成员进行处理。
原因语句
原因语句紧随状态码的后面,状态码供程序解析,原因语句供人们阅读。比如200的原因语句是OK,404的原因语句是Not Found。这也告诉我们不要死记硬背状态码,记住大概范围,碰到的时候读原因语句和查阅相关资料即可。
版本号
HTTP版本号是请求行和响应行共同拥有的。旨在告诉对方,我的协议版本是什么,以便了解对方发的能力和报文格式。在与HTTP1.1的应用程序进行通信的HTTP1.2应用程序应该知道,它不能使用任何新的1.2特性,因为使用老版本协议的应用程序很可能无法实现这些特性。
首部字段
HTTP首部字段向请求报文和响应报文中添加了一些附加信息,从而可以使双方更好的理解对方的意图。首部以名/值对的形式出现,各首部字段之间以换行(CRLF,换行与回车)分隔。不考虑自定义扩展的话,首部字段大概可以分为如下四类:
首部的字段是繁多的,想要完全即很难也无必要,记住首部的分类的框架可能更有益处。下面的思维图展示了首部分类。之后详细论述了各首部:
通用首部
通用首部在请求报文和响应报文中都能使用。通用首部又可分为通用的信息性首部和通用缓存首部。
下表列出了通用的信息性首部:
下表列出了通用的缓存首部:
请求首部
请求首部是旨在请求报文中有意义的部分,服务器可以根据请求首部给出的客户端信息,试着为客户端提供更好的响应。比如,服务器端可以根据客户端是PC端还是移动端返回不同格式的HTML文档,从而使用户获得更好的阅读体验。请求首部大概可以分为如下四类,请求的通用性首部、Accept首部、条件请求首部和安全请求首部。由于条目众多,下面各表只列出了主要的首部,如有兴趣请查阅《HTTP权威指南》第72页。
下表为请求的信息性首部
下表为Accept首部
下表为条件请求首部
下表为安全请求首部
响应首部
响应首部分为三部分,信息性首部、协商首部和安全响应首部。
下表为常用的响应的信息性首部:
下表为协商首部:
安全响应首部:
实体首部
实体首部列出了大量关于传输主体(body)的信息。可分为三部分信息性首部、内容首部、缓存首部。
下表为实体的信息性首部:
下表为内容首部:
下表为实体缓存首部:
主体
主体放在HTTP报文的第三个部分。它是HTTP报文的负荷,是HTTP要传输的内容。
TCP连接
到目前为止,我们已经知道如何标识服务器端的资源(URL),也知道了,服务器和客户端是如何识别对方的信息(报文)。然而,虽然目的地和消息都有了,如果没有运输工具将消息运往目的地,那也是枉然。
HTTP报文是利用TCP协议来运输的。HTTP协议栈的如下图所示:
从图中可以看出,HTTP是位于TCP之上的协议。
分段传送
TCP协议是用来传输数据的,它首先会把HTTP报文中的数据划分为一块一块的小数据块,然后为各小数据块添加上端口号、数据排序等信息。TCP将数据交给IP端的时候,IP端为数据块添加源和目的地的IP地址、长度等信息。因此,TCP和IP层共同决定了连接的正确运行。TCP连接主要由下面四个值确定:
<源IP地址、源端口号、目的IP地址、目的端口号>
下图表示了,客户端发送一条请求到服务器接收的简单过程。服务器的响应与此类似,只是方向相反而已。
优化
通常情况下,HTTP的每一次请求和响应都会进行一次TCP/IP连接。通常有三种方式可以优化TCP/IP连接。
- 并行连接:通过多条TCP连接发起并发的HTTP请求。
- 持久连接:重用TCP连接,以消除连接及关闭时延。
- 管道化连接:通过共享的TCP连接发起并发的HTTP请求。
总结
本篇文章可以看做是对《HTTP权威指南》前四章的笔记。总得来说该部分详细解释了HTTP的基础。是一本值得阅读的书籍。
- HTTP协议基础
- HTTP 协议基础
- HTTP协议基础
- HTTP协议基础
- http协议基础
- HTTP协议基础
- HTTP协议基础
- HTTP 协议基础
- HTTP协议基础
- HTTP协议基础(2)
- HTTP协议基础
- HTTP协议基础
- HTTP协议基础
- HTTP协议基础
- HTTP协议基础
- HTTP协议基础
- HTTP协议基础
- HTTP协议基础
- .gen格式文件读取,完成兰伯特和墨卡托投影转换
- git学习
- 如何实现图片懒加载
- SpringMVC学习之控制器—MultiActionController
- 关于读取手机联系人应该用的Uri
- HTTP协议基础
- 数据预处理备忘
- 吴恩达深度学习课程笔记
- 计算球体积
- 调整数组顺序使奇数位于偶数前面(代码的完整性)
- BZOJ 4102 [Usaco2015 Open] 图上DP 解题报告
- 常见端口占用情况汇总(持续更新)
- 实验三 栈的基本操作
- 第二次作业!