目录
HTTP概况
Web术语
HTTP基本
HTTP是无状态协议
HTTP连接方式
非持续连接HTTP
例子
花费时间
持续连接的HTTP
非持续的缺点;
HTTP报文格式
请求报文
HTTP请求报文的通用格式 及GET、POST、HEAD等常用方法
HTTP响应报文格式
HTTP响应报文通用格式及状态码
HTTP概况 Web的应用层协议是超文本传输协议,它是Web的核心,在[RFC 1945]和[RFC 2616]中进行了定义。HTTP有两个程序实现:客户端——服务端;客户程序和服务器程序运行不同的端系统中,通过交替HTTP报文进行会话,HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式,所以了解HTTP之前,先了解Web术语。
Web术语 Web页面(也叫文档)是由对象组成的。一个对象只是一个文件,例如HTML文件、JPEG图形、Java小程序等;他们可通过URL地址寻址。
例如:一个Web页面含有HTML文本和5个JPEG图形,那么这个Web页面有六个对象:一个HTML基本文件加五个图形。HTML基本文件通过对象的URL地址引用页面中的其他对象。
每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名,如图:;
文章图片
Web浏览器实现了HTTP的客户端,所以Web环境中我们经常交替使用“浏览器”和“客户”这两个术语。Web服务器实现了HTTP的服务器端,它用于存储Web对象,每个对象由URL寻址。流行的Web服务器由Apache和Microsoft Ineternet Information Server(微软互联网信息服务器)
HTTP基本 HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面方式。当用户请求一个Web页面(如点第一个超链接)时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接收到请求并用包含这些对象的HTTP响应报文进行响应,如图;
文章图片
HTTP使用TCP作为它的支撑运输协议(而不是UDP上运行)。HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,浏览器就和服务器进程就可以通过套接字接口访问TCP;
HTTP是无状态协议 服务器向客户发送被请求的文件,而不存储任何关于客户的状态信息。加入某个特定的客户在短短的几秒内两次请求同一个对象,服务器并不会因为刚刚为客户发送该对象就不在作出反应,而是重新发送该对象,就像服务武器已经完全忘记不久之前所做过的事一样。因为HTTP服务器并不保存关于客户的任何信息,所以我们说HTTP是无状态协议。
HTTP连接方式
非持续连接HTTP
例子
假设从服务器向客户端传送了一个Web页面步骤,假设该页面含有一个HTML基本文件和10个JPEG图形,并且这11个对象位于同一台服务器上,进一步假设该HTML文件的URL为:http://www.someSchool.edu/someDepartment/home.index。
- 1)HTTP客户进程在端口号80发起一个到服务器www.someSchool.edu的TCP连接,该端口号是HTTP的默认端口。在客户和服务器上分别有一个套接字与该连接相关联。
- 2)HTTP客户经它的套接字向该服务器发送一个HTTP请求报文。请求报文包含了路径名/someDepartment/home.index。
- 3)HTTP服务器进程经它的套接字接受该报文,从其存储器(RAM或磁盘)中检索出对象www.someSchool.edu/someDepartment/home.index,在一个HTTP响应报文中封装对象,并通过套接字向客户端发送相应报文。
- 4)HTTP服务器进程通知TCP断开该TCP连接。(但是直到TCP确认客户已经完整的收到响应报文为止,它才实际中断连接)。
- 5)HTTP客户接收响应报文,TCP连接关闭。该报文指出封装的对象是一个HTML文件,客户从响应报文中提取出该文件,检查该HTML文件,得到对10个JPEG图形的引用。
- 6)对每个引用的JPEG图形对象重复前四个步骤。
- 从上述例子可以看出,每个TCP连接在服务器发送一个对象后关闭,即连接并不会为其他的对象而持续下来。值得注意的是每个TCP连接只传输一个请求报文和一个响应报文,因此在本例中,当用户请求该Web页面时会产生11个TCP连接。
下面简单估算一下从客户请求HTTP基本文件起到该客户收到整个文件为止所花费的时间。
文章图片
定义:往返时间(RTT)RTT包括分组的传播时间、分组在中间路由器的和交换机上的排队时延以及分组处理时延。
如图所示:当用户点击超链接会首先在C-S中建立一个TCP连接;涉及到“三次握手”过程,即C给,S发送一个小的TCP的报文段,S用一个小的TCP报文段进行回应,最后,C向S返回确认。三次握手前两部分所耗费的时间占用一个RTT。完成了三次握手的前两部分后,客户结合三次握手的第三部分(确认)向该TCP连接发送一个HTTP请求报文。一旦该请求报文到达服务器,服务器就在该TCP连接上发送HTML文件。该HTTP请求/响应用去了另一个RTT。因此,粗略的讲,总的响应时间就是两个RTT加上服务器传输HTML文件时间。
持续连接的HTTP 非持续的缺点;
- (1)必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来了严重的负担,因为一台Web服务器可能同时服务于数以百计不同客户的请求。
- (2)每一个对象经受两倍的RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。
HTTP报文格式 请求报文
文章图片
该报文由5行组成,每行由一个回车和换行符结束。最后一行后再附加一个回车换行符。虽然这个特定的报文仅有5行,但一个请求报文能够具有更多的行或者至少为一行。HTTP请求报文的第一行叫作请求行( request line),其后继的行叫作首部行( headerline)。请求行有3个字段:方法字段、URL 字段和HTTP版本字段。方法字段可以取几种不同的值,包括GET、POST、HEAD、PUT和DELETE。绝大部分的HTTP请求报文使用GET方法。当浏览器请求一个对象时,使用GET方法,在URL字段带有请求对象的标识。
- (1)Host: www. someschool. edu指明了对象所在的主机。你也许认为该首部行是不必要的,因为在该主机中已经有一条TCP连接存在了。但是,该首部行提供的信息是Web代理高速缓存所要求的。
- (2)Connection: close 首部行,该浏览器告诉服务器不要麻烦地使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。
- (3)User- agent:首部行用来指明用户代理,即向服务器发送请求的浏览器的类型。这里浏览器类型是Mozilla/5.0,即Firefox浏览器。这个首部行是有用的,因为服务器可以有效地为不同类型的用户代理实际发送相同对象的不同版本。(每个版本都由相同的URL寻址。)
- (4)Accept- language:首部行表示用户想得到该对象的法语版本(如果服务器中有这样的对象的话); 否则,服务器应当发送它的默认版本。Accept- language:首部行仅是HTTP中可用的众多内容协商首部之一。
HTTP请求报文的通用格式 及GET、POST、HEAD等常用方法
文章图片
在首部行(和附加的回车和换行)后有一个“实体体”( entity body)。
- (1)GET:使用GET方法时实体体为空;
- (2)POST:使用POST方法时使用该实体体。当用户提交表单时,HTTP客户常常使用POST方法,例如当用户向搜索引擎提供搜索关键词时。使用POST报文时,用户仍可以向服务器请求一个Web页面,但Web页面的特定内容依赖于用户在表单字段中输人的内容。如果方法字段的值为POST时,则实体体中包含的就是用户在表单字段中输入的值。
- (3)HEAD:HEAD方法类似于GET方法。当服务器收到一个使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象。应用程序开发者常用HEAD方法进行调试跟踪。
- (4)PUT:PUT方法常与Web发行工具联合使用,它允许用户上传对象到指定的Web服务器上指定的路径(目录)。PUT方法也被那些需要向Web服务器上传对象的应用程序使用。
- (5)DELETE:DELETE方法允许用户或者应用程序删除Web服务器上的对象。
HTTP响应报文格式
文章图片
它有三个部分:一个初始状态行(status line),6个首部行(header line),然后是实体体( entity body)。实体体部分是报文的主要部分,即它包含了所请求的对象本身(表示为data data data data data ..。
状态行有3个字段:协议版本字段、状态码和相应状态信息。在这个例子中,状态行指示服务器正在使用HTTP/1.1,并且一切正常(即服务器已经找到并正在发送所请求的对象)。
- (1)Connection: close 首部行告诉客户,发送完报文后将关闭该TCP连接。
- (2)Date: 首部行指示服务器产生并发送该响应报文的日期和时间。值得一提的是,这个时间不是指对象创建或者最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插人响应报文,并发送该响应报文的时间。
- (3)Server: 首部行指示该报文是由一台Apache Web服务器产生的,它类似于HTTP请求报文中的User- agent:首部行。
- (4)Last-Modified:首部行指示了对象创建或者最后修改的日期和时间。Last-Modified:首部行对既可能在本地客户也可能在 网络缓存服务器上的对象缓存来说非常重要。
- (5)Content-Length:首部行指示了被发送对象中的字节数。
- (6)Content- Type:首部行指示了实体体中的对象是HTML文本。(该对象类型应该正式地由Content-Type:首部行而不是用文件扩展名来指示。)
文章图片
下状态码和它们对应的短语。状态码及其相应的短语指示了请求的结果。一些常见的状态码和相关的短语包括:
- 200 OK:请求成功,信息在返回的响应报文中。
- 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文Location:首部行中。客户软件将自动获取新的URL。
- 400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解。
- 404 Not Found: 被请求的文档不在服务器上。
- 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
推荐阅读
- 系统架构|系统架构与5G异构云无线入网关键技术(物联网电子类外文翻译)
- 云计算|Linux 常用网络命令大全
- 知识总结|【杂记】数字签名概述
- 华为网络|跟我一起进入——网络层
- 华为网络|详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
- 计算机网络|【HTTP协议】发展历程
- HTTP(常见的状态码)
- http|超全http面试重点总结
- 论文解读|Free-Form Image Inpainting with Gated Convolution