http
一句话概述HTTP:
-
HTTP通常跑在
TCP/IP协议栈
之上 -
依靠
IP协议实现寻址和路由
-
TCP协议实现可靠数据传输
-
DNS协议实现域名查找
-
SSL/TLS协议实现安全通信
HTTP特点:
-
一种请求/响应模式的协议
-
超文本传输协议,允许传输文本、图片、音频等,传输的类型由Content-Type标记
-
无状态,HTTP请求不具备保存之前发送过的请求或响应的功能,每一次请求都是独立无关的
- 1.1 版引入了持久连接(Connection: keep-alive)
HTTP缺点:
-
文明传输(不加密),内容可能被窃听(报文不使用二进制数据,而是文本形式)
-
无法验证报文的完整性,内容可能被篡改(接收方没有办法确认对方发送过来的数据在中间有没有被篡改)
-
不验证通信方的身份,有可能遭遇伪装(服务器只要收到了请求就会返回一个响应)
-
队头阻塞 (同一个TCP长连接中,前一个请求没有得到响应,后面的请求就会被阻塞。HTTP/2中的多路复用解决了这个问题)
队头阻塞解决方案:
1.一是减少请求数,比如合并脚本和样式表、将图片嵌入CSS代码;
2.同时发起多个长连接,用数量来解决质量的问题,不能滥用,并发量太大,服务器压力很大;
3.域名分片,还是用数量来解决质量的思路,多开几个域名指向同一台服务器,这样实际长连接的数量就上去了;
HTTPS与HTTP区别:
-
Http/1.1(下面简称h1)数据传输可以是文本或者二进制,Http/2(简称h2)使用ssl加密传输协议,只能传输二进制,可以防止内容被窃听的风险;
-
h2复用TCP链接(多路复用),一个链接可以同时发送多个请求,而且不用按顺序一一对应,避免队头阻塞;
-
完全不同的连接方式,端口也不一样,h1是80,h2是443;
-
h1是无状态的,h2是基于ssl + http协议构成,可进行加密、身份认证,比h1安全;
https:
- 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
- 数据完整性:内容传输经过完整性校验
- 身份认证:第三方无法伪造服务端(客户端)身份
HTTP请求方法:
-
GET: 获取资源 (幂等)
-
POST: 创建或更新资源(非幂等)
-
PUT: 创建或更新资源本身(幂等)
-
PATCH: 对资源进行局部更新(非幂等)
-
DELETE: 删除资源 (幂等)
GET和POST的区别:
-
从缓存的角度上说,GET会被浏览器主动缓存下来,但是POST不会;
-
从参数的角度上说,GET一般放在URL上传递参数,大小有限制;POST可以放在请求体里,大小本质上无限制;
-
从幂等的角度上说,GET是幂等的,而POST不是;
-
不过据我了解的,其实GET和POST本质上都是TCP连接;
HTTP状态码:
2xx:
200
:请求成功,通常返回的数据中带有响应体
3xx:
301
:永久重定向,最新的URI为响应报文首部的 Location
字段。浏览器默认会做缓存
302:临时重定向,浏览器不做缓存;
303:临时重定向,明确表示客户端应该使用GET方法获取资源;
307: 临时重定向
,请求方法和实体都不允许变动
304:表示请求的资源在服务器上并未发送改变,告诉请求者可以使用缓存;
4xx:
400
:请求报文中存在语法错误。例如 JSON字符串用 null 当做key
401
:用户认证失败。
403
:请求资源被拒绝,原因是:比如法律禁止、信息敏感。
404
:请求资源未找到,表示没在服务器上找到相应的资源。
501:
请求的功能还不支持503
:服务器内部处于超负载状态或进行停机
HTTP中的幂等:
一个方法是不是幂等,其实就是判断一个方法重复执行多次,产生的效果是不是一样的,如果是幂等的话,它本质上意味着成功执行请求的结果和它的执行次数无关。只有「POST」和「PATCH」是非幂等的,其它都是幂等操作
request headers相关:
Accept :
浏览器端可以接受的媒体类型:*/* 所有类型,(一般都发这个);Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html;服务器无法返回text/html类型的数据,服务器应该返回一个406错误
Accept-Encoding:gzip,deflate
声明浏览器支持的编码类型 :服务器中返回gzip压缩的网页,浏览器会自动解压缩,请求时添加对应的头,表明自己接受压缩后的数据
Connection: keep-alive
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
If-Modified-Since:
把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。
如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中
If-None-Match:
If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能
例如: If-None-Match: W/"3119-1437038474000"
Content-Type:
1. application/x-www-form-urlencoded: POST 提交数据的方式,原生Form表单提交,如果不设置 enctype 属性,默认为application/x-www-form-urlencoded 方式提交数据。提交的表单数据会转换为键值对并按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码;
2. multipart/form-data:Form 表单的 enctype 设置为multipart/form-data, 是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思,只有使用了multipart/form-data,才能完整的传递文件数据。
3. application/json:告诉服务端消息主体是序列化后的 JSON 字符串;
4. 其他不常见就略过.......
referer:
该Referer会告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。可以做防盗链、防止恶意请求等
参考:https://juejin.cn/post/6844903830916694030