HTTP就是这么简单

为何要学HTTP?

咱们绝大多数的Web应用都是基于HTTP来进行开发的。咱们对Web的操做都是经过HTTP协议来进行传输数据的。html

简单来讲,HTTP协议就是客户端和服务器交互的一种通迅的格式程序员

HTTP的诞生主要是为了可以让文档之间相互关联,造成超文本能够互相传阅数据库

能够说,Http就是Web通讯的基础,这是咱们必学的。apache

HTTP基础概念

咱们学计算机网络的时候就知道,咱们把计算机网络分层了5层,通常咱们如今用的都是TCP/IP这么一个分层结构。浏览器

虽然官方的是ISO 提出的7层结构,可是仅仅是理论基础,在实际上大多人都是使用TCP/IP的分层结构缓存

首先,咱们先得知道,为何咱们要在计算机网络中分层次???tomcat

由于若是两台计算机可以相互通讯的话,实际实现起来是很是困难操做的...咱们分层的目的就是为了将困难的问题简单化,而且若是咱们分层了,咱们在使用的时候就可以仅仅关注咱们须要关注的层次,而不用理会其余层安全

若是须要改动设计的时候,咱们只须要把变更的层替换便可,并不用涉及到其余的层次。这与咱们程序设计中的低耦合是一个概念。服务器

而咱们的HTTP协议是在最上层,也就是应用层。这是最贴近咱们的程序员的层次。微信

网站通讯粗略过程

咱们知道HTTP是在应用层中的,显然,咱们在Web通讯的过程当中,不只仅是须要HTTP协议的,还会涉及到其余的协议的

DNS:负责解析域名

  • 咱们访问一个网页的时候,每每是经过域名来访问的www.zhongfucheng.site,而计算机通讯只认的是咱们的主机地址(192.168.xxx.xxx),所以,当咱们输入域名的时候,须要DNS把域名解析成主机来进行访问。

HTTP:产生请求报文数据

  • 当咱们对Web页面进行操做的时候,就会产生HTTP报文数据,请求对应的服务端进行响应。

 

这里写图片描述

 

TCP协议:分割HTTP数据,保证数据运输

  • TCP协议采用了三次握手的方式来保证数据的准确运输,在运输的数据的时候,发送标识过去给服务器,服务器也返回标识给客户端,而客户端收到消息后再次返回标识给服务器。这样一来就保证了数据运输是可靠的。

IP协议:传输数据包,找到通讯目的地地址。

  • IP协议把咱们的产生的数据包发送给对方,IP地址指明了节点被分配的地址,但IP地址可能会变换,咱们可使用ARP协议来将IP地址反射为MAC地址。MAC地址是不会更改的,是网卡所属的固定地址。
  • 在找到通讯目的地以前,咱们是须要不断的中转的,这过程咱们称做为:“路由中转”,咱们并不知道路由中转了多少次的。所以是不能全面了解到互联网中的传输情况的。

接下来就离咱们比较远了,属于硬件相关的了,也就是链路层和物理层。之后复习到计算机网络的时候再来补充吧!

咱们网页上请求数据就是上边这么一个流程

告知服务器请求的意图

咱们若是开发过Web程序的话,咱们知道经常使用的提交方式有POST和GET方法

咱们也知道GET是用来获取数据的,POST是用来提交数据的。

其实HTTP协议中还支持着其余的方法,好比:Input、Delete、OPTIONS不少这样的方法。而因为经常使用,因而咱们也可能仅仅知道GET和POST方法了。

HTTP提供方法的目的就是为了告知服务器该客户端想进行什么操做。当HTTP是OPTIONS方法的时候,服务器端就会返回它支持什么HTTP方法。

固然了,如今RESTful盛行,也就是充分利用了HTTP协议的这些方法

HTTP是不保存状态的协议

HTTP是无状态的,也就是说,它是不对通讯状态进行保存的。它并不知道以前通讯的对方是谁。这样设计的目的就是为了让HTTP简单化,可以快速处理大量的事务!

可是,咱们常常是须要知道访问的人是谁,因而就有了Cookie技术了。

  • 要是服务器端想要记住客户端是谁,那么就颁发一个cookie给客户端
  • 客户端把Cookie保存在硬盘中,当下次访问服务器的时候,浏览器会自动把客户端的cookie带过去。
  • 就这样,服务器就可以知道这家伙是谁了。

