协议の那些事儿——HTTP和HTTPS

一、HTTP的概况

Web的应用层协议是超文本传输协议(HyperText Transfer Protocol,HTTP),它是Web的核心。HTTP由一个客户程序一个服务器程序组成,客户程序和服务器程序运行在不同的端系统,通过交换HTTP报文进行会话。
Web页面由对象组成,多数的Web页面含有一个HTML基本文件以及几个引用对象(如JPEG图形),Web浏览器实现了HTTP的客户端,Web服务器实现了HTTP的服务端。

二、HTTP的发展

HTTP协议是基于TCP的应用层协议,不用关系数据传输的细节,只是规定客户端和服务端的数据传输格式,最初是用来向客户端传输HTML文件内容的,默认端口是80。

1.HTTP0.9版本 1991年
这是HTTP诞生的第一个版本,只有一个GET命令,服务器返回客户端一个HTML页面,没有其他格式。

2.HTTP1.0版本 1996年
1.0版本不仅可以传输HTML文本页面,还可以传输其他二进制文件,图片视频等,增加了POST和HEAD命令,并且开始支持cache,当客户端在规定时间访问同一网站,可以直接访问cache。最重要的是它增加了状态码和版本号,但是它是非持续连接,每次请求都要经历TCP的三次握手,四次挥手,不支持keep alive。

3.HTTP1.1版本 1997年
这个版本增加了持续连接,并且引入了管道机制,一个TCP连接里面可以同时发送多个HTTP请求,不必等待上一个请求响应成功再发送,增加了并发性,并且增加了PUT,PATCH,HEAD,OPTIONS,DELETE等命令。但是存在如下问题:服务端是按队列顺序处理请求的,假如一个请求处理时间很长,则导致后边的请求无法及时处理,造成对头阻塞问题,同时HTTP是无状态的连接,每次请求都需要添加重复的字段,降低了带宽的利用率。

4.HTTP/2版本 2015年(为了节约两个字符空间,之后的命名都以一个数字。)
虽然1.1版本有了管道机制,但是正在服务端还是要请求进行排队处理。/2版本可以多工处理增加了头信息压缩和服务器主动推送,就是增加了双工模式,不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了对头阻塞问题。
HTTP请求和响应,状态行和请求/响应首部都是信息字段,没有真正的数据,在/2版本中所有的信息字段构建成一张表,为每个字段建立索引,客户端和服务端共享该表,避免了旧版本的重复繁琐的字段,并以压缩的方式传输,提高利用率。(增加了服务器推送功能,不经请求服务端主动向客户端发送数据)

三、非持续连接和持续连接

1.非持续连接:每个请求/响应对是经一个单独的TCP连接发送的。
缺点:
①必须为每一个请求对象建立一个全新的连接,每个连接都要分配TCP缓冲区和保持TCP变量,需要消耗大量的资源。
②每个对象要经受2倍的RTT交付时延,一个RTT用于TCP的连接请求,一个RTT用于对象的请求接收(TCP的三次握手花费1.5RTT,客户端接收文件花费0.5RTT)

2.持续连接:所有的请求及其响应是经过相同的TCP连接发送的客户对对象的多个请求和响应能通过相同的连接进行传送,不必等待对未决请求的回答,减少了很多创建连接的时间

四、HTTP的报文格式

HTTP的报文有两种:请求报文和响应报文

1.请求报文

GET /somedir/page.html HTTP/1.1
Host:www.someschool.edu
Connection:close
User-agent:Mozilla/5.0
Accept-language:fr

HTTP请求报文的第一行是请求行,后继的行叫做首部行,一个请求报文至少为一行,可以具有更多行。
请求行有三个字段:方法字段,URL字段,和HTTP版本字段。其中方法字段有:

1.GET:获取资源
GET方法用来请求访问已被URI识别的资源,指定了服务器处理请求后响应的内容

2.POST:传输实体主体
POST方法用来传输实体主体,POST和GET的的目的不同,get是获取,post是发送

3.HEAD:获得报文首部
HEAD方法和GET类似,不同的是,HEAD方法不要求返回数据,用于确认URI的有效性以及资源更新时间,通常用来调试跟踪。

4.PUT:传输文件
PUT方法用来传输文件,文件内容包含在请求报文的实体中,然后请求保存到URL指定的服务器位置

5.DELETE:删除文件
与PUT相反的方法,DELETE要求返回URL指定的资源

6.OPTIONS:询问支持的方法
并不是所有的服务器支持规定的方法,为了安全有些服务器可能会禁止掉一些方法,OPTION就是用来查询服务器支持哪些方法

从上面这个例子中可以发现浏览器正在请求/somedir/page.html 这个对象,使用的是HTTP1.1/版本,使用的是GET方法。
首部行:Host:www.someschool.edu指明了对象所在的主机
Connection:close指示服务器不要使用持续连接,发送完请求对象后可以关闭连接
User-agent:Mozilla/5.0指明用户代理
Accept-language:fr指明了使用的语言

在这里插入图片描述

2.响应报文

HTTP/1.1 200 OK
Connection:  close
Date: Tue,18,Aug 2015 15:44:06 GMT
Server: Apache /2.2.3 (CentOs)
Last-Modified:Tue,18,Aug 2015 15:11:09 GMT
Connection-Length:6821
Connect-Type: text/html
(data,data,,,,,,data)

响应报文有三个部分:状态行,6个首部行,实体体
状态行有三个字段:协议版本字段,状态码,相应状态信息

常见的状态码
1XX :指示信息,表示请求已经接收正在处理
2XX :请求成功处理完毕
3XX :重定位,要完成请求必须进行更近一部的操作
4XX :客户端有问题,服务器无法处理请求
5XX :服务器有问题,服务器处理请求出错

200 OK:请求成功
301 Moved Permanently:请求对象被永久转移
302 Found:表示临时重定向,表示请求的资源已经被分配了新的URL,但是只是临时的,这个URL可能会发生改变,如果保存为书签就不会更新。
400 Bad Request:请求不能被服务器理解,存在语法错误,需要修改再次发送
404 Not Found:被请求的文档不在服务器上
500 Internel Server Error:表明服务端在执行请求时发生了错误,可能服务端程序的Bug或者临时故障。
505 HTTP Version Not Support:服务器不支持请求报文使用的HTTP版本

在这里插入图片描述

五、Web客户与服务器交互

客户请求一个Web页面,首先浏览器向服务器发出一个包含对象的HTTP
请求报文,服务器收到请求并用包含这些对象的HTTP响应报文响应。HTTP是用TCP协议进行可靠数据传输的,所以HTTP协议不用担心数据的丢失。
注意:服务器向客户机发送请求的文件,但是不存储任何关于客户的状态信息,也就是说HTTP协议是一个无状态协议。

无状态协议:假如某个客户在短时间内连续几次请求同一个文件,服务器并不会因为刚刚为客户提供了对象而不做任何回应,反而会重新发送对象,它把每一次请求都作为一次全新的,完全不会保留之前的任何信息。

浏览器中输入一串URL,按下回车的经历

1.输入url先解析url,检测url是否合法。
2.浏览器先查看浏览器缓存->系统缓存->路由器缓存->ISP缓存,如果命中,直接显示否则进入(3)
3.在发送http请求前需要DNS解析,获取相应的IP地址
4.浏览器向服务器发起TCP三次握手发起连接
5.握手成功后浏览器发送http请求
6.服务器收到浏览器请求并处理,将数据返回浏览器
7.浏览器收到响应
8.解码响应,若可以缓存,则存入缓存中
9.浏览器请求获取页面资源
10.浏览器发送异步请求
11.页面渲染结束

六、HTTPS工作原理

HTTP的缺点:
1.通信使用明文不加密内容可能被窃听
2.不验证通信方身份信息
3.无法验证报文的完整性

将HTTP加密,认证并加上完整性验证就诞生了HTTPS协议

  1. 客户端发起https请求
  2. 服务端生成证书
  3. 客户端对证书的有效性,合法性,域名是否与请求的域名一致,证书公钥(RSA加密)等进行校验;
  4. 客户端如果校验通过后,根据证书的公钥的有效性生成随机数,随机数使用公钥进行加密(RSA加密)传送该加密信息;
  5. 发送给服务端,此时只有服务端(RSA私钥)能解密解密得到的随机数与传送内容用AES加密,作为秘钥传送。
  6. 客户端用之前生成的私钥解密服务端传送的消息
    在这里插入图片描述

思考

1.什么是HTTP协议无状态协议?怎么解决HTTP协议无状态协议???

答:无状态协议在上文已经提到,就是对事物处理没有记忆功能,没有新旧的概念
解决办法:
1.使用cookie,cookie相当于一个通行证,第一次访问的时候给客户端发送一个cookie,下一次访问的时候带着cookie,服务器就能知道这个客户端之前访问过。
2.使用session会话保存,浏览器请求服务器时,程序为客户端的请求创建一个session,服务器首先检查这个请求是否包含session id,如果包含,说明该客户之前访问过。要注意,session ID在响应中返回到客户端保存。

cookie和session的区别:
cookie用户数据信息记录在客户端(类比会员卡,用户消费的时候出示会员卡,该卡是保留在用户手中的),可以减轻服务器的压力,但是也存在一定的安全隐患,容易进行cookie欺骗(卡被别人使用)。
session用户数据信息保存在服务端(类比有些店铺注册会员只需要登记手机号,下次报手机号码就可以查询是否是会员),相对安全,但是会占用服务器较多的资源。

2.URI和URL的区别

URI(uniform resource identifier)是统一标识符,用来唯一的标识一个资源
URL(uniform resource locator)是统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还可以指明如何定位这个资源

3.GET和POST的区别

get和post是http协议中的两种发送请求的方法,因为http的低层是TCP/IP协议,所以get和post都是TCP连接,并无本质区别,但是他们的表现形式有直观的不同。

  1. get把参数包含在url中,非常不安全,而post通过request body传参。如果要给get加上request body,post加上url参数在技术上也是可行的,这只是http的一个行为标准。
  2. get产生一个TCP数据包,浏览器将http header和data一起发送,服务器响应200 ok(返回数据);post要产生两个TCP,浏览器先发送header,服务器响应100(continue),然后浏览器再发送data,服务器响应200 ok(返回数据)注意:不是所有浏览器在post中都发送两次包,如火狐就一次

4.HTTP与HTTPS的区别

  1. HTTP的URL是以http://开头,而HTTPS的URL是以https://开头
  2. HTTP是不安全的,无法对数据进行加密;而HTTPS是安全的,会对传输的数据进行加密
  3. HTTP标准端口是80,而HTTPS的标准端口是443
  4. 在OSI模型中,HTTP位于应用层,而HTTPS的安全机制是在传输层
  5. HTTP无需证书,而HTTPS需要CA机构颁发的SSL证书
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章