http https http2.0

一.http状态码

  1. 1xx(信息性状态码,接受的请求正在处理)
  2. 2xx(成功状态码,请求正常处理完毕)
    200 OK
    204 No Content:请求成功但没有资源返回
    206 Partial Content:范围请求
  3. 3xx(重定向状态码,需要进行附加操作以完成请求)
    301 Moved Permanently:永久性重定向()
    302 Found:临时性重定向
    303 See Other:同302,用GET获取资源
    304 Not Modified: 内容没有改,响应不包含主体部分
           (请求头If-None-Match对应响应头Etag,请求头If-Modified-Since对应响应头Last-Modified)
    307 Temporary Redirect:同302
  4. 4xx(客户端错误状态码,服务器无法处理请求)
    400 Bad Request:请求报文存在语法错误
    401 Unanuthority:请求需要通过认证,若之前以请求过1次,表示认证失败
    403 Forbidden:不允许访问
    404 Not Found:服务器无请求资源
  5. 5xx(服务端错误状态码,服务器处理请求出错)
    500 Internal Server Error:服务器在执行请求是发生错误
    503 Service Unavailable:现在在忙无法处理请求
  6. 301和302状态码都是浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的url,这个url可以从响应的Location头部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)。区别在于301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
    302可能会导致url被劫持。

二. http与https

  1. http不足:

    通信使用明文(不加密),内容可能会被窃听;
    不验证通信方的身份,因此有可能遭遇伪装;
    无法证明报文的完整性,所以有可能已遭篡改;

  2. https(用SSL建立安全通信线路之后,就可以在这条路上进行http通信了):
    https = http 加密 认证 完整性保护
  3. SSL 不仅提供加密处理,而且还使用了一种被称为证书的手段,可用于确定通信方的身份;
    SSL采用公开密钥加密,非对称的密钥(私有密钥和公开密钥),发送方使用对方的公开密钥进行加密,对方再用自己的私有密钥解密;
  4. https采用混合加密机制,公开密钥加密相比于共享密钥加密处理速度要慢;
    ① 使用公开密钥加密方式安全地交换在稍后的共享密钥加密中要使用的密钥,
    ② 确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信;
  5. https提供了对服务器的身份认证,保护交换数据的隐私和完整性,针对http的问题,https解决方案:数据加密、客户端服务端都携带证书,对数据进行摘要处理(即使改也没用);
  6. https工作原理:
     [ 1 ] 客户端给出协议的版本号、一个客户端生成的随机数和客户端支持的加密算法;
     [ 2 ] 服务端在客户端给出的加密算法列表中选出一种,并给出数字证书和一个服务端生成的额随机数;
     [ 3 ] 客户端确认数字证书的有效性,然后生成一个新的随机数,并使用数字证书中的公钥加密这个随机数;
     [ 4 ] 服务端使用私钥解密,获取客户端发来的随机数;
     [ 5 ] 客户端和服务端根据约定的加密方法,使用之前的三个随机数,生成对话密钥,这个密钥会用来加密接下来的整个通信过程
  7. https不足:握手费时,证书费钱,https连接缓存不如http高效,加密范围有限,解密慢;
  8. https协议原理:
    [1]客户端请求(带有客户端支持的加密算法列表,随机数A)
    [2]服务器端比对支持的加密算法,选出最合适的加密算法 
    [3]响应(加密算法 公钥 证书 随机数B)
    [4]客户端去验证证书的有效性,生成一个随机字符串pre-master,再根据A B p re-master计算出协商秘钥
    [5]请求(使用公钥加密pre-master使用协商秘钥加密的数据)
    [6]服务器端用私钥解密得到pre-master,使用协商秘钥解密数据
    [7]响应(告知客户端,以后通信就用协商秘钥加密)

三. http1.0 vs http1.1

  1. http1.1支持长连接;
  2. HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
  3. HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).
  4. 缓存处理
  5. 增加一些错误状态码;

四. http2.0 vs http 1.1

  1. 多路复用允许单一的 HTTP/2 连接同时发起多重的请求-响应消息
  2. 二进制分帧层 在 应用层(HTTP/2)和传输层(TCP or UDP)之间。HTTP/2并没有去修改TCP协议而是尽可能的利用TCP的特性
  3. 单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大;由于减少TCP 慢启动时间,提高传输的速度
  4. 首部压缩
  5. HTTP2支持服务器推送

五. 三次握手

  1. syn=j --> ack=j 1 syn=k --> ack=k 1 (三次握手)

