HTTP协议
一种无状态的,以请求/应答方式运行的超文本传输协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。
HTTP报文格式
基本组成
HTTP请求报文和响应报文的结构基本相同,由三大部分组成:
- 起始行(
start line
):描述请求或响应的基本信息 - 头部字段集合(
header
):使用key-value
形式更详细的说明报文 - 消息正文(
entity
):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
起始行
1.请求报文起始行
1.1 格式
method | 空格 | URL | 空格 | VERSION | 换行 |
---|
请求方式:method,比如GET、POST、PUT、HEAD,表示对资源的操作。
请求目标:通常是一个URI,标记了请求方法要操作的资源
版本号:表示报文使用的HTTP协议版本
1.2 常见的HTTP请求方式
GET:向服务器获取数据
POST:将实体提交到指定的资源,通常会造成服务器资源的修改
PUT:上传文件,更新数据
DELETE: 删除服务器上的对象
HEAD:获取报文首部,与GET相比,不返回报文主体部分
OPTIONS:询问支持的请求方法,用来跨域请求
CONNECT:要求在代理服务器通信时建立隧道,使用隧道进行TCP通信
TRACE:回显服务器收到的请求,主要用于测试或诊断
1.3 HTTP几个版本的区别
- http1.0版本
短链接:每个请求建立一个连接,完成后立刻断开,导致连接无法复用。
请求方式:除了get,还引入了post、head。 - http1.1版本
长链接:引入了持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive
请求方式:剩下的几个
节约带宽:只发送header信息,支持请求资源的一部分。 - http2.0版本
支持多路复用 :一个TCP连接可以发送多个流,也就是可以发送多个请求,提高传输性能。 - http3.0
定义:基于UDP的安全可靠的http2.0协议
时间:减少了TCP三次握手和TLS的时间。
多路复用
优化重传策略
1.4 URL的组成部分
- 协议部分,例如http:,后面的//为分隔符
- 域名部分:从//后到第一个/,也可以使用ip地址
- 虚拟目录部分:从第一个/到最后一个/为止,不是必须的
- 文件名部分:从域名后的第一个/到?为止,是文件部分
- 锚部分:从#开始到最后
- 参数部分:从?开始到#为止,又称搜索部分,多个参数以&为分隔符。
2.响应报文起始行
2.1 格式
VERSION | 空格 | STATUS CODE | 空格 | REASON | 换行 |
---|
版本号:表示报文使用的HTTP协议版本
状态码:一个三位数字,用代码的形式表示处理的结果,比如200是成功,500是服务器错误
原因:作为数字状态码的补充,比如200是成功,500是服务器错误
2.2 常见状态码
- 1xx Information(信息性状态码) 接受的请求正在处理
- 2xx Success(成功状态码) 请求正常处理完毕
200:ok
204:no content,该状态码表示客户端发送的请求已经在服务器端正常处理了,但是没有返回的内容,响应报文中不包含实体的主体部分。一般在只需要客户端往服务器端发送消息,而服务器端不需要往客户端发送内容时使用。 - 3xx Redirection(重定向状态码) 需要进行附加操作-完成请求
301:永久重定向
302:临时重定向
303:该状态码表示由于请求对应的资源存在着另外一个uri,应使用get方法定向获取请求资源。
304:浏览器缓存相关,该状态码表示客户端发送附带请求时,服务器端允许请求访问资源,未满足条件的情况。
307:临时重定向,不改变请求方式
308:永久资源重定向 不会改变请求方式 - 4xx Client Error(客户端错误状态码) 服务器无法请求处理
400:客户端语法错误
401:请求要求用户身份认证
403:服务器拒绝请求
404:服务器找不到资源 - 5xx Server Error(服务器错误状态码) 服务器处理请求出错
500:服务器内部错误,无法完成请求
502:响应无效
头字段
头部字段是key:value的形式,key和value之间用“:”分隔,最后用CRLF换行表示字段结束。比如前后分离时经常遇到的要与后端协商传输数据的类型"Content-type:application/json"
,这里Content-type就是key,application/json就是value。HTTP头部字段非常灵活,不仅可以使用标准里已有的Host、Content等头,也可以任意添加自定义头,这就给HTTP协议带来了无限可能。
1. 头字段注意事项:
- 字段名不区分大小写,字段名里(key)不允许出现空格、下划线_,字段名后面必须紧跟着:,不能有空格,字段值前后的空格没有严格要求
- 字段之间无顺序
- 字段原则上不能重复,除非字段本身允许,比如Set-Cookie
2. 常用字段:
- 请求字段:请求头中的头字段,如:Host、Referer
- 响应字段:响应头中的头字段,如:Server
- 通用字段:在请求头和响应头中都可以出现,如:Content-type、Connection;
HTTP请求的完整过程
当用户在浏览器输入网址回车之后,网络协议都做了哪些工作呢?
- 首先是浏览器应用程序,解析当前URL中的域名
- 根据域名获取对应的IP地址,先从浏览器缓存中查找,没有的话就去DNS中找,一层层往上
- 拿到IP地址后,与服务器建立TCP三次握手
- 握手建立之后,开始组装HTTP请求报文,发送报文
- 服务器拿到请求报文之后,请求报文解析,生成响应数据,发送响应数据
- 浏览器收到响应报文后,开始渲染页面
- TCP四次挥手关闭连接
TCP协议
特点
- 面向连接的:数据传输之前要先建立连接
- 全双工的:双向传输
- 字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
- 流量缓冲:解决双方处理能力不匹配问题,设置了缓冲区
- 可靠的传输服务:停止等待协议、重传机制(超时重传、ACK重复重传)、滑动窗口协议与累计确认
- 拥塞控制:防止网络出现恶行拥塞,发送方减小发送速度
TCP报文格式
三次握手
过程
为什么要是三次不是两次呢
TCP是全双工的,要确认通信双方都有接收报文和发送报文的能力,如果只有两次,那么只能确认客户端(发送了也接受了发送的确认)能确认自己工作正常,服务端(接收了,发送了报文但是没有对方给的确认收到信息)是不能确认自己的发送能力的,这样很有可能在后续数据传送时不能收到ACK。到那时
四次挥手
过程
客户端发送FIN表示客户端请求关闭连接,服务器收到后返回一个ACK,然后做收尾工作,做完以后发送FIN表示服务器请求关闭连接,客户端收到后发送ACK表示同意,服务端收到ACK关闭连接,客户端等待2MSL后关闭连接。
为什么有个等待2MSL之后才关闭连接
- 如果最后的ACK丢失了,就收不到服务器重传的FIN了
- 可能还有一部分数据是存活的还没有收到,如果立刻关闭连接,数据就丢失了
为什么是2MSL而不是1MSL
如果ACK丢了,还要等对面重发FIN的时间
HTTPS协议
与HTTP的区别
在原先的HTTP协议层和TCP协议层之间多了一个SSL/TLS层
加密算法
对称加密
双方拿到的密钥一样,用同一个密钥编码解码。
非对称加密
分公钥和私钥,公钥是公开的而私钥是严格保密的。公钥编码只能私钥解码,私钥编码只能公钥解码。
TLS过程
客户端服务器先三次握手建立连接,然后客户端发送自己支持的加密套件列表,服务器从其中选择一个支持的加密套件,加上自己的公钥数字证书返回给客户端,客户端通过办法数字证书机构给的公钥解密拿到服务器的公钥,然后生成一个用于后续数据的对称加密传输的密钥,用服务器给的公钥加密,发送给服务器,服务器拿到后用私钥解密,后面就可以用整个密钥进行对称加密数据传输了。
CA数字证书
包括了 公钥、组织信息、CA信息、有效时间、证书序列号,同时生成一个数字签名。
签名步骤:hash(你用于申请证书时所提交的明文信息)= 信息摘要;CA再使用私钥对信息摘要进行加密,密文就是证书的数字签名。