什么是HTTP?
HTTP (超文本传输协议) 是用来在 Web 上传输文件的基础 协议 ,最典型的是在浏览器和服务器之间传递以至于上网人员可以浏览他们。
作为URI的一部分,“http://”被称为模式,通常位于地址的开头,例如“https://developer.mozilla.org”,就是指示浏览器利用HTTP协议请求文档。https在这个例子中指的是HTTP协议的安全版本,被称为SSL,或者TLS。
HTTP 是基于文本 (所有的通信都是以纯文本的形式进行) 以及无状态的 (当前通信不会发现以前的通信状态)。这个特点对在www上访问网页的人是很理想的。而且,HTTP也可以让网站更加的灵活多变,利用在AJAX上等。
一、基于HTTP的组件系统
在一个浏览器和处理请求的服务器之间,由于Web的层次设计,那些在网络层和传输层的细节都被隐藏起来了。HTTP位于最上层的应用层。虽然底层对于分析网络问题非常重要,但是大多都跟对HTTP的描述不相干。
- user-agent: 就是任何能够为用户发起行为的工具。
- Web服务端:Web Server来服务并提供客户端所请求的文档
- 代理(Proxies):在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息。由于Web栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于HTTP应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理
1、缓存(可以是公开的也可以是私有的,像浏览器的缓存)
2、过滤(像反病毒扫描,家长控制...)
3、负载均衡(让多个服务器服务不同的请求)
4、认证(对不同资源进行权限管理)
5、日志记录(允许存储历史信息)
二、HTTP 的基本性质
-
HTTP是无状态的,使用Cookies可以创建有状态的会话。
把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态,将两个请求相关联,如购物车实现两个商品添加!
-
HTTP 和连接
两个最常用的传输层协议:TCP是可靠的,而UDP不是。因此,HTTP依赖于面向连接的TCP进行消息传递,但连接并不是必须的。为了更好的适合HTTP,设计一种更好传输协议的进程一直在进行。Google就研发了一种以UDP为基础,能提供更可靠更高效的传输协议
三、HTTP 能控制什么
以下是可以被HTTP控制的常见特性:
- 缓存:文档如何缓存能通过HTTP来控制。
-
开放同源限制:
为了防止网络窥听和其它隐私泄漏,浏览器强制对Web网站做了分割限制。只有来自于相同来源的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP可以通过修改头部来开放这样的限制,因此Web文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑)
-
认证:
一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过HTTP提供,使用Authenticate相似的头部即可,或用HTTP Cookies来设置指定的会话。
-
代理和隧道:
通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理。
- 会话:使用HTTP Cookies允许你用一个服务端的状态发起请求,这就创建了会话。
四、HTTP 流
当客户端想要和服务端进行信息交互时(服务端是指最终服务器,或者是一个中间代理),过程表现为下面几步:
- 打开一个TCP连接
- 发送一个HTTP报文
- 读取服务端返回的报文信息
- 读取服务端返回的报文信息
五、HTTP 报文
有两种HTTP报文的类型,请求与响应,每种都有其特定的格式。
1、请求
请求由以下元素组成:
一个HTTP的method,经常是由一个动词像GET, POST 或者一个名词像OPTIONS,HEAD来定义客户端的动作行为。通常客户端的操作都是获取资源(GET方法)或者发送HTML form表单值(POST方法),虽然在一些情况下也会有其他操作。
要获取的资源的路径,通常是上下文中就很明显的元素资源的URL,它没有protocol (http://),domain(developer.mozilla.org),或是TCP的port(HTTP一般在80端口)。
HTTP协议版本号。
为服务端表达其他信息的可选头部headers。
对于一些像POST这样的方法,报文的body就包含了发送的资源,这与响应报文的body类似。
2、响应
响应报文包含了下面的元素:
HTTP协议版本号。
一个状态码(status code),来告知对应请求执行成功或失败,以及失败的原因。
一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
HTTP headers,与请求头部类似。
可选项,比起请求报文,响应报文中更常见地包含获取的资源body。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。