六. 四次挥手

  1. tcp客户端发送一个fin,用来关闭客户端到服务器的传送(fin=1 ack=z seq=x)
  2. 服务器收到fin,发回一个ack,确认序号为收到序号加1,和syn一样,一个fin占用一个序号(ack=x 1 seq=z)
  3. 服务器关闭客户端连接,发送fin(fin=1 ack=x seq=y)
  4. 客户端发回ack确认,并将确认序号设为收到序号加1(ack=y seq=x )

七. tcp / udp

  1. 面向连接的tcp和面向非连接的udp
  2. tcp可靠稳定,数据传送完断开连接节约资源,大量数据,缺点是慢,应用http、ftp
  3. udp快,少量数据,不可靠,网络不好容易丢包,应用qq、长视频

八. ws

  1. ajax轮询:每隔几秒发送请求一次
  2. long pull:也是轮询,不过是阻塞模型
  3. ws是右http建立连接,全双工通道,实现持久化

九. spdy

  1. 多路复用降低了延迟同时提高了带宽的利用率;
  2. 每个请求设置请求优先级防止重要请求被阻塞;
  3. header压缩;
  4. 基于https;
  5. 服务端推送;
  6. http-> spdy -> ssl -> tcp

十. spdy vs http2.0

  1. http2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  2. http2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE

十一. tcp粘包拆包问题

  • 由于tcp是以流动的方式传输数据,传输的最小单位为一个报文段(segment)。tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size)指的是,连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,mss则是这个最大限制减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节,也就是180多字节。
    tcp为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。同理,接收方也有缓冲区这样的机制,来接收数据
  1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。
  2. 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。
  3. 进行mss(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>mss的时候将发生拆包。
  4. 接收方法不及时读取套接字缓冲区数据,这将发生粘包。
  • 由于tcp是无界的数据流,且协议本身无法避免粘包,拆包的发生,那我们只能在应用层数据协议上,加以控制。通常在制定传输数据时,可以使用如下方法:

  1. 使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。
  2. 设置定长消息,服务端每次读取既定长度的内容作为一条完整消息。
  3. 设置消息边界,服务端从网络流中按消息编辑分离出消息内容。

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建vue项目(三)路由跳转、反向代理、本地存储、状态管理

数据更新渲染&#xff0c;axios请求数据&#xff0c;配置环境 一、路由跳转 app.vue <template><div id"app"><keep-alive><router-view/></keep-alive></div> </template><script> export default {name: app }…

jinfo:JVM运行时配置的命令行浏览

在最近的几篇博客中&#xff08;特别是在对Java EE 7性能调优和优化以及WildFly性能调优的书的评论中&#xff09;&#xff0c;我引用了自己过去在某些Oracle JDK命令行工具上的博客文章。 令我震惊的是&#xff0c;我从来没有专门解决过漂亮的jinfo工具&#xff0c;这篇文章旨…

javascript---parseInt(08)或parseInt(09)转换返回0的解决办法

javascript parseInt函数使用率非常高&#xff0c;主要功能是将一个string转换为integer。有两个重载&#xff1a; parseInt(s);parseInt(s,radix)第一个方式不再多说&#xff0c;第二个方式&#xff0c;radix是s所基于的进制。范围为2-36&#xff08;不在此范围函数将返回NaN&…

创建vue项目(四)路由相关知识、路由守卫、插槽、打包小细节

一、路由相关点 1. 路由跳转传参以及接参 https://segmentfault.com/a/1190000012393587 方法一&#xff1a; &#xff08;1&#xff09; 参数配置&#xff1a; { path : xx/:参数变量,component:xx}(2) 使用 <router-link toxx/参数></router-link>(3) 传参 …

Luogu5298 [PKUWC2018]Minimax

太久没写博客了&#xff0c;过来水一发。感觉自己推式子的功力还不够。。。 题目链接&#xff1a;洛谷 首先我们想到&#xff0c;考虑每个叶节点的权值为根节点权值的概率。首先要将叶节点权值离散化。 假设现在是$x$节点&#xff0c;令$f_i,g_i$分别表示左/右节点的权值$i$的概…

js实现类名的添加与移除

方法1&#xff1a;使用className属性&#xff1b; 方法2&#xff1a;使用classList API&#xff1b; //用于匹配类名存在与否 function reg(name){return new RegExp((^|\\s) name (\\s |$)); }//hasClass addClass removeClass toogleClass var hasClass,addClass,removeCla…

js封装常用函数

自己封装函数时&#xff0c;参数最好不要超过3个&#xff0c;若要超过&#xff0c;可以用数组或者对象&#xff1b; 1. 利用&#xff08;Math.random&#xff09;写指定范围的随机数 2. 补零 3. 数组去重 4. 排序 5. 敏感词过滤 6. 判断数组中是否存在某一条数据&#xff0c;结…

redis学习(一)

1.redis安装&#xff08;来自 https://www.runoob.com/redis/redis-install.html&#xff09; window下安装 下载地址&#xff1a;https://github.com/MSOpenTech/redis/releases。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择&#xff0c;这里我们下载 R…

多项式相加链表

#include <stdio.h> #include <stdlib.h> typedef struct Node //一个项节点 { int modulus; //系数 int cover; //幂 struct Node* next; }List; void creatList(List *&l) //创建多项式链表 { List* r; List* s; int n; l (List*)malloc(sizeof(Node)); r …

JPA教程–在Java SE环境中设置JPA

JPA代表Java Persistence API&#xff0c;它基本上是一个规范&#xff0c;描述了一种将数据持久存储到持久存储&#xff08;通常是数据库&#xff09;中的方法。 我们可以将其视为类似于Hibernate的 ORM工具的东西&#xff0c;除了它是Java EE规范的正式组成部分&#xff08;并…

h5上传图片及预览

第一次做图片上传&#xff0c;记录一些问题。 1&#xff0c;图片的base64编码就是可以将一副图片数据编码成一串字符串&#xff0c;使用该字符串代替图像地址。而网页上的每一个图片&#xff0c;都是需要消耗一个http请求下载而来的&#xff0c;使用base64就不用请求http。 2&a…

JSON(一)

JSON&#xff1a;JavaScript Object Notation(JavaScript 對象表示法&#xff09; JSON是存儲和交換文本信息的語法。類似于XML。 JSON比XML更小&#xff0c;更快&#xff0c;更易解析。 什麼是JSON &#xff1f; JSON指的是JavaScript對象表示法 是輕量級的文本數據交換格式…

滚动条造成页面抖动问题

总结&#xff1a; 若用到 margin:0 auto; 使页面居中&#xff0c;若部分页面出现滚动条&#xff0c;滚动条默认有 20px&#xff0c;这样会造成页面抖动&#xff1b; 解决办法&#xff1a;参考 1. html{overflow:scoll;} 让页面一直显示滚动条。 overflow 的几个属性值&#xf…

编写数据访问代码测试–单元测试是浪费

几年前&#xff0c;我是为我的数据访问代码编写单元测试的那些开发人员之一。 我正在孤立地测试所有内容&#xff0c;我对自己感到非常满意。 老实说&#xff0c;我认为自己做得很好。 哦&#xff0c;男孩&#xff0c;我错了&#xff01; 这篇博客文章描述了为什么我们不应该为…

[JSON].typeOf( keyPath )

语法&#xff1a;[JSON].typeOf( keyPath ) 返回&#xff1a;[String | Number | Boolean | Json | Array | Function | 空字符] 说明&#xff1a;获取指定键名值的类型 示例&#xff1a; Set jsonObj toJson("{a: test, b: 1, c:true, d:[1,2,3,4], e:{a1:2}}"…

简单电商购物程序

sum0i1""shuruinput("请输入“手机”或“电脑”&#xff1a;")if shuru"手机": while True: sp{"iphoneX"7998,"华为P30"6998} print(sp) ainput("输入Buy进入结算,继续购买请输入物品名称&#xff1a;") if i&qu…

ie 浏览器布局中的 offset

出现原因&#xff1a; 此处的offset的值表示的是盒子模型经过计算后的实际偏移量&#xff0c;通常是margin及定位偏移量之和&#xff08;flex布局导致的偏移也会计算在内&#xff09;。在此处也无需消除。 解决办法&#xff1a; 父元素设置宽高。设置margin为负数&#xff0…

【Set jsonObj = toJson( jsonString )】创建JSON实例

创建JSON实例&#xff1a; 原型: toJson( jsonString ) 说明: 创建JSON实例 返回: [JSON] 参数:jsonString [可选] 可以用json格式字符串创建实例 示例&#xff1a; <% 方法一&#xff1a;创建一个空的JSON实例 Set jsonObj1 toJson() 方法二&#xff1a;用JSON字符串创建…

当我们的代码遇到问题的时候....;要想不遇到问题,写代码的时候要.....

当我们的代码遇到问题的时候&#xff1a;1&#xff0c;不要怨天怨地。出了问题&#xff0c;当然有可能是系统的bug&#xff0c;API的问题&#xff0c;但是那些几率往往比你犯低级错误的几率要低多了&#xff0c;先从自己身上找原因&#xff0c;是不是自己写错了。   2&#x…

为什么我不信任通配符,以及为什么我们仍然需要通配符

在将子类型多态性&#xff08;面向对象&#xff09;与参数多态性&#xff08;泛型&#xff09;相结合的任何编程语言中&#xff0c;都会出现方差问题。 假设我有一个字符串列表&#xff0c;键入List<String> 。 我可以将其传递给接受List<Object>的函数吗&#xff…