什么是HTTP协议?
HTTP(HyperText Transfer Protocol),即超文本传输协议,最初是为了提供一种发布和接收HTML页面的方法。
它使用TCP协议作为自己的传输层,默认情况下使用TCP的80端口,而HTTPS默认使用TCP的443端口。
它的特性为①文本协议,②无状态,③无连接。
文本协议是相对二进制协议而言的,相较而言,文本协议便于理解,但传输、解码效率较低。
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是发送完不会记录任何信息。 HTTP 是一个无状态协议,这意味着每个请求都是独立的。
无连接是指服务器挨个处理访问队列里的访问,处理完一个就关闭连接,然后处理下一个新的。无连接的含义是限制每次连接只处理一个请求。当然HTTP真正的连接是通过运输层的TCP协议实现的,TCP的面向连接是基于网络底层的数据传输,HTTP的无连接是基于应用层面的沟通交互。
HTTP请求过程
1、建立TCP连接。
2、接收请求。从TCP连接中读取HTTP请求报文。
3、处理请求。解析HTTP报文。
4、访问资源。访问本地资源。
5、构建响应。根据HTTP报文的请求,构建对应的response。
6、发送响应。把response发送给对方。
HTTP报文结构
可使用wireshark进行抓包过滤。可用协议过滤/端口过滤/地址过滤等,也可以使用&&、||等使用多种过滤规则。过滤在抓包前/抓包后均可进行,但需注意在抓抱前过滤和抓包后过滤的wireshark语法有所不同。
请求报文结构
post请求报文结构: 请求行+请求头+请求体(body)
其中换行符为\r\n,而不是单纯的\n,每行最后都有换行符存在。而为了方便区分请求头和body,在这之间会有两个\r\n。
以下是请求报文示例:
请求行中的请求方法必须大写,常用请求方法有:GET、POST、PUT、HEAD、DELETE、OPTIONS
GET请求和POST请求报文的区别
①GET请求的报文没有报文体,当需要给服务器传参时,参数被携带在URL中。
②GET请求URL传参有长度限制,post没有。
③GET请求的参数只能是ASCII码,如果是中文需URL编码,POST请求无限制,可任意编码。
响应报文结构
响应行+响应头+响应体
响应报文示例:
HTTP认证方法
1、基本(Basic)认证
客户端请求需要带Authorization请求头,值为“Basic xxx”,xxx为“用户名:密码”进行Base64编码后生成的值。 若客户端是浏览器,则浏览器会提供一个输入用户名和密码的对话框,用户输入用户名和密码后,浏览器会保存用户名和密码,用于构造Authorization值。当关闭浏览器后,用户名和密码将不再保存。
用户名/密码经过Base64加码后,这个Base64码值可以轻易被解码并获得用户名/密码,所以此认证方式并不安全。
2、摘要(Digest)认证
第一步:客户端访问Http资源服务器。由于需要Digest认证,服务器产生一个随机数nonce,服务器将这个随机数放在WWW-Authenticate响应头,与服务器支持的认证算法列表,认证的域realm一起发送给客户端。
第二步: 客户端发现是401响应,表示需要进行认证,则弹出让用户输入用户名和密码的认证窗口,客户端选择一个算法,计算出密码和其他数据的摘要(response),将摘要放到Authorization的请求头中发送给服务器,如果客户端要对服务器也进行认证,这个时候,可以发送客户端随机数cnonce。
第三步:服务接受摘要,选择算法,获取数据库用户名密码,重新计算新的摘要跟客户端传输的摘要进行比较,验证是否匹配。若验证通过则可访问资源。
Digest认证可以防止密码泄露和请求重放。
但Digest认证每次都会发送Authorization请求头,重新构造nonce值,所以较为麻烦。
3、WSSE认证
相对来说用得较多,只有客户端产生nonce。
长连接与短连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开,等待在同域名下继续用这个通道传输数据,从第二次访问开始就不再需要三次握手;相反的就是短连接,即每次请求都需要建立一个TCP连接,因此较慢。在并发量大,但是每个用户又不需频繁操作的情况下需要短连接。
HTTPS
HTTPS就是在HTTP和socket层之间构建一层安全socket层。即HTTPS=HTTP+SSL/TLS,如下图所示。
HTTPS的加密方法
非对称加密方法(耗时耗资源,但难以被破解)
1、接收方生成一对公钥+私钥,并把公钥发给发送方。
2、发送方使用公钥加密发送信息
3、接收方使用私钥进行解密。
但由于非对称加密的加解密效率较低,且在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。
对称加密(实际采用的加密方法)
① 证书验证阶段:
1)浏览器发起 HTTPS 请求;
2)服务端返回 HTTPS 证书;
3)客户端验证证书是否合法,如果不合法则提示告警。
② 数据传输阶段:
1)当证书验证合法后,在本地生成随机数;
2)通过公钥加密随机数,并把加密后的随机数传输到服务端;
3)服务端通过私钥对随机数进行解密;
4)服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。
HTTP2与HTTP1.x的区别
(1)HTTP2使用的是二进制传送,HTTP1.x是文本(字符串)传送。
二进制传送的单位是帧和流。帧组成了流,同时流还有流ID标示。
(2)HTTP2支持多路复用
因为有流ID,所以通过同一个http请求实现多个http请求传输变成了可能,可以通过流ID来标示究竟是哪个流从而定位到是哪个http请求。
(3)HTTP2支持服务器推送
HTTP2支持在未经客户端许可的情况下,主动向客户端推送内容。