什么是http
超文本传输协议,是一种在客户端(例如浏览器)和服务器之间进行数据编码和传输的协议。因为信息以超文本文档的形式进行交换,所以叫这个。
http是在计算机世界里专门用来在两点之间传输数据的约定和规范。
http是应用层协议,正常运行依赖传输控制(tcp)等网络层协议。
http资源使用统一资源定位符Url在互联网上进行标识。
http遵循“请求-响应”的范式,即客户端发出请求,服务器发送响应。请求和响应中间可能经过多个路由和代理服务器,它允许中介服务器提供增值服务(如负载均衡、缓存、加密、压缩等)。
http五类状态码
1xx 提示信息,协议处理的中间状态
2xx 传输成功
3xx 重定向 资源位置发生变动,需要客户端重新发送请求 301 302 304
4xx 客户端错误 请求报文有误,服务器无法处理 400 403 404
5xx 服务器错误,服务器处理请求时内部发生错误。500 501 502 503 504
http常见字段
Host:客户端发送请求时,用来指定服务器的域名
Content-Length:服务器返回数据时,标识回应数据的长度,通过Content-Length找到HTTP body的边界。解决“粘包”问题。
Connection :常用于客户端要求服务器使用[HTTP长连接]机制(Keep-Alive)HTTP/1.1版本默认连接是长连接,但为了兼容老版本的HTTP,需要指定Connection值为Keep-Alive。开启HTTP-Alive后连接不会中断,当客户端发送另一个请求时,会使用同一个连接,知道客户端/服务端提出断开连接。
Accept:客户端请求时,可以使用Accept声明自己可以接收哪些格式。(*/*)
Content-Type:服务器回应时,告诉客户端,本次数据时什么格式。(text/html;Charset=utf-8)
Accept-Encoding:客户端能接受的压缩数据方法。
Content-Encoding:说明数据的压缩方法。表示服务器返回时使用了什么压缩格式。(gzip)
GET方法是安全、幂等、可被缓存的
POST方法是不安全、不幂等、不可缓存的
安全指的是会不会破环服务器上的资源 | 幂等是多次执行相同的操作,结果是相同的
HTTP缓存有两种实现方式:强制缓存和协商缓存
强制缓存:浏览器判断缓存没过期,就直接使用浏览器的本地缓存,主动权在浏览器这边
(Status code:200(from disk cache)使用了强制缓存)
强制缓存利用两个HTTP响应头部实现,表示资源在客户端的缓存有效期:
Cache-Control:是一个相对时间 (优先级更高)
Expires:是一个绝对时间
协商缓存:当服务端的响应码是304时,表示告诉客户端可以使用本地缓存的资源,这种服务端告诉客户端是否可以使用缓存的方式称为协商缓存。
版本:
HTTP/1.1 无状态、 明文传输
无状态:好处是服务器压力小,坏处是关联性的操作会麻烦(Cookie是一种解决无状态的方案)
明文传输等不安全问题,通过HTTPS的方式解决。
1.1对比1.0 的改进:
使用长连接,改善了短连接造成的性能开销
支持管道网络传输,第一个请求发出去后,不必等其回来,就可以发出第二个请求
HTTP/2 性能改进:
头部压缩、二进制格式、并发传输(支持交错的请求和响应)、服务器主动推送资源
HTTP/3 底层使用UDP
http请求
一次http操作分为四个步骤:
- 建立连接
TCP的三次握手
first:客户端发送SYN=j码给服务端,表示想要建立连接,进入SYN_SEND状态
second:服务端返回ACK(=j+1)应答,同时发送自己的SYN(=k),表示可以建立连接,进入SYN_RECV状态
third:客户端收到SYN和ACK后,回传ACK=k+1给服务端,说明自己已经收到ACK,之后进入ESTABLISHED状态,完成三次握手。
为什么会有三次握手而不是两次握手呢?
因为TCP有超时重连机制,防止旧的重复连接初始化造成混乱(可能建立一个历史连接导致资源浪费)。
https在tcp连接的基础上,要加上SSL/TLC建立连接的四次握手(总共7次)
握手过程中,针对会话使用的对称密钥,使用非对称加密
会话过程中使用对称加密。
数字证书保证公钥一定来自服务器。(服务器注册到CA,CA(数字证书认证机构)办法数字证书。服务器下发公钥和CA数字证书,客户端使用CA的公钥确认真实性,只要证书可信,公钥就可信)
first:客户端发送可用的加密算法
second:服务端选择的加密算法和公钥
third:客户端发送用公钥加密要使用的对称加密算法和密钥信息
fourth:服务端用私钥解密,开始使用对称加密来发送信息,握手结束
- 发送请求
请求报文格式:
请求行 -- 请求头 - - 报文主体
请求行三部分: 请求方法、请求地址、协议版本
请求方法HTTP/1.1定义的有8种:GET POST PUT DELETE PATCH HEAD OPTIONS TRACE
PATCH: 局部修改,对PUT的补充
HEAD: 只获取头
OPTIONS: 对服务器支持请求方法的嗅探
TRACE:回显服务器收到的请求,用于定位问题,有安全风险
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
- 响应
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体
- 断开连接
4次挥手
first:客户端发送FIN报文,进入FIN_WAIT_1状态
second:服务端收到后,发送ACK应答报文,进入CLOSE_WAIT状态
(收到ACK后客户端进入FIN_WAIT_2状态)
third:服务端处理完数据后,再向客户端发送FIN报文,进入LAST_ACK状态
fourth:客户端收到FIN报文后,回复一个ACK应答报文,进入TIME_WAIT 状态(2MSL后进入CLOSE)
名词预热:
超文本:可以显示在电脑上或其他电子设备上的文本,普遍以电子文档的方式存在。拥有超链接,可以从一个超文本跳转到另一个超文本。HTML就是常见的超文本。
TCP协议:面向连接的,可靠的、基于字节流的传输层通信协议。
基于字节流:与UDP面向报文不同,消息通过UDP协议传输时,操作系统不会对消息进行拆分,每个UDP报文就是一个用户消息的边界。多个UDP报文会插入队列。 而通过TCP协议传输时,消息可能被操作系统分组成多个TCP报文。如果接收方不知道发送方的消息长度,就不知道消息的边界,无法读出一个有效的用户消息。当两个消息的某个部分被分到同一个TCP报文时,就会出现常说的TCP粘包问题。
解决这个问题,要交给应用程序。一般有三种分包的方式:
固定长度的消息
特殊字符作为边界(HTTP)
自定义消息结构
SSL/TLS: 安全套接字,是一种用于在网络上的两个设备之间创建安全连接的技术。(SSL是一种较老的技术)TLS传输层安全协议是SSL的升级版。SSL技术已启用,但说法还存在。
网络七层模型 按功能不同,人为划分,实际并不存在。
应用层 应用层 应用层 http
表示层
会话层
传输层 传输层 传输层
网络层 网络层 网络层 tcp
数据链路层 数据链路层 网络接口层
物理层 物理层
对称加密: 使用相同的密钥进行加密、解密
非对称加密:也叫公开密钥加密。需要两个密钥,一个公开密钥,一个私有密钥。公钥加密、私钥解密。
面试时可能提问的点:
头
HTTP的Keep-Alive跟TCP的Keepalive区别?
HTTP的Keep-Alive也叫Http的长连接,是由应用程序实现的,可以使用同一个TCP连接发送和接收多个HTTP请求/应答,减少了Http短连接带来的多个TCP连接建立和释放的开销
TCP的Keepalive也叫TCP保活机制,该功能由内核实现的,当客户端和服务端长达一定时间内没有进行数据交互时,内核为了确保连接还有效,就会发送探测报文,检测对方是否在线来决定是否关闭连接。
如有不明白的地方,请留言提问,后续会尽量补充。