我眼中的http协议

URI是下面的这样的形式

http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1

各部分标示的意思如下     
字符串 用途
http 协议类型
user:pass 登录服务器的用户名和密码
www.example.jp 服务器地址,还可以用ipv6的标示的表示形式[0:0:0:0:0:0:0:1]
80 端口号
index.html 带层次的文件路径
uid=1 查询字符串
ch1 片段标示符,锚

请求方法

方法类型 说明 支持的协议版本
GET 请求http服务器上的某一个页面资源, 如果请求的是文本资源,保持原样返回;如果是CGI一样的程序,则返回执行后的输出结果,主要目的是想访问资源 1.0,1.1
POST post的主要目的是把消息传递给服务器 1.0,1.1
PUT 传输文件,但是HTTP/1.1的PUT方法不带验证机制,任何人都可以上传文件, 需要配合web应用程序的验证机制,或REST程序使用。 1.0,1.1
HEAD 和GET方法一样,但是不返回报文主体,用于确认URI的有效性和资源更新的日期等 1.0,1.1
DELETE 删除文件,但是HTTP/1.1的DELETE方法不带验证机制,任何人都可以删除文件, 需要配合web应用程序的验证机制,或REST程序使用。 1.0,1.1
OPTIONS 询问服务器只会哪些请求方法 1.1
TRACE 该方法需要配合请求头中的Max-Forwards字段使用,并指定一个初始值, 如果使用了 代理服务器,没经过一个代理服务器,该字段值就会减1, 直到为0,服务器就返回请求内容。可能会引起跨站追踪 1.1
CONNECT 要求在于代理服务器通信时候,建立隧道 1.1
LINK 建立与资源之间的联系 1.0
UNLINK 断开连接关系 1.0

持久连接

没有持久连接之前,如果一个页面包含多个图片等请求,则每一服务图片的请求,都需要与服务器端建立TPC/IP连接,大大浪费了时间,有了持久连接之后,只需要建立一次TCP/IP连接,就能在其中保持多个HTTP请求和响应。HTTP1.1所有的连接,默认都是持久连接,主要的做法是在请求头中增加了,keep-alive选项

管线化

持久化连接虽然能够,在一次TCP/IP连接内,进行多次HTTP请求,但是这些请求是串行的,只有一个请求结束了之后,才能继续第二个请求。管线化使得在一个TCP/IP连接内,多个请求可以并发执行

使用Cookie做状态管理

HTTP是无状态的协议,它不对之前发生过的请求和响应的状态进行管理,无法根据之前的状态尽心Benin的处理。但是通过服务端向客户端指定一个cookie信息,每次客户端请求的使用,使用这个cookie信息请求服务端,服务端就知道客户端的情况了。

状态码

状态码 字段值 原因
200 OK 成功
204 No Content 请求已经正确处理,不需要返回任何实体内容
206 Partial Contex 客户端进行了范围请求,服务器成功执行了这部分范围请求,可用于断点续传
301 Move Permanently 标示被请求的资源已经被分配了新的URI
302 Found 临时性重定向,访问的URI临时的迁移到另外的地方了,以后还可能会变化, 禁止POST转化为GET
303 See Other 指示客户端以Get形式重定向到另一个URI上去
304 Not Modified 附带条件的请求时,但是没有找到合适的资源,不包含任何响应的主体部分
307 Temporary Redirect 禁止POST变为GET
400 Bas Request 请求报文中存在语法错误
401 Unauthorized 发送的请求需要通过HTTP认证(BASIC,DIGEST)
403 Forbidden 对请求资源的访问被服务器拒绝了
404 Not Found 服务器没有请求的资源
500 Internal Server Error 服务器端在执行请求时候发生了错误
503 Service Unavailable 服务器处于超负载状态,一段时候后再访问

通信数据转发程序

代理

转发功能的应用程序

网关

转发其他服务器通信数据的服务器,除了具备代理服务器的相关功能之外,还能够使通信线路上的服务器提供非HTTP协议服务

隧道

建立一条与其他服务器的通信线路,到时候使用SSL等加密手段进行通信。目的是为了确保客户端与服务器进行安全的通信

http的瓶颈

  1. 一条链接只可发送一个请求
  2. 请求只能从客户端开始。客户端不可以接受除了响应意外的指令
  3. 请求/响应首部未经过压缩就发送,首部信息越大延迟越大
  4. 发送冗长的首部。每次互相发送相同的首部造成浪费较多
  5. 可选择任意数据的压缩格式。非强制压缩发送

Ajax解决方法

只用于更新一部分页面,使得响应中传输的数据因此减少,缺点:但是会导师大量请求产生。

Comet解决方法

一旦服务器有内容更新,Comet不会让请求等待,而是直接给客户端访问响应,如果服务端没有内容更新,Comet挂起请求,当服务器有更新的时候,再返回响应。缺点:挂起了去请求,消耗服务端资源。

SPDY的解决方法

在协议解决消除HTTP的瓶颈
要求在应用程和传输层之间如下会话层SPDY,并在表示层使用SSL,带来的改变如下:

多路复用流

单一的TCP连接,可以无限制处理多个HTTP请求

赋予请求优先级

这样主要是为了在发送多个请求时候,解决因为带宽低而导致的响应变慢的问题(TODO)

压缩HTTP首部

通信的数据量少了

推送功能

支持服务端主动向客户端发送数据

全双工通信的WebSocket

WebSocket协议的特点

推送功能

支持服务端向客户端推送数据

减少通信量

只要建立了WebSocket连接,就希望一直保持连接状态
为了实现WebSocket通信,在HTTP连接之后,需要完成一次“握手“步骤

握手*请求

设置HTTP hearder

Upgrade: wbsocket
Connection: Upgrade
Sec-WebSocket-Key: XXXXXXXXXXXX
Sec-WebSocket-Protocol : chat, superchat
Sec-WebSocket-Version : 13

握手*响应

对应之前的请求,返回状态码101 Switching Protocols响应

成功确立WebSocket连接之后,通行时不再使用HTTP数据帧,而采用WebSocket独立的数据帧

http不具备必要的安全功能,

因输出值转义不完全而应发的安全漏洞

一般是用户点击了某一个别人写好的 有各种陷阱的链接

跨站脚本攻击

SQL注入攻击

OS命名注入攻击

HTTP首部注入攻击

邮件首部注入攻击

目录遍历攻击

远程文件包含攻击

因设置或设计上的缺陷引发的安全漏洞

强制浏览

不正确的错误消息处理

开放重定向

因会话管理疏忽的安全漏洞

会话劫持

会话固定攻击

跨站点请求伪造

其他安全漏洞

密码破解

点击劫持

DOS攻击

后门程序

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章

Fork me on GitHub