持久链接

在HTTP1.0的时候,每一次进行HTTP通讯就会断开一次链接。若是容量不多的文本传输是没有问题的。可是若是咱们访问一个网页,该网页有很是多的图片。一个图片就算上一个HTTP请求了。那么在中途中就不断地创建TCP链接、获取图片、断开TCP链接。

这样是很是浪费资源的,所以在HTTP1.1版本,就是持久链接了。一次HTTP链接可以处理多个请求

持久链接为“管线化”方式发送成为了可能:在一次HTTP链接里面,不须要等待服务器响应请求,就可以继续发送第二次请求

提高传输效率

在说明以前,首先咱们要知道什么是实体主体

  • 实体主体就是做为数据在HTTP中传输的数据

通常地,实体主体能够等价为报文主体,报文主体是HTTP中的一部分

咱们若是不使用任何手段,服务器返回的数据实体主体是原样返回的。咱们可使用两种方式来提升传输效率

  • 使用压缩技术把实体主体压小,在客户端再把数据解析
  • 使用分块传输编码,将实体主体分块传输,当浏览器解析到实体主体就可以显示了。

咱们若是在下载东西的过程当中断了,按照之前咱们是须要从新下载的,可是如今能够在中断中继续下载。咱们能够使用到获取范围数据,这种叫作范围请求

这种请求只会下载资源的一部分。

  • 好比个人图片下载到一半了,咱们只须要下载另外一半就能够组成一张完整的图片了。那么请求的时候请求没有下载的一部分便可。

经常使用的状态码简述

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 服务器正忙

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

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

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

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

HTTP首部简述

HTTP请求报文

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

 

 

  1. 请求行【描述客户端的请求方式请求的资源名称,以及使用的HTTP协议版本号
  2. 首部字段【描述客户端请求哪台主机,以及客户端的一些环境信息等】
  3. 一个空行

首部字段例子:

  • Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
  • Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪一种字符集
  • Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式
  • Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
  • Host: www.it315.org:80【浏览器告诉服务器,它的想访问哪台主机】
  • If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
  • Referer: http://www.it315.org/index.jsp【浏览器告诉服务器,客户机是从那个页面来的---反盗链
  • 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. 一个空行
  4. 实体内容【服务器向客户端回送的数据

状态行:

  • 格式: HTTP版本号 状态码 缘由叙述
  • 状态行:HTTP/1.1 200 OK
  • 状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类

首部字段例子:

  • Location: http://www.it315.org/index.jsp 【服务器告诉浏览器要跳转到哪一个页面
  • 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.it315.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【服务器告诉浏览器回送数据的时间】

对于HTTP首部这一部分是很是庞大的一个章节,知识点也不少,我就没有一一去记录了。用到的时候再查吧。我看的是《图解HTTP》。

HTTPS简述

HTTP在安全上是不足的

  • 通讯使用明文【没有加密过内容的】
  • 不验证通讯方身份,不管是客户端和服务器,都是随意通讯的
  • 没法证实报文的完整性【别人监听后,能够篡改】

咱们通常在上网时,使用抓包工具就很容易获取到HTTP请求的信息了,这是TCP/IP在网络通讯中没法避免的。

假设咱们对HTTP报文进行加密了, 那也仅仅是是内容的加密。别人获取到了HTTP内容了,即便没法破解HTTP内容,仍是可以篡改的。

咱们最好就是使用SSL创建安全的通讯线路,就能够在这条线路上进行HTTP通讯了。

其实HTTPS就是披着SSL的HTTP...

HTTPS使用的是共享密钥和公开私有密钥混合来进行加密的。因为公开私有密钥须要太多的资源,不可能一直以公开私有密钥进行通讯。所以,HTTP在创建通讯线路的时候使用公开私有密钥,当创建完链接后,随后就使用共享密钥进行加密和解密了

对于认证方面,HTTPS是基于第三方的认证机构来获取认受承认的证书、所以,能够从中认证该服务器是不是合法的。

而客户端方面则须要本身购买认证证书、这实施起来难度是很大的【认证证书须要钱】。

因此,通常的网站都是使用表单认证就算了,这是用得最普遍的客户端认证了。

若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章的同窗,能够关注微信公众号:Java3y

相关文章
相关标签/搜索