1.HTTP概述
Web浏览器、服务器和相关的Web应用程序都是通过HTTP相互通信。HTTP是现代全球因特网中使用的公共语言。每天都有数亿JPEG图片、HTML页面、文本文件、MPEG电影、WAV音频文件、java小程序和其他资源在因特网游弋。HTTP可以从全世界的Web服务器上将这些信息迅速、便捷、可靠的传输到Web浏览器上。HTTP使用的是可靠的数据传输协议,它能够确保数据在传输过程中不会被损坏或者产生混乱。对开发容易来说,无需担心HTTP通信会在传输过程中被破坏、复制或者产生畸变。开发人员可以专注于程序特有细节的编写,而不是考虑因特网中存在的一些缺陷和问题。
1.1 资源
1.1.1 URI
每个Web服务器都有一个名字,这样客户端就可以说明它们感兴趣的资源是什么。服务器资源名被统一称为统一资源标识符(Uniform Resource Identifier,URI)。URI有两种形式:分别是URL和URN。
URL
统一资源定位符(URL,Uniform Resource Locator)是资源标识符最常见的形式。大部分URL都遵循一种标准格式,这种格式包含三个部分:
1.URL的第一部分称为方案(scheme),说明访问资源所使用的协议类型。这部分通常是HTTP或者HTTPS(http://)。
2.第二部分给出了服务器的因特网地址(www.joes-hardware.com)。
3.其余部分指定了Web服务器上的某个资源(比如,/specials/saw-blade.gif)。
现在几乎所有的URI都是URL。URL语法:
-
scheme
访问服务器以获取资源时要使用的协议 默认值 无
- user
一些方案访问资源时需要的用户名 默认值 匿名 - password
用户名后面可能要包含密码,中间由冒号分隔 默认值 - host
资源宿主服务器的主机名或点分IP地址 默认值 无 - port
资源宿主服务器正在监听的端口号,很多方案都有默认端口号(HTTP默认端口号为80) 默认值 每个方案特有 - path
服务器上资源的本地名,由一个"/"将其与前面的URL组件分隔开来.路径组件的语法与服务器和方案有关 默认值 无 - params
一些方案会用这个组件指定输入参数. 参数为名/值对. URL中可以包含多个参数字段,它们相互以及与路径的其余部分之间用分号(;)分隔 默认值 无 - query
一些方案会用这个组件传递参数以激活应用程序.查询组件的内容没有通用格式.用符号"?"将其与URL的其余部分分隔开来 默认值 无 - frag
一小片或一部分资源的名字.引用对象时,不会将frag字段传送给服务器。这个字段是在客户端内部使用的.通过字符"#"将其与URL其余部分分隔开来 默认值 无
URN
URI的第二种形式就是URN(统一资源名)。URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关。使用这些与>位置无关的URN,就可以将资源四处搬动。通过URN,还可以用同一个名字通过多种网络访问协议来访问资源。URN仍然处于试验阶段,还未大范围使用。除非特殊说明,否则这里的都是用URL来指定URI。
1.1.2 媒体类型
因特网有很多的数据类型,HTTP给每种要通过Web传输的对象都打上MIME类型(MIME type)的数据格式标签。最初设计MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)是为了解决不同电子邮件系统之家搬移报文时存在的问题。Web服务器会为所有的HTTP对象数据附一个MIME类型。当Web浏览器从服务器取回一个对象时,会去查看相关的MIME类型,看看它是否知道应该如何处理这个对象。大多数浏览器都可以处理上百种常见对象:显示图片、解析并格式化HTML文件、播放音频文件、或者运行外部软件来处理特殊格式数据。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔。
超文本标记语言文本 | .html text/html |
xml文档 | .xml text/xml |
XHTML文档 | .xhtml application/xhtml+xml |
普通文本 | .txt text/plain |
RTF文本 | .rtf application/rtf |
PDF文档 | .pdf application/pdf |
Microsoft Word文件 | .word application/msword |
PNG图像 | .png image/png |
GIF图形 | .gif image/gif |
JPEG图形 | .jpeg,.jpg image/jpeg |
au声音文件 | .au audio/basic |
MIDI音乐文件 | mid,.midi audio/midi,audio/x-midi |
RealAudio音乐文件 | .ra, .ram audio/x-pn-realaudio |
MPEG文件 | .mpg,.mpeg video/mpeg |
AVI文件 | .avi video/x-msvideo |
GZIP文件 | .gz application/x-gzip |
TAR文件 | .tar application/x-tar |
任意的二进制数据 | application/octet-stream |
1.2 事务
一个HTTP事务由一条请求命令和一个响应结果组成。这种通信通过名为HTTP报文(HTTP message)的格式化数据块进行。
1.2.1 方法
HTTP支持几种几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法。这个方法会告诉服务器要执行什么动作(获取一个Web页面、运行一个网关程序、删除一个文件等)。常见的HTTP方法:
GET | 从服务器向客户端发送命名资源 |
PUT | 将来自客户端的数据存储到一个命名的资源服务器中 |
DELETE | 从服务器中删除命名资源 |
POST | 将客户端数据发送到一个服务器网关应用程序 |
HEAD | 仅发送命名资源响应中的HTTP首部 |
1.2.2 状态码
每条HTTP响应报文返回时都会携带一个状态码。状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。常见的HTTP状态码:
200 | OK, 文档正确返回 |
302 | Redirect(重定向)。到其他地方去获取资源 |
404 | Not Found(没找到),无法找到这个资源 |
1.3 报文
- 请求报文:从web客户端发往web服务器的HTTP报文
- 响应报文:从服务器发往客户端的报文
- 报文结构:1)起始行:请求报文中说明要做些什么,响应报文中说明出现了什么情况 2)首部字段:3)主体
A. 请求报文
举例:
请求报文由请求行、请求头、内容实体组成的,注意,每一行的末尾都有回车和换行,在内容实体和请求头之间另有一个空行。其中请求行指定的是请求方法、请求URL、协议版本;请求头是键值对的形式存在的,就是字段名:值;内容实体就是要传输的数据。
B. 响应报文
举例:
响应报文由状态行、响应首部字段(响应头)、响应实体组成,其中第一行是状态行,依次包含HTTP版本,状态码和状态短语组成;在一个回车换行之后是响应头,也是键值对的形式,字段名:值;然后会有一个空行也包含回车换行,之后是响应实体,就是要传输的数据。在上面的例子当中就是一个非常简单的HTML页面。
1.4 连接
- TCP/IP:
TCP提供:1) 无差错的数据传输 2)按序传输(数据总是会按照发送的顺序发送) 3)未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)
HTTP
|
应用层
|
---|---|
TCP | 传输层 |
IP | 网络层 |
网络特有的链路接口 | 数据链路层 |
物理网络硬件 | 物理层 |
- 连接、IP地址及端口号:
步骤:1)浏览器从URL中解析出服务器的主机名
2)浏览器将服务器的主机名转换成服务器的IP地址
3)浏览器将端口号从URL中解析出来
4)浏览器建立一条与Web服务器的TCP连接
5)浏览器向服务器发送一条HTTP请求报文
6)服务器向浏览器会送一条HTTP响应报文
7)关闭连接,浏览器显示文档;
1.5 Web的结构组件
- 代理:代理位于客户端和服务器之间的HTTP中间实体。接收所有客户端的 HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发) 。对用户来说,这些应用程序就是一个代理,代表用户访问服务器。
- 缓存:Web 缓存(Web cache)或代理缓存(proxy cache)是一种特殊的 HTTP 代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程 Web 服务器下载快得多。HTTP 定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。
- 网关:网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将 HTTP 流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
- 隧道:隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP 应用程序。HTTP 隧道通常用来在一条或多条 HTTP 连接上转发非 HTTP 数据,转发时不会窥探数据。HTTP 隧道的一种常见用途是通过 HTTP 连接承载加密的安全套接字层(SSL,Secure Sockets Layer)流量,这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了。如图所示,HTTP/SSL 隧道收到一条 HTTP 请求,要求建立一条到目的地址和端口的输出连接,然后在 HTTP 信道上通过隧道传输加密的 SSL 流量,这样就可以将其盲转发到目的服务器上去了。
- Agent代理:用户 Agent 代理(或者简称为 Agent 代理)是代表用户发起 HTTP 请求的客户端程序。所有发布 Web 请求的应用程序都是 HTTP Agent 代理。HTTP Agent 代理,除了Web 浏览器,还有很多其他类型。抓包找头部信息会发现类似User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36
2.URL与资源
2.1 URL语法
- 方案:使用什么协议,必须以一个字母符号开始,大小写无关。
- 主机与端口:主机组件标识了因特网上能够访问资源的宿主机器。可用主机名或IP地址表示。端口组件标识了服务器正在监听的网络端口。
- 用户名和密码:
- 路径:说明资源位于服务器的什么地方
- 参数:为应用程序提供了访问资源所需的所有附加信息。由字符“;”将其与URL的其余部分(以及各明值对)分隔开来。
- 查询:以一系列“名/值”对的形式出现,名值对之间用字符“&”分割
- 片段:为了引用部分资源或资源的一个片段。片段挂在URL的右手边,最前面有一个字符“#”。服务端处理的是整个对象,浏览器从服务器获得了整个资源后,会根据片段来显示你感兴趣的那部分资源。
2.2 URL快捷方式
- 相对URL:
- 自动扩展URL:1)主机名扩展 2)历史扩展
3.HTTP报文
3.1 报文流
- Http使用术语“流入”和“流出”描述事务处理
3.2 报文的组成部分
报文由三个部分组成:对报文进行描述的起始行、包含属性的首部块,以及可选的、包含数据的主体部分
- 起始行
请求报文的起始行说明了要做些什么,响应报文的起始行说明发生了什么:
1)请求行:包括一个方法、一个请求URL和HTTP的版本
2) 响应行:HTTP版本、数字状态码以及描述操作状态的原因短语
- 首部
- 实体的主体部分
3.3 方法
方法
|
是否安全方法
|
描述
|
是否包含主体
|
备注
|
---|---|---|---|---|
GET | 是 | 从服务器获取一份文档 | 否 | |
HEAD | 是 | 只从服务器获取文档的首部 | 否 | |
POST | 否 | 向服务器发送需要处理的数据 | 是 | |
PUT | 否 | 将请求的主题部分存储在服务器上 | 是 | |
TRACE | 是 | 对可能经过代理服务器传送到服务器上的报文进行追踪 | 否 | 主要用于诊断:用于验证请求是否如愿穿过了请求/响应链 |
OPTIONS | 是 | 决定可以在服务器上执行哪些方法 | 否 | |
DELETE | 否 | 从服务器上删除一份文档 | 否 |
安全方法:表示http请求不会产生什么动作
3.4 状态码
状态码分类:
整体范围
|
已定义范围
|
分类
|
备注
|
---|---|---|---|
100-199 | 100-101 | 信息提示 | |
200-299 | 200-206 | 成功 | |
300-399 | 300-305 | 重定向 | |
400-499 | 400-415 | 客户端错误 | |
500-599 | 500-505 | 服务器错误 |
常见状态码
状态码
|
原因短语
|
含义
|
---|---|---|
100 | Continue | 说明收到了请求的初始部分,请客户端继续。发送了这个状态码之后,服务端在收到请求之后必须进行响应 |
101 | Switching Protocols | 说明服务器正在根据客户端的指定,将协议切换成Update首部所列的协议 |
200 | OK | 成功。请求的所有数据都在响应主体中 |
202 | Accepted | 请求已被接受,但服务器还未对其执行任何动作。不能保证服务器会完成这个请求 |
400 | Bad Request | 用于告知客户端发送了一个错误的请求 |
401 | Unauthorized(未授权) | 需要输入用户名和密码 |
403 | Forbidden | 用于说明请求被服务器拒绝了。通常在服务器不想说明拒绝的原因时候使用的 |
408 | Request Timeout | 客户端完成请求所花的时间太长 |
404 | Not Found(未找到) | 服务器无法找到所请求URL对应的资源 |
500 | Internal Server Error | 服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码 |
502 | Bad Gateway | 代理或网关使用的服务器从请求响应链的下一个链路上收到了一条伪响应 |
503 | Service Unavailable | 说明服务器现在无法为请求提供服务,但将来可以 |
4.客户端识别与cookie机制
HTTP最初是一个匿名、无状态的请求、响应协议。服务器处理来自客户端的请求,然后向客户端回送一条响应。Web服务器几乎没有什么信息可以用来判定时哪个用户发送的请求,也无法记录来访用户的请求序列。现代的Web站点希望能够提供个性化的接触。它们希望对另一端的用户有更多的了解,并且能在用户浏览页面时对其进行追踪。
客户端ip地址
使用客户端ip地址识别用户有很多缺点:
- 客户端ip地址描述的是机器,而不是用户。
- 因特网服务商提供动态分配ip,用户每登陆一次,都是一个新地址。
- 为了提高安全性,并对稀缺资源进行管理,很多用户都是通过网络地址转换(Network Adress Translation,NAT)防火墙来浏览网络内容的。这些NAT设备隐藏了防火墙后面实际的客户端地址。将实际的客户端IP地址转换成一个共享的防火墙IP地址(和不同的端口号)。
-
HTTP代理和网关通常会打开一些新的、到原始服务器的TCP连接。Web服务器看到的将是代理服务器的IP地址,而不是客户端的。有些代理为了绕过这个问题会添加特殊的Client-IP或X-Forwarded-For扩展首部来保存原始地址。但并不是所有代理都支持这种行为。
用户登陆
Web服务器无需被动的根据用户IP来猜测身份,可以要求通过用户名密码来显式的询问用户是谁。为了是Web站点的登陆更加简便,HTTP中包含了一种内建机制,可以用WWW-Authenticate首部和Authorization首部向Web站点传送用户的相关信息。一旦登陆,浏览器就可以不断的在每条发往这个站点的请求中发送这个登陆信息了。
- 客户端对站点www.joes-hardware.com 发起请求。
- 站点并不知道用户身份,服务器返回401 login required HTTP状态码。并添加到WWW-Authentication首部,要求用户登陆。这样浏览器就会弹出一个登陆对话框。
- 只要用户输入了用户名和密码(对其身份进行了完整性检查),浏览器就会重复原来的请求。这次它会加一个Authentication首部,说明用户名和密码并对用户名和密码加密,防止有意无意的窥探者。
-
今后的请求要使用用户名和密码时,浏览器会自动将存储下来的值发送出去,甚至在站点没有要求发送时都会发送。
cookie
大多数缓存和浏览器都不允许对任何cookie的内容进行缓存。可以笼统的将cookie分成两类:会话cookie和持久cookie。会话cookie是一种历史cookie,它记录用户访问站点时的设置和偏好。用户退出浏览器是,会话cookie就会被删除。持久cookie生存时间长一点。他们存储在硬盘上,浏览器退出,计算机重启时他们如仍然存在。通常持久性cookie维护某个用户会周期性访问的站点的配置文件或登录名。
会话cookie和持久cookie之间唯一的区别就是它们的过期时间。cookie就像是服务器给用户贴的”嗨,我叫"的贴纸一样。用户访问一个Web站点时,站点就可以读取服务器贴在用户身上所有的贴纸。
用户首次访问Web站点时,Web服务器对用户一无所知。Web服务器希望这个用户会再回来,所以想给这个用户拍上一个独有的cookie,这样以后就能识别这个用户了。cookie包含了一个有name=value这样的信息构成的任意列表,并通过Set-Cookie或Set-Cookie2 HTTP响应(扩展)首部将其贴到用户身上。cookie的基本思想就是让浏览器积累一组服务器特有的信息,每次访问服务器时都将这些信息提供给它。浏览器负责存储cookie信息,所以此系统被称为客户端侧状态(client-side state)。cookie规范的正式名称为HTTP状态管理机制(HTTP state management mechanism)。浏览器内部有成千上百个cookie,但浏览器不会将每个cookie都发送给所有的站点。通常它只向每个站点发送2-3个cookie。原因如下:
- 对所有这些cookie字节进行传输会严重降低性能。浏览器实际传输的cookie字节数要比实际内容节数多
- cookie中包含的是服务器特有的名字和值对,所以对大部分站点来说,大多数cookie都只是无法识别的无用数据。
-
将所有cookie发送给所有站点会引发潜在的隐私问题,那些你并不信任的站点也会获得你只想发给其他站点的信息。
总之,浏览器只向服务器发送服务器产生的cookie。joes-hardware.com产生的cookie会被发送到joes-hardware.com,不会发送到bobs-books.com。
5 常见问题
A、GET和POST的区别
A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息。
B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用&连接:/index.html?name=wang&login=1
C. GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。
D. GET提交的数据不安全,因为参数都会暴露在URL上。
B、408 Request Timeout和504 Gateway Timeout的区别
408是说请求超时,就是建立连接之后再约定的时间内客户端没有发送请求到客户端到服务端。本质上原因在于客户端或者网络拥塞。504是网关超时,是说代理服务器把客户端请求转发到应用服务器后再约定的时间内没有收到应用服务器的响应。本质上原因在于服务端的响应过慢,也有可能是网络问题。
C、Cookie和Session的区别和联系
Cookie和Session都是为了保存客户端和服务端之间的交互状态,实现机制不同,各有优缺点。首先一个最大的区别就是Cookie是保存在客户端而Session就保存在服务端的。Cookie是客户端请求服务端时服务器会将一些信息以键值对的形式返回给客户端,保存在浏览器中,交互的时候可以加上这些Cookie值。用Cookie就可以方便的做一些缓存。Cookie的缺点是大小和数量都有限制;Cookie是存在客户端的可能被禁用、删除、篡改,是不安全的;Cookie如果很大,每次要请求都要带上,这样就影响了传输效率。Session是基于Cookie来实现的,不同的是Session本身存在于服务端,但是每次传输的时候不会传输数据,只是把代表一个客户端的唯一ID(通常是JSESSIONID)写在客户端的Cookie中,这样每次传输这个ID就可以了。Session的优势就是传输数据量小,比较安全。但是Session也有缺点,就是如果Session不做特殊的处理容易失效、过期、丢失或者Session过多导致服务器内存溢出,并且要实现一个稳定可用安全的分布式Session框架也是有一定复杂度的。在实际使用中就要结合Cookie和Session的优缺点针对不同的问题来设计解决方案。