HTTP协议

HTTP的特性

  • HTTP协议是构建于TCP/IP协议之上的一个应用层协议,默认端口是80,HTTPS是443
  • HTTP是无连接无状态
  • 永远都是客户端发起请求,服务器回送相应,所以无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端;,
  • 支持客户/服务器模式,支持基本认证和安全认证。
  • 简单快速,请求服务时只需传送请求方法和路径,灵活,允许传输任意类型的数据对象。
  • HTTP0.9和1.0使用非持续连接,限制每次连接只能处理一个请求,服务器处理完客户的请求并收到客户的应答后就断开连接;HTTP1.1使用持续连接,不必为每一个Web对象创建一个新的连接,一个连接可以传输多个对象,采用这种方式可以节省传输时间。
  • 无状态:HTTP协议是无状态协议,对于事务处理没有记忆能力,缺少状态意味着后续处理前面信息需要重传,导致每次连接传送的数据量巨大。(因为服务器需要面对很多浏览器的并发访问,为了提高服务器对并发访问的处理能力。)

    HTTP之URL

    HTTP使用统一资源标识符(URI)来传输数据和建立连接,URL是一种特殊类型的URI,包含用于查找某个资源的足够的信息。URL(统一资源定位符)地址;

    http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

  • 协议:HTTP
  • 域名:www.aspxfans.com(也可以用IP地址)
  • 端口部分: “:”隔开,不是必需的,可以是默认
  • 虚拟目录:域名后的第一个/到最后一个
  • 文件名:域名后的最后一个/到?或者#为止,不是必需的
  • 锚:#开始到最后,不是必需
  • 参数? # 之间的那部分

URL和URI的区别:

  1. URI是统一资源标识符,用来唯一的标识一个资源(HTML、图像、视频….)。URI的组成为 访问资源的命名机制,存放资源的主机名,资源本身的名称,由路径表示并着重强调资源;
  2. URL是统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,指明了如何locate这个资源;URL由协议,IP地址,主机资源的具体地址

HTTP的请求和响应

请求报文:

HTTP是以ASCII码传输的。HTTP的请求分为三个部分:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

  • 请求行:请求方法,URL,HTTP协议版本号,
  • 请求头部:说明服务器要使用的一些附加信息
  • 请求数据:可以添加任意的其他数据

响应消息Response

状态行、消息报头、空行和响应正文

  • 状态行:协议版本,状态码,状态消息
  • 消息报头:用来说明客户端要使用的一些附加信息
  • 空行
  • 相应正文,服务器返回给客户端的文本信息

HTTP状态码

  • 1xx:指示信息–表示请求已经接收继续处理;
  • 2xx:成功–表示请求已被成功接收理解接受;
  • 3xx:重定向–要完成请求必须进行更进一步的操作;
  • 4xx:客户端错误–请求有语法错误或请求无法实现
  • 5xx:服务端错误–服务器未能实现合法的请求

常见的状态码

  • 200 表示请求被服务器正常处理
  • 204 表示请求已成功处理但是没有内容返回
  • 206 服务器已经完成了部分GET请求
  • 301 表示请求的资源永久地搬到了其他的位置
  • 302 表示请求的资源临时搬到了其他的位置
  • 303 表示请求资源存在另一个URI,应使用GET定向获取请求资源
  • 304 表示客户端发送附带条件的请求(GET方法中的if…)条件不满足
  • 400 请求报文存在语法错误或参数错误,服务器不理解
  • 401 发送的请求需要有HTTP认证信息或者是认证失败了
  • 403 对请求资源的访问被服务器拒绝了
  • 404 服务器找不到你请求的资源
  • 500 服务器请求出错
  • 503 服务器超负载或正停机维护无法处理请求

HTTP请求方法

GET、POST、PUT、HEAD、DELET、OPTIONS

GET和POST的区别

  1. 由于HTML标准对HTTP协议的用法的约定,POST数据是放body,GET数据是放在URL中。但是现代的web server都支持get包含body的请求。
  2. 特定的浏览器(IE)对URL长度的限制是2083字节;理论上没有长度限制,其限制取决于操作系统的支持。URL太长对服务器处理事一种负担,处于安全稳定等方面的考虑,会给URL加长度限制,是对所有的HTTP,于get和post没关系;
  3. POST比GET安全;通过GET提交数据用户名和密码将明文出现在URL,因为登录页面可能被浏览器缓存。GET提交住居可能会造成Cross-site request forgery攻击。
  4. GET和POST最大的区别主要是GET请求是幂等性的,POST请求不是。这个是它们本质区别,上面的只是在使用上的区别。

持久连接

HTTP协议采用“请求-应答”模式,当使用普通模式的时候,即请求一次就新建一个新连接,完成后就断开连接(无连接的协议);当使用Keep-Alive模式的时候,Keep-Alive功能使客户端到服务端的连接持续有效,当出现对服务器有后继请求的时候,就可以避免建立或者重新建立连接。

在HTTP请求头中添加一个字段Connection: Keep-Alive,当服务器收到附带有 Connection: Keep-Alive 的请求时,它也会在响应头中添加一个同样的字段来使用 Keep-Alive 。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过 Keep-Alive 规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。

  • HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。
  • HTTP 长连接不可能一直保持,例如 Keep-Alive: timeout=5, max=100,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。
  • HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,在 HTTP1.1 版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于 Keep-Alive 的保持连接特性,否则会有意想不到的后果。

HTTP 管线化

默认情况下 HTTP 协议中每个传输层连接只能承载一个 HTTP 请求和响应,浏览器会在收到上一个请求的响应之后,再发送下一个请求。在使用持久连接的情况下,某个连接上消息的传递类似于请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3。

HTTP Pipelining(管线化)是将多个 HTTP 请求整批提交的技术,在传送过程中不需等待服务端的回应。使用 HTTP Pipelining 技术之后,某个连接上的消息变成了类似这样请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3。

会话跟踪

什么是会话?

客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。

什么是会话跟踪?

会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视。

会话跟踪常用的方法:

  1. URL 重写
  2. 隐藏表单域
  3. Cookie
  4. Session

HTTPS的工作原理