HTTP概况
web的应用层协议是超文本传输协议.HTTP有两个程序实现,一个是客户程序,一个是服务器程序.两者运行在不同的端系统之上,通过交换HTTP报文进行会话,
Web页面是由对象组成的,一个对象是一个文件,它们通过一个URL地址进行寻址。客户和服务器交互的核心思想是客户通过HTTP请求对服务器发出对Web页面的请求报文,服务器收到该报文后将返回包含该对象的HTTP响应报文。URL地址由两部分组成:存放对象的服务器主机名和对象的路径名
HTTP使用TCP作为它的传输层协议;HTTP客户首先发起一个与服务器的TCP连接,需要注意的是,服务器根据请求作出响应,但是不存储任何关于该客户的状态信息;也正因为这样,HTTP被称为无状态协议。同时,Web使用了客户端-服务器的应用体系结构;其中web服务器总是开着的
非持续连接和持续连接
在因特网应用程序中,客户端和服务器将在很长的时间范围里通信;应用程序将根据自身的特点,选择以规则的间隔周期性性发出请求也可以间断性一个个发出请求。当通信是使用TCP协议时,服务器端需要做出一个决定:这些请求是使用一个TCP连接完成还是通过独立的TCP连接完成。如果采取前一个方法,则称应用程序使用持续连接,如果使用后一种方式,则称为非持续连接。
HTTP既可使用持续连接也可以使用非持续连接。尽管HTTP在默认方式下使用持续连接
采用非持续连接的HTTP
使用非持续连接时,每个TCP连接在服务器发送一个对象后就会关闭,也就是每个TCP只传送一个请求报文和响应报文;
采用持续连接的换HTTP
在采用HTTP1.1持续连接的情况下,服务器在发送响应之后保持该tcp连接打开.在相同的客户端与服务器之间,后续请求和响应报文能够通过相同的连接进行发送.如果一条连接经过一定的时间间隔(可以配置的超时时间间隔)仍未被使用,HTTP服务器就关闭该连接
HTTP2在HTTP1.1基础上构建,他允许相同的连接中多个请求和回答交错进行.
HTTP报文格式
HTTP请求报文
- 请求行:请求方式 URL 版本
- 请求头:以键值对的方式约定一些编码格式等
- 空行
- 请求实体:get请求没有请求实体
HTTP响应报文
- 响应行:协议版本 状态码 短语
- 响应头:键值对
- 空行
- 响应实体:请求的对象等
常见状态码
200:请求成功 处理方式:获得响应的内容,进行处理
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
400:非法请求 处理方式:丢弃
404:没有找到 处理方式:丢弃
505:服务器不支持请求报文使用的http版本。
用户与服务器的交互:cookie
HTTP服务器是无状态的,但是通常情况下我们希望他能够识别用户,因此我们使用cookie来对用户进行跟踪
Cookie技术包含4个组件
- HTTP响应报文里增加一个关于Cookie的首部行;
- HTTP请求报文里增加一个关于Cookie的首部行;
- 用户端系统保留一个Cookie文件,由浏览器保存维护;
- 位于web站点的一个后端数据库
当我们请求一个web服务器的时候,请求报文到达服务器,该服务器将产生一个唯一的识别码,并以此为索引在他的后端服务器中产生一个表项,之后该服务器用一个包含set-cookie响应行的响应报文对用户进行响应.当响应报文到达用户的浏览器之后,浏览器会看到set-cookie这个响应行,并在它所维护的特定的cookie的文件中添加一行,该行包括服务器的主机名和cookie的值.再次访问该站点的时候,浏览器会在请求头中设置cookie值,服务器就可以匹配到一个特定的用户.
通过cookie值服务器就可以跟踪该用户在该站点的所有活动.但是也被认为是侵害用户隐私的一种行为
web缓存
web缓存器也叫代理服务器,他是能够代表服务器来满足HTTP请求的网络实体.web缓存器有自己的磁盘存储空间,并在其中缓存最近被请求过的对象的副本.可以通过配置用户的浏览器是用户的请求先被定向到web缓存器,如果缓存的有该请求的对象检查没有过期之后直接返回,如果没有就打开一个与该对象的初始服务器的tcp连接,有web缓存器向初始服务器发送HTTP请求,服务器响应给web缓存器,缓存器返回给用户并备份
-
web缓存器可以大大降低客户请求的响应时间
-
web缓存器可以大大减少一个机构的接入链路到因特网的通信量
-
web缓存器可以从整体上降低因特网的web流量,
条件get方法
web缓存可以减少响应时间,但是缓存器中的对象可能是陈旧的.HTTP协议有一种机制,允许缓存器正式他的对象是不是最新的.这种机制就是条件get方法.
如果:请求报文使用get方法并且请求头中包含一个"If-Mondified-Since"的请求头,那么他就是一个条件get请求报文.
服务器通过304响应码来告诉缓存器该对象没有被修改过,响应报文中不包含请求的对象