HTTP协议

介绍

  • HTTP是明文协议
  • HTTPS提供传输层安全(SSL/TLS),SSL协议到目前为止基本上都已经被启用了,我们只是沿用过去的使用习惯,所以会说HTTPS是通过SSL加密的HTTP,但实际上更多的是使用TLS加密的协议。SSL协议存在一定的安全隐患,已经被TLS代替了,但是在使用上还是习惯 SSL / TLS 一起说。

SSL协议是网景通信公司(Netscape Communications Corporation)设计的,现在已经不存在了,但是在当时可是鼎鼎大名,几乎是相当于今天谷歌在现在计算机网络的位置。

SSL协议最早是作为HTTP的一个安全扩展提出来的,但是刚被提出来的前几个版本都屡次发现,其中比较明显的安全漏洞和问题。所以当后来SSL被国际标准化组织采纳之后,为了区别于SSL协议,发布了TLS协议,其实TLS也是基于SSL做的优化和安全性的加强。现在的TLS已经独立成为一个单独的协议了,不再只作为HTTP的安全增强的扩展功能。现在的TLS不但可以和HTTP结合形成HTTPS的加密传输协议,还可以和ftp、邮件、sqlserver等众多的应用类型结合一起使用。TLS其实是实现了传输层的安全,通过TLS(Transport Layer Security)单词也可以看出,其实它是工作在传输层和会话层之间的中间层,来实现数据传输过程中的安全。

请求方法:

  • get
  • post
  • put 可以上传文件
  • delete
  • options 通过这个方法请求服务器,服务器会将它支持的所以http方法返回给客户端,通过options方法,我就知道请求在这个web服务器上它支持哪些http方法。
  • header 返回头部的信息
  • ……
  • Get / http/1.1 get请求方法去请求服务端程序的时候,http头部里面就会包含 在首行第一行就会出现get方法,get后面跟上请求相对的url地址资源。在get请求的时候,可以请求完整的url地址,但是通常来说,在你发请求到一个指定的目标服务器上的时候,可以不用写主机的ip或域名。因为通过主机的名称和IP,我们只要通过网络层路由到服务器就可以了,而我们现在是http应用层,可以不必强调主机的ip、域名了,而直接在get后面放上要请求的页面文件的名称。而在get后面不是一个具体的页面的名称,而是一个/,就代表访问这个主机服务端的根目录。在请求url地址的后面,通常会跟上http的版本。现在最广泛使用的http的版本是1.1。

无状态连接

  • 每一次 B / S 间通信都是独立的过程
  • 通过Session 对身份验证后用户行为跟踪(否则每次请求都要验证身份)

HTTP头部

  • host: 主机IP/名称
  • cookies:客户端发回给服务器证明用户状态的信息
  • referrer:发起新请求之前用户位于哪个页面
  • set-cookies:服务器发给客户端的SessionID
  • content-length:响应body部分的字节长度
  • location:重定向用户到另一个页面

服务端响应表示响应结果的状态码(5个大类,50多个具体响应码)

1XX

100,信息类,通常表示服务器还有后续处理,不常出现

2XX

一般是请求成功

  • 200:成功响应
  • 204:成功处理,但服务器没有新数据返回,显示页面不更新
  • 206:对服务器进行范围请求,只返回一部分数据

3XX

一般表示重定向

  • 301:请求的资源已分配了新的URI中,URL地址改变了。永久重定向
  • 302:请求的资源临时分配了新的URI中,URL地址没变。临时重定向
  • 303:与302相同的功能,但明确客户端应该采用GET方式来获取资源
  • 304:发送了附带请求,但不符合条件。返回未过期的缓存数据
  • 307:与302相同,但不会把POST请求变成GET

4XX

表示客户端出错了

400:请求报文语法错误了

401:需要身份验证

403:没有权限访问

404:服务器没有这个资源

5XX

服务器出错了

  • 500:服务端内部错误
  • 503:服务不可用

300类的响应码表示重定向,有很多种,其中301和302是比较常见的响应码。

  • 301是永久重定向,我们会经常遇见这样的web服务器端的web程序,当你访问类似于这样的url:www.A.com,这样的域名的时候,服务器端总是会把你重定向到另一个url地址上,它可能不希望你直接去访问这个域名,可能希望你跳转访问另一个url资源。所以很多的web服务器都会做这样的一个永久重定向,有人来访问这个地址,我就跳转到另外一个页面上去。甚至还有一些服务器,只要有人访问我 http://www.A.com,我就重定向到 https://www.A.com,通过这种方式强制客户端,我不接受http明文传输的协议来访问我,我只接受https这种加密传输的协议来访问我,但是客户端可能不了解这件事,还是用http来访问,作为服务端的管理员就设置,你只要用http明文来访问,我就返回一个301的响应状态码给客户端,同时通过location响应头部告诉客户端。
  • 302是临时重定向,经过身份认证登录成功之后,服务端会返回一个302的响应码给客户端,同时在http响应的数据里面会包含一个location头部告诉说,你已经经过身份验证了,你去访问另外一个经过身份验证成功的用户应该访问的地址。这种情况下就是临时重定向。它不是说访问A这个url就跳转到B这个url,而是你访问我A的url,我看你提交的是什么数据、什么内容,如果你提交了正确的用户名和密码,我就重定向到B;如果你提交错误的用户名和密码,我还给你重定向到A。所以这个重定向的目标不是固定的,只是视情况而定。比如说,我成功提交了合法的验证,重定向到了B,但是过了一段时间,我的登录时间超时了,下次再请求的时候,还是会重定向到如login登录页面进行身份验证。

具体的响应状态码可以看:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

服务器与客户端之间的应用程序

一个HTTP服务器可以拥有多个站点,也就是说:HTTP下可以配置多个虚拟主机。当用户访问不同主机的时候,实际上都是访问同一台HTTP服务器。

在客户端和服务器中还有一些用于通信数据转发的应用程序

  • 代理
    • 可以用来缓存数据,当代理缓存了数据以后,客户端就可以直接用代理获取数据
    • 可以用来对网站进行访问控制,获取访问日志记录
  • 网关
    • 能够提供非HTTP请求的操作,访问数据库什么的
  • 隧道
    • 建立一条安全的通信路径,可以使用SSL等加密手段进行通信。

HTTP请求报文

HTTP请求报文:在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分组成。

  • 请求首行(描述客户端的请求方式请求的资源名称,以及使用的HTTP协议版本号
  • 首部字段(描述客户端请求哪台主机,以及客户端的一些环境信息等)
  • \r\n
  • 请求体

请求头实例:

  • Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
  • Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集
  • Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式
  • Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
  • Host: www.baidu.com:80【浏览器告诉服务器,它的想访问哪台主机】
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
  • Referer: http://www.abc.org/index.html【浏览器告诉服务器,客户机是从那个页面来的---**防盗链**】
  • 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】
  • Cookie【浏览器告诉服务器,带来的Cookie是什么
  • Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】
  • Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间】

HTTP响应报文

HTTP响应报文:在响应中,HTTP报文由HTTP版本、状态码(数字和字符串解释)、HTTP首部字段3部分组成。

  1. 响应首行【用于描述服务器对请求的处理结果。
  2. 响应头【用于描述服务器的基本信息,以及数据的描述服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据
  3. \r\n
  4. 响应体【服务器向客户端回送的数据

响应头字段示例:

  • Location: http://www.abc.org/index.html 【服务器告诉浏览器要跳转到哪个页面
  • Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
  • Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式
  • Content-Length: 80 【服务器告诉浏览器回送数据的长度】
  • Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
  • Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型
  • Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
  • Refresh: 1;url=http://www.abc.org【服务器告诉浏览器要**定时刷新**】
  • Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据
  • Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
  • Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie
  • Expires: -1【服务器告诉浏览器不要设置缓存
  • Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存
  • Pragma: no-cache 【服务器告诉浏览器不要设置缓存
  • Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】
  • Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】