Http概述
HTTP使用的是可靠的传输协议,即使数据是来自地球的另一端,它也能够确保数据在传输的过程中不会被损坏或者产生混乱。
Web客户端和服务器
Web的内容都是存储在Web服务器上的。Web服务器所使用的是HTTP协议,因此经常会被称为HTTP服务器。
Web服务器和客户端
资源
Web服务器是资源的宿主,Web资源是Web内容的源头。最简单的Web资源就是文件系统中的静态资源。这些文件可以包含任何内容:文本文件、Word文件、JPEG图片文件,AVI电影文件等。
但资源不一定是静态的。资源还可以是根据需要生成内容的软件程序。这些动态的资源内容可以根据你的身份、所请求的信息或每天的不同时间段来产生内容。
web服务器和客户端
总之,所有类型的内容来源都是资源。
媒体类型
因特网上有数千种不同的数据类型,HTTP仔细给每种要通过Web传输的对象都打上了MIME类型(MIME type)的数据格式标签。最初设计的MIME(Multipurpose Internet Mail Extension,多用途因特网扩展)是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。MIME在电子邮件中工作的非常好,因此HTTP协议也采纳了它,用它来描述并标记多媒体内容。
Web服务器会为所有的HTTP对象数据附加一个MIME类型。当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型。大多数的浏览器都可以处理数百种的对象类型:显示图片,解析并格式化HTML文件,播放音乐或视频等。
与数据内容一同返回的MIME
MIME类型是一个文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠和分隔。如果有可选参数的话,则以分号开始,
- HTML格式的文本文档有
text/html
类型来标记。 - 普通的ASCII文本文档由
text/plain
类型来标记。 - JPEG格式的图片为
image/jpeg
类型。 - GIF格式的图片为
image/gif
类型。
在HTTP中,MIME媒体类型被广泛用于Content-Type和Accept字段中,下面的是几个小例子:
content-type:text/css; charset=utf-8
accept:application/json, text/javascript, /; q=0.01
常见的MIME类型如下:
类型 | 说明 |
---|---|
text/html | HTML格式的文件 |
text/plain | 纯文本格式的 |
text/xml | XML格式 |
image/gif | gif格式的图片 |
image/jpeg | jpg格式的图片 |
image/png | png格式的图片 |
application/xml | XML格式的数据 |
application/json | JSON格式的数据 |
application/pdf | pdf格式的数据 |
application/mcword | Word文档格式 |
application/octet-stream | 二进制流数据 |
application/x-www-form-urlencoded | <form encType="">中默认的encType, 普通表单上传 |
multipart/form-data | 表单上传文件 |
application/stream+json | stream类型的json |
text/markdown | markdown格式的文件 |
URI
每一个Web服务器资源都有一个自己的名字,这样就可以唯一确定一个资源了。服务器资源名被称为统一资源标识符(Uniform Resource Identifier, URI)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。
URI有两种形式,分别为URL和URN。
URL
统一资源定位符(URL)是资源标识符最常见的形式。URL描述了一台特定服务器上某个资源的位置。URL可以明确的说明一个资源所在的精确的位置。
URL实例
URL | 描述 |
---|---|
https://www.baidu.com/index.html |
百度首页 |
https://www.baidu.com/img/bd_logo1.png |
百度的logo |
大部分的URL都遵循一种标准的格式,这种格式包含三部分。
- URL的第一部分被称为方案(scheme),说明了访问资源所使用的协议类型。这种协议通常就是HTTP协议(http://),或者HTTPS协议(https://),或者FTP协议(ftp://)等。
- 第二部分给出了服务器的因特网地址(例如,www.baidu.com)。
- 其余部分指定了Web服务器上的某个资源(例如,index.html)。
现在,基本上所有的URI都是URL。
URN
URI的第二种形式就是统一资源名(URN)。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与位置无关的URN,就可以将资源四处搬移。通过URN,还可以用一个名字通过多种网络协议来访问资源。
URN目前处于实验阶段,没有大规模使用。
关于URI、URL、和URN的理解。
URI是统一资源标识符,这里只是说标识,并没有说如何标识。而URL说明是使用一个唯一的一个地址去定位资源,而URN是使用一个唯一的名字取标识资源。可以说URI只是一个接口,而URL和URN是URI的两个不同实现。
事务
一个HTTP事务有一条(从客户端发往服务器的)请求和一个(从服务器发回客户端的)响应组成。这种通信是通过名为HTTP报文(HTTP message)的格式化数据块进行的,如下图所示:
包含命令和URI的HTTP请求报文
方法
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法。这个方法都会告诉服务器要执行什么动作(获取一个Web页面、运行一个网关程序、删除一个文件等。)下表中给出了五种常见的HTTP方法。
HTTP方法 | 描述 |
---|---|
GET | 从服务器向客户端发送命名资源 |
PUT | 将客户端的数据存储到一个命名的服务器资源上去 |
DELETE | 从服务器中删除命名资源 |
POST | 将客户端数据发送到一个服务器网关应用程序 |
HEAD | 仅发送命名资源影响中的HTTP资源 |
状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否采用其他动作。
HTTP状态码 | 描述 |
---|---|
200 | OK。正确返回 |
302 | Redirect(重定向)。到其他地方获取资源 |
404 | Not Found(没找到)。无法找到这个资源 |
伴随着每一个数字状态码,HTTP还会发送一条解释性的“原因短句”。包含文本短语主要是为了进行描述。所有的处理过程使用的都是数据码。
HTTP软件处理下列状态码和原因短语的方式是一样的。
200 OK
200 Document attached
200 Success
200 All's cool, dude
Web页面中可以包含多个对象
应用程序完成一项任务时通常可能会发布多个HTTP事务。比如,Web浏览器会发布一系列HTTP事务来获取一个包含了丰富图片的Web页面。浏览器会执行一个事务来会去描述页面布局的HTML“框架”,然后发布另外一个HTTP事务来获取每一个嵌入图片、图像面板等。这些嵌入的资源甚至可能位于不同的服务器上,因此,一个Web页面通常并不是单个资源,而是一组资源的集合。
复合Web页面要为每一个嵌入式资源使用一个单独的HTTP事务
报文
HTTP报文是有一行一行的简单字符组成的。HTTP报文都是纯文本,不是二进制代码。下图显示了一次简单请求所使用的HTTP报文。
有一行一行的简单文本组成的HTTP报文
从Web客户端发往Web服务器的HTTP报文称为请求报文(request message)。从服务器发往客服端的报文称为响应报文(response message),此外没有其他类型的HTTP报文。HTTP的请求和响应报文的格式很类似。
HTTP 报文包括以下三个部分。
- 起始行
报文的第一行就是起始行,在响应报文中说明出现了什么情况。 - 首部字段
起始行后面有零个或多个首部字段。每一个首部字段都包含一个名字和一个值,为了便于解析,两者之间使用冒号(:)来分隔。首部以一个空行结束,添加一个首部字段和添加一个新行一样简单。 - 主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包含了要发送给Web服务器的数据,响应主体中装载了要返回给客户端的数据。起始地址和首部都是文本形式且都是结构化的,而主体不同,主体中可以包含任意的二进制数据(比如图片,视频,音频等)。当然,主体中也可以包含文本。
连接
TCP/IP
HTTP是个应用层协议。HTTP无需关心网络通信的细节,他把联网的细节都交给了通用,可靠的因特网传输层协议TCP/IP。
TCP提供了:
- 无差错的数据传输
- 按序传输(数据总是按照发送的顺序到达)
- 未分段的数据流(可以在任意时刻以任意的尺寸将数据发送出去)
只要建立了TCP连接,客户端和服务器之间的报文就不会丢失、不会被破坏,也不会在接收的时候出现错序了。
用网络术语来说,HTTP协议位于TCP的上层。HTTP使用TCP来传输其报文数据。
HTTP协议栈
连接、IP地址及端口号
在HTTP客户端向服务器发送报文之前,需要用网络协议(Internet Protocol, IP)地址和端口号和服务器之间建立一条TCP/IP连接。
在TCP中,你需要知道服务器的IP地址,以及与服务器上运行的特定软件的TCP端口号。
在HTTP中可以使用URL获得IP地址和端口号。
在HTTP中默认的端口号是80,除了80之外,其他的端口号都必须手动指定。
Web的结构组件
-
代理
位于客户端和服务器之间的HTTP中间实体。 -
缓存
HTTP的仓库,常使用页面的副本可以保存在离客户端更近的地方。 -
网关
连接其他应用程序的特殊服务器。
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己的资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档。得到的文档会被封装诚一条HTTP报文,发送给客户端。
HTTP/FTP网关 -
隧道
对HTTP通信报文进行盲转发的特殊代理。 -
Agent 代理
发起自动HTTP请求的半智能Web客户端。
网友评论