01-HTTP协议
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部分组成。
- 响应首行【用于描述服务器对请求的处理结果。】
- 响应头【用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据】
\r\n
- 响应体【服务器向客户端回送的数据】
响应头字段示例:
- 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【服务器告诉浏览器回送数据的时间】