HTTP协议:协议格式约定
概念:超文本传输协议(早期就是为了用来传输Web网页而设计的)
特性:
- 基于明文传输的,调试便捷性搞
- 是一种简单的请求-相应协议
- 基于TCP协议,传输安全性高
格式:
请求格式
-
请求行:主要对请求进行关键性描述
-
请求头部:一个个键值对,对于请求的附加描述以及正文的描述
key:val/r/n
Connection:close(短连接)/keep-alive(长连接)
Content-Length/Content-Type
-
空行:间隔头部与正文
-
正文:提交给服务器的正文
请求行解析:
以空格作为间隔,以\r\n为结尾
第一部分:请求方法:描述不同的请求目的
- GET:向服务器请求一个网页实体资源,请求中没有正文,提交的数据在URL中(安全性不高,长度受限)
- POST:向服务器提供表单数据,请求中有正文
- HEAD:与GET类似,但不同的是,实际相应不要实体资源,只要响应头部。
- PUT:更新服务器上资源
- DELETE:删除服务器上资源
第二部分:URL 统一资源定位符(网址)
完整格式:
http://username:password@domainname:port/s?wd=C%2B%2B#ch
-
http:协议方案名称
-
username:用户名 password: 密码
-
domainname:域名或者是服务器IP地址
域名:IP地址才是网络上一台主机的标识,但IP地址并不容易记忆,因此大佬设计域名系统,使用便于记忆的字符串作为域名,通过域名系统进行域名解析,得到服务器IP地址,然后通过IP地址进行访问。
-
port:很多时候浏览网页,再网址中并没有看到端口,是因为HTTP服务默认为80端口,浏览器默认自动加上
-
/s 资源路径,以/作为起始,明确描述了要请求的资源路径名。/表示请求根目录,但是实际上只是服务器上的对应子目录
/index.html -> /home/dev/workspace/porject/http/wwwroot/index.html
-
wd=C%2B%2B&ecode=utf8: GET请求提交给服务器的数据,学名叫做查询字符串,查询字符串中的数据,是提交给服务器中的数据,放在URL中,但URL中很多特殊字符串都有特殊含义,但是提交的数据中也有这种特殊的字符,因此标准文档规定,查询字符串中的特殊字符需要进行编码。
- URL Encode:url编码
- URL Decode:url解码
-
ch:#之后的数据叫做段标识符,通常用于定位网页中的某个标签id,用于打开网页后,直接跳转到指定位置。
第三部分:协议版本
描述了当前所使用的HTTP版本
HTTP/0.9:一个不成熟的版本,只能使用GE获取网页,而且也没有当前的完善协议格式
HTTP/1.0:完善了协议格式,新增支持了更多的请求方法:GET,HEAD,POST,并且有了缓存的控制,以及流媒体的传输。
HTTP/1.1:当前使用最多的版本,新增支持了更多的请求方法:PUT,DELETE…针对当前网络,以前通讯效率太低,支持长连接,对缓存的管理更加精细(静态资源的缓存管理,CDN服务器,代理服务器的缓存管理)。、
HTTP/1.1版本的迭代,更多的是对传输效率的改进
长连接与短链接:
- 短连接:建立连接–>发送请求–>接受响应–>关闭连接
每获取一个资源,都要重新建立一个新连接,关闭连接,效率很低
- 长连接:建立连接–>发送请求–>接受响应–>发送请求–>接受响应–>…–>关闭连接
- 长连接管线化传输:建立连接–>发送请求–>接受响应–>发送请求1–>接受响应1–>发送请求2–>接受响应2–>关闭连接
短连接:每次请求都要重新建立连接
长连接:在一次连接中可以连续请求-响应,节省了连接不断建立与断开的过程。小路有提升,但还可以改进。
管线化传输:在一次连接中,可以连续发送请求,这样的话,服务器群组就可以提前同时对多个资源进行准备,准备好了就可以按序响应。相较于传统的长连接效率上又有提升。
GET与POST的区别
- get是获取数据,post的修改数据
- get把请求放在url上,以?分割url和传输数据,参数之间以&相连,所以get不太安全,而post是把数据放在HTTP的包体内
- get提交数据最大为2k,post理论上无限制
- get产生一个TCP数据包,浏览器会把http heade和data一起发送出去,服务器相应200;post产生两个包,浏览器会先发送header,服务器相应100 continue,浏览器再发送data,服务器相应200 OK(返回数据)
- get请求会被浏览器主动缓存,而post不会,除非手动设置
POST比GET更加安全?
有人说post比get更加安全,是因为数据在地址栏不可见
然而,从传输角度来说,他们都是不安全的,因为HTTP在网络上是明文传输的,只要在网络上进行抓包,就能获取完整的数据。
要安全传输,就只有加密,也就是使用HTTPS
HTTPS协议:并不是一个新协议,其实就是加密后的HTTPS协议
加密:SSL/TLS加密
加密:身份验证+加密传输
身份验证:采用的CA认证–电子认证服务
通信双方,到第三方权威机构,办理一个CA认证书,建立连接后,先将证书发送给对方,对方的证书进行解析:
1.当前的证书颁发机构是否为自己信任的权威机构
2.到权威机构进行身份认证
加密传输:对传输的数据进行加密
通信双方进行传输加密,需要进行密钥协商
-
对称加密:数据的加密和解密使用的是相同的密钥
- 缺点:进行密钥协商时容易被劫持
- 优点:加密效率高
-
非对称加密:数据的加密和解密的密钥时不一样的
- 缺点:加解密效率低下
- 优点:安全性高,不怕劫持
思想:通过指定算法(RSA),可以生成一对密钥(公钥&密钥)使用公钥进行数据加密,而加密后的数据只能通过私钥进行解密,连接建立后,将自己的公钥发送给对方,对方使用公钥加密要传输的数据,这个数据只能用私钥进行解密出来。
- 混合加密:
思想:假设是用户端对服务端进行验证
-
服务器生成一对非对称密钥,连接建立成功,通信前,将公钥发送给客户端
-
客户端收到后,使用公钥加密一个随机数A,以及自己支持的对称加密算法
-
服务器收到后,使用私钥进行解密,得到了随机数A,以及对方的对称加密算法、
-
服务器向客户端发送一个随机数B,以及自己支持的对称加密算法
客户端和服务器,各自根据两个随机数以及支持的对称加密算法,设计一个对称密钥,走到这一步,对称密钥协商完毕
-
往后的通信使用对称密钥进行加密解密数据传输
收到后,使用私钥进行解密,得到了随机数A,以及对方的对称加密算法、
-
服务器向客户端发送一个随机数B,以及自己支持的对称加密算法
客户端和服务器,各自根据两个随机数以及支持的对称加密算法,设计一个对称密钥,走到这一步,对称密钥协商完毕
-
往后的通信使用对称密钥进行加密解密数据传输
在实际的SSL加密中,身份验证和加密传输时整合在一起的
CA证书中包含了更多信息:通信双方的公钥,机构信息,证书颁发机构信息,失效时间…
整体流程:
- 服务器自己生成一对密钥,拿着公钥,去第三方权威机构颁发证书
- 权威机构根据服务器公钥,生成一个CA证书,给服务器
- 客户端与服务器建立连接后,通信前,服务器先将CA证书发送给客户端
- 客户端收到CA证书后,进行解析验证权威机构是否自己信任,在权威机构验证对方身份,解析公钥
- 客户端生成一个随机数,使用公钥对随机数+加密算法进行加密,发送给服务器
- 服务器收到数据后,使用私钥进行解密,生成一个自己的随机数,将随机数和加密算法发送给客户端
- 客户端收到数据后,客户端和服务器都有对方的随机数和自己的随机数,将随机数和加密算法,进行计算得到一个对称密钥
- 往后通信,使用对称密钥进行传输加密