园里已经有很多关于HTTP的好文章了。HTTP的一些细节介绍的很好,所以本文就不深究HTTP的细节了,而是从一个足够高、更结构化的角度对HTTP协议的要素进行分类和解释。
HTTP的定义和历史在网络中。数据传输需要面对三个问题:
1.客户端如何知道所请求内容的位置?
2.当客户端知道所请求内容的位置时,它如何获取所请求的内容呢?
3.请求的内容是以什么形式组织的,以便被客户识别?
对于WEB,使用了三种不同的技术来回答以上三个问题,分别是:统一资源定位符(URIs)、超文本传输协议(HTTP)和超文本标记语言(HTML)。大多数WEB开发人员都非常熟悉URI和HTML。然而,HTTP协议在许多WEB技术中被封装得太多,这使得HTTP最不为人所熟悉。
作为一种传输协议,HTTP已经像HTML和流行的HTTP1一样随着时间的推移而发展。1是HTTP协议的第三个版本。
HTTP0.9
HTTP0。9是HTTP协议的第一个版本。很弱。该请求只有一行,例如:
GET www.cnblogs.com从这么简单的请求体,没有POST方法,没有HTTP头,就可以看出那个年代的HTTP客户端只能接收一种类型:纯文本。而且,如果得不到需要的信息,也不会出现404500之类的错误。
虽然HTTP0。9看起来那么弱,已经可以满足那个时代的需求了。
HTTP1.0
随着1996年以后对WEB程序的需求,HTTP 0。9已经不能满足需求。HTTP1最大的变化。0是POST方法的引入,使得客户端通过HTML表单向服务器发送数据成为可能,这也是WEB应用的一个基础。另一个很大的变化是引入了HTTP头,使得HTTP不仅仅返回错误码,HTTP协议传输的内容也不局限于纯文本,还可以是图片、动画等一系列格式。
另外还允许保持连接,即一次TCP连接后,可以多次通信,虽然HTTP1.0默认传输一次数据后关闭。
HTTP1.1
2000年5月,HTTP1。1成立。HTTP1。1不如HTTP1具有革命性。HTTP0为0。9.但是也有很多增强。
首先添加主机头,比如访问我的博客:
GET /Careyson HTTP/1.1 Host: www.cnblogs.comGet后只需要相对路径。虽然看起来只是语法糖的感觉,但实际上这种推广让Web上的一个主机拥有多个域成为可能。否则多个域名指向同一个IP会造成混淆。
另外引入了Range头,使得客户端通过HTTP只下载一部分内容,使得多线程下载成为可能。
另外值得一提的是,始终保持HTTP1.1默认连接。我将在下面详细阐述这个概念。
HTTP的网络层次在互联网中,所有的传输都是通过TCP/IP进行的。HTTP协议作为TCP/IP模型中的应用层协议,也不例外。HTTP在网络中的层次结构如图1所示。
1.1的层次结构。TCP/IP中的HTTP
可以看出,HTTP是基于传输层的TCP协议,而TCP是面向端到端连接的协议。所谓端到端,可以理解为进程之间的通信。所以在HTTP开始传输之前,需要先建立TCP连接,TCP连接的过程需要所谓的“三次握手”。如概念2所示。
图二。2的三次握手。TCP连接
TCP三次握手后,建立一个TCP连接,然后可以传输HTTP。一个重要的概念是面向连接的,即HTTP不开放传输完成之间的TCP连接。在HTTP1中。1(由连接头设置)这是默认行为。所谓的HTTP传输完成。我们来举一个具体的例子。
比如访问我的博客,用Fiddler拦截相应的请求和响应。如图3所示。
图3。用fiddler抓取请求和相应的
以上19个HTTP请求只依赖一个TCP连接,称为持久连接。它也被称为HTTP请求的完成。
HTTP请求(HTTPRequest)所谓HTTP请求,就是Web客户端向Web服务器发送信息。该信息由以下三部分组成:
1.请求行
2.HTTP标头
3.内容
典型的请求行如下:
GET www.cnblogs.com HTTP/1.1请求行的编写是固定的,由三部分组成。第一部分是请求方法,第二部分是请求URL,第三部分是HTTP版本。
HTTP请求中HTTP头的第二部分可以是三种HTTP头:1。请求标题;2.通用标题;3.实体标题。
一般来说,因为Get请求通常不包含内容实体,所以不会有实体头。
第三部分只存在于POST请求中,因为GET请求不包含任何实体。
让我们截取一个具体的Post请求来看看这三个部分。我在一个普通的aspx页面上放置了一个按钮,该按钮在提交时会生成一个Post请求,如图4所示。
图4。HTTP请求由三部分组成
HTTP请求方法
虽然我们常见的只有Get和Post方法,但是实际上HTTP请求方法有很多,比如PUT方法、DELETE方法、HEAD方法、CONNECT方法和TRACE方法。这里就不赘述了。Bing一个人。
在这里,我们把重点放在Get和Post方法上。Get和Post的区别在互联网上满天飞。但是许多人没有抓住要点。Get和Post最大的区别就是Post有上面提到的第三部分:内容。Get没有这个内容。因此,正如Get和Post的名称所示,Get用于从服务器获取内容。虽然可以通过QueryString向服务器发送信息,但这违背了Get的初衷。QueryString中的信息只是一个参数,用于在HTTP的视图中获取获取的内容。Post是从客户端向服务器发送内容的方式。所以就有了第三部分的要求:内容。
HTTP响应(HTTPResponse)Web服务器收到HTTP请求时,会根据请求的信息做一些处理(这些处理可能只是静态的返回页面,也可能包括Asp.net、PHP、Jsp等语言进行处理和返回),并相应返回一个HTTP响应。HTTP响应在结构上与HTTP请求非常相似,它也由三部分组成,即:
1.状态行
2.HTTP标头
3.返回内容
首先看状态线。典型的HTTP状态如下:
HTTP/1.1 200 OK第一部分是HTTP版本,第二部分是响应状态码,第三部分是状态码的描述,所以第二部分和第三部分也可以看作一个部分。
HTTP版本没什么好说的,但是状态码值得一说。对于每一个具体的HTTP状态码的含义,互联网上都有解释。这里我就说说分类。
HTTP响应内容的第三部分是HTTP请求所请求的信息。这些信息可以是HTML或图片。比如我访问百度,HTTP响应如图5所示。
图5。典型的HTTP响应
图5中的响应是一个HTML,但是它也可以是其他类型,比如图片,如图6所示。
图6。HTTP响应内容是一张图。
这里会有一个问题。既然HTTP响应的内容不仅仅是HTML,还有其他类型,那么浏览器如何正确处理接收到的信息?
这是由媒体类型(MediaType)决定的,具体对应Content-Type的HTTP头,比如图5中的text/html和图6中的image/jpeg。
媒体类型的格式为:大类/小类。例如,图5中的html是一个小的类别,而文本是一个大的类别。
IANA(互联网数字地址分配机构)定义了八种主要的媒体类型,即:
我们可以在fiddler中捕捉到的相应信息如图7所示。
图7。HTTP标头
不难看出,HTTP头并不是严格要求的,只是一个标签。如果浏览器可以解析,就会按照一定的标准(比如浏览器自己的标准,W3C的标准)进行解释,否则如果不知道其他头,就会被浏览器忽略。服务器也是如此。如果你写一个浏览器,你可以把上面的标题解释成你想要的任何效果。
下面提到的HTTP头都是W3C标准的头,我就不细说每个头的作用了。网上有很多关于HTTP头功能的文章,请自行Bing。HTTP头根据其功能的不同可以分为四类。
通用标题
通用标头可以包含在HTTP请求或HTTP响应中。通用报头的目的是描述HTTP协议本身。比如描述HTTP是否永久连接的Connection头,HTTP发送日期的Date头,描述HTTP所在的TCP连接时间的Keep-Alive头,用于缓存控制的Cache-Control头。
实体标题
实体是描述HTTP信息的实体。它可以同时出现在HTTP POST方法的请求和HTTP响应中。例如,图5和图6中的Content-Type和Content-length是描述实体的类型和大小的头,两者都属于实体头。还有其他用于描述实体的内容语言、内容MD5、内容编码,以及控制实体缓存的过期和最后修改。
请求标头
头是客户端发送给服务器的,以帮助服务器更好地满足客户端的请求。请求头只能出现在HTTP请求中。例如,告知服务器仅接收特定响应内容的Accept标头、发送Cookie的Cookie标头、显示请求主机的域的HOST标头、用于缓存的If-Match、If-Match-Since、If-None-Match标头、仅包含HTTP响应信息中的部分信息的Range标头,以及用于附加HTML相关请求的Referer标头。
http响应头
HTTP响应头是那些描述HTTP响应本身的头,不包含描述HTTP响应第三部分的头,也就是HTTP信息(这部分由实体头负责)。例如,定期刷新的Refresh标头、遇到503服务不可用时自动重试的Retry-After标头、显示服务器信息的Server标头、设置COOKIE的set-COOKIE标头以及告知客户端可以部分请求的Accept-Ranges标头。
状态保持另外值得注意的是,HTTP协议是无状态的,也就是说接收HTTP请求的服务器不知道每个请求是来自同一个客户端还是不同的客户端,每个请求对于服务器来说都是一样的。因此,需要一些额外的方法来使服务器在收到请求时知道请求来自客户端。如图8所示。
图8。服务器不知道请求1和请求2来自同一个客户端。
通过Cookies保持状态
为了解决这个问题,HTTP协议通过Cookies保持其状态。对于图8中的请求,如果Cookies用于状态控制,它将如图9所示。
图9。通过Cookies,服务器可以清楚地知道请求2和请求1来自同一个客户端。
通过表单变量保持状态
除了Cookies,还可以使用表单变量来保存状态。例如,Asp.net通过一个名为ViewStateinput="hidden"的框来保存状态,例如:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMjA0OTM4MTAwNGRkXUfhlDv1Cs7/qhBlyZROCzlvf5U=" />这个原理类似于Cookies,只是附加到每个请求和响应的信息变成了一个表单变量。
通过QueryString保持状态
这个原理与上述两种状态保持方法相同。QueryString通过将信息保存在所请求地址的末尾来向服务器发送信息,它通常与表单结合使用。典型的QueryString如下所示:
www.xxx.com/xxx.aspx?var1=value&var2=value2 总结本文从更高的角度来看HTTP协议。它没有深入挖掘HTTP协议的细节,但是对HTTP框架有一个系统的介绍。关于HTTP的更多细节,请去Bing或者看相关书籍:-)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)