HTTP(HyperText Transfer Protocol:超文本传输协议)
超文本可以说是“超级文本”或者说是“带超链接文本”。超链接文本可以有图片、动图、文字、视频。从本质上说它是一个内容文本,我们对网站的浏览,实际上是对内容的浏览。对于这些内容,都有统一的路径,我们称之为URL地址
http(s): //<主机>:<端口>/<路径>
http:表示协议,有http和https协议
主机可以是ip也可以是域名,如果是域名,会使用到DNS服务,将其转换为ip地址。
端口:80端口表示http端口,443端口表示https端口。
路径:指向特定的内容
https://www.imooc.com/
https://www.baidu.com/
https://www.taobao.com/
以上都是网站地址。
HTTP协议是可靠的数据传输协议。
可靠性是依赖于传输层的TCP协议来实现的。也就是说,HTTP协议的底层是TCP协议通过TCP协议的可靠性从而保证HTTP协议也是可靠的。
数据包括文本、图片、文件、动图、视频、音频。这些构成了web网站内容,我们平时都是对这些内容进行浏览,
HTTP协议运行在典型的C/S架构上,即客户端服务器模式。客户b端通常是我们的主机即手机电脑,服务端即我们的web服务器,这中间则运行着web服务器
web服务器可以分为硬件部分和软件部分,硬件部分主要是一些逻辑性的设备,比如计算机也可以作为web服务器来运行,云服务器也可以作为硬件来部署,软件部分则通过一些应用软件来提供HTTP服务,比较典型的有Nginx和Apache
进行web开发的时候,我们离不开软件部分,对于web服务器客户端的连接和连接的处理过程如下
1.接受客户端连接:在接收客户端之前,需要告诉大家IP号和端口号,对于HTTP服务,如果没有特别指定的话,一般都是80端口。IP地址也可以通过发布域名,让大家通过访问域名来访问web服务器,客户端知道IP地址和端口号就可以连接到web服务器。
2.接收请求报文:客户端会构造一个HTTP报文,然后把它发送到web服务器。
3.处理请求:确定请求所需要的资源
4**.访问web资源**:web服务其实是内容的提供,所以web服务器会对本机的资源进行一个获取,然后把它返回去。
5.构造应答
6.发送应答
HTTP请求方法有主要有
GET:获取指定的服务端资源
POST:提交数据到服务端(比如本地对某个数据进行了修改,我们希望服务端能够把数据保存下来,就可以提交到服务端)
DELETE:删除指定的服务端资源
UPDATE:更新指定的服务端资源
如何指定资源
1.可在地址中指定如
https://coding.imooc.com/class/355.html
https://coding.imooc.com/?sort=0&unlearn=0&page=2
上图即是HTTP请求报文的格式及内容,内容是以JSON格式来保存数据的。
如图是HTTP应答报文的格式,我们重点了解http状态码
而了解HTTP应答报文之前需要了解HTTP状态码
状态吗 | 含义 |
---|---|
200-299 | 成功状态码 |
300-399 | 重定向状态妈 |
200-399 | 客户端错误状态码 |
200-399 | 服务端错误状态码 |
200-299表示请求成功的返回,300-399表示说访问的资源可能在另一个服务器,然后把服务器的地址告诉客户端,请客户端再访问另一个服务器。400-499。比如常见的404错误,表示客户端访问的资源不存在。500-599如果出现这个的话,表示服务端出现错误了,有可能是没有处理的异常等等。
http协议是明文传输的,我们在网络中通常会填写账号密码,个人信息,账户金额,交易信息,敏感信息等等都属于需要保护的信息,如果我们在http协议中进行信息传输,那么很显然是不安全的,网络中各个设备都可以看到这些信息,如果有不法分子把这些信息提取出来,这样就会造成信息泄露等
HTTPS(secure)是安全的HTTP协议
https : //<主机>:<端口>/<路径>
端口一般使用443
1.对称加密:
如果一个数据经历了加密和解密的阶段,如果加密和解密两个秘钥一致,我们就认为它是对称加密。也即加密和解密用同一把钥匙。
2.非对称加密
非对称加密加密和解密的密钥不一致,如果我们把密钥看成是一把钥匙的话,加密和解密使用的不是同一把钥匙。
为了方便理解,我们把加密的看成是A,把解密的看成是B,加密和解密看成是一组密钥,A离不开B,B离不开A,AB有一定的关系。
AB是拥有一定数学关系的一组密钥
私钥:私钥自己使用,不对外公开
公钥:公钥给大家使用,对外公开
我们举个例子来理解:假设老师有一组密钥,然后老师把私钥自己保存下来,公钥老师供给大家,当同学们想给老师发送数据的时候,就可以使用公钥来给数据加密,然后加密之后,就称为密文了,然后再把密文交给老师,然后老师使用私钥来进行解密,解密之后,然后就可以得到使用的数据了。
公钥加密和私钥解密
数字证书是可信任组织颁发给特定对象的认证
可信任是对客户端和服务端而言的,客户端和服务端都认为组织是公平的,够安全的,只有客户端和服务端都认为安全的情况下,才可以是可信任的组织。如果只有服务端认为是安全的,但是客户端不认为是安全的话,就不是可信任的
特定对象既可以是人、服务器和组织,只要是可以使用数字证书的理论上都可以成为对象。
数字证书的内容:
数字证书中包含了对象的公开密钥。
SSL(Secure Sockets Layer:安全套阶层)
SSL层是位于传输层和应用层之间,它是一个子层,提供数据安全和数据完整的服务,以及对传输层数据进行加密后传输。数据安全,保证数据不会被泄露,数据完整指的是数据在传输的过程中,不会被篡改。
以下是HTTPS工作过程
重点是第二个步骤,SSL安全参数握手,我们从这里面可以看到,经历了第二个过程,就可以实现加密和解密了。
如下是SSL安全参数握手的过程
1.对客户端,它首先会生成一个随机数1,然后再把随机数和相关的协议版本以及它所支持的加密算法告诉服务端,这时候数据是明文的,不加密的。
2.服务器也会生成一个随机数,然后也会提供自己的数字证书,然后把客户端的加密算法进行确定。
通过第二步,双方就能确定加密算法是什么算法了。但是此时还没有确定密钥。
当服务器把数字证书发送给客户端,客户端收到之后,夜壶捕获到随机数2,此时客户端和服务端都拥有随机数1和随机数2
3.客户端首先会确认证书是否有效,如果无效,则认为服务器是不安全的。然后生成随机数3,并使用证书里面提供的公钥加密随机数3。然后把加密之后的数据发送给服务端。此时客户端和服务器都拥有了随机数1,2,3.
此时只有服务器自身才可以把随机数3解密,其他人就无法界面了。
4.此时双方的信息对称,都拥有随机数1,2,3,然后根据随机数1,2,3,和相同的算法生成对称密钥,生成对称密钥之后就可以进行加密的传输了。
HTTPS综合使用对称加密和非对称加密
双方分别生成秘钥,没有经过传输,减少了密钥泄露的可能。
上图有一个错误,请注意,是OSPF不是OPSF。 OSPF(Open Shortest Path First,ospf)开放最短路径优先协议,是由Internet工程任务组开发的路由选择协议
总体来说分为以下几个过程:
DNS解析
TCP连接
发送HTTP请求
服务器处理请求并返回HTTP报文
浏览器解析渲染页面
连接结束
具体可以参考下面这篇文章
在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
HTTP 是一种不保存状态,即无状态(stateless)协议。也就是说 HTTP 协议自身不对请求和响应之间的通信状态进行保存。那么我们保存用户状态呢?Session 机制的存在就是为了解决这个问题,Session 的主要作用就是通过服务端记录用户的状态。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了(一般情况下,服务器会在一定时间内保存这个 Session,过了时间限制,就会销毁这个Session)。
在服务端保存 Session 的方法很多,最常用的就是内存和数据库(比如是使用内存数据库redis保存)。既然 Session 存放在服务器端,那么我们如何实现 Session 跟踪呢?大部分情况下,我们都是通过在 Cookie 中附加一个 Session ID 来方式来跟踪。
HTTP/1.0中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接。HTTP 是基于TCP/IP协议的,每一次建立或者断开连接都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大。因此最好能维持一个长连接,可以用个长连接来发多个请求。HTTP 1.1起,默认使用长连接 ,默认开启Connection: keep-alive。 HTTP/1.1的持续连接有非流水线方式和流水线方式 。流水线方式是客户在收到HTTP的响应报文之前就能接着发送新的请求报文。与之相对应的非流水线方式是客户在收到前一个响应后才能发送下一个请求。
端口 :HTTP的URL由“http://”起始且默认使用端口80,而HTTPS的URL由“https://”起始且默认使用端口443。
安全性和资源消耗: HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS高,但是 HTTPS 比HTTP耗费更多服务器资源。