一次http事务包括:
-
http请求:http request
-
http响应:http response
资源类型
-
静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同
-
动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同
提高HTTP连接性能
-
并行连接:通过多条TCP连接发起并发的HTTP请求
-
持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
-
管道化连接:
-
通过共享TCP连接,发起并发的多个HTTP请求,但需要也要按发起请求的顺序来接收响应,实现难度很大,很多代理服务器和浏览器不支持
-
复用的连接:交替传送请求和响应报文(实验阶段)
http 1.0,1.1,2.0的区别
HTTP1.0和HTTP1.1的区别
-
缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-NoneMatch等更多可供选择的缓存头来控制缓存策略
-
带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接
-
错误通知的管理,在HTTP1.1中新增24个状态响应码,如409(Conflict)表示请求的资源与资源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除
-
Host 头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
-
长连接,HTTP 1.1支持持久连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点
HTTP1.0和1.1的问题
-
HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出
-
HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性
-
HTTP1.x在使用时,header里携带的内容过大,增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
-
虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间
HTTP 2.0
http/2.0:2015年发布,HTTP2.0是SPDY的升级版
-
头信息数据体都是二进制,称为头信息帧和数据帧
-
复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序响应,避免了"队头堵塞",此双向的实时通信称为多工(Multiplexing)
-
引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,
-
只发送索引号,提高速度HTTP/2 允许服务器有新数据时未经请求,主动向客户端发送资源,而无需客户端拉取,即服务器推送(server push)
http状态码分类
1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误
http协议常用的状态码
200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: Moved Permanently,请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置
302: Moved Temporarily,响应报文Location指明资源临时新位置
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified,但无需再发送原始数据即实体给客户端
307: 浏览器内部重定向,而无需再向服务器发送请求
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden,一般是因为权限错误或主页文件不存在
404: 服务器无法找到客户端请求的资源;Not Found
405: 表明服务器禁止了使用当前 HTTP 方法的请求 ethod Not Allowed
413: 上传的资源超过了最大限制值
499: 客户端主动断开连接。然而在实际业务开发中,当出现 HTTP 499 状态码时,大部分都是由于服务端请求时间过长,导致客户端等的“不耐烦”了,因此断开了连接。比如:慢SQL问题,499是客户端读超时关闭连接造成的,推荐从超时时间或者优化响应速度入手,web服务器发现客户端主动关闭连接后,记录access日志中的。可能是客户端接收响应超时了,可以先在客户端统计下是不是这个原因,再调查为什么会导致超时
500: 服务器内部错误;Internal Server Error,比如:cgi程序没有执行权限,或连接数据库失败,rewrite死循环
502: Bad Gateway,代理服务器从后端服务器收到了一条错误响应或伪响应,如无法连接到网关;Bad Gateway,比如:后端服务端口没有打开,或后端服务不可用或关机,iptable -j REJECT,确定服务器是down,相当于"确定人不存在了"
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:超过连接数和连接频率
504: Gateway Timeout,网关超时,或者后端服务器无回应报文,比如:服务端口虽然打开,但服务返回结果时间过长,iptable -j DROP,不确定服务器down,相当于"人失踪了,不确定存在或不存在"
Apache 经典的Web服务端
MPM multi-processing module 有三种工作模式
-
Apache prefork 模型
-
Apache worker 模型
-
文章评论