TCP保证传输的可靠性
TCP 如何保证可靠性检验和TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中也是全为1则正确),否则存在错误。
确认应答与序列号TCP将每个数据包都进行编号,这就是序列号
序列号的作用:
保证可靠性(当接收到的数据少了某个序号的数据时,能马上知道)
保证数据的按序到达
提高效率,可实现多次发送,一次确认
去掉重复数据
TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。
超时重传当报 ...
HTTP1.0 1.1 2.0
HTTP1.01.0的HTTP版本,是一种无状态,无连接的应用层协议。HTTP1.0 规定浏览器和服务器保持短暂的连接
浏览器每次请求都需要与服务器建立一个TCP连接,服务器处理完成以后立即断开TCP连接(无连接),服务器也不跟踪每个客户端,也不记录过去的请求(无状态)
这种无状态性可以借助cookie/session机制来做身份认证和状态记录
存在问题无法复用连接
每次发送请求,都需要进行一次TCP连接,而TCP的连接释放过程又是比较费事的,这种无连接的特性会使得网络的利用率变低
对头阻塞(head of line blocking)由于HTTP1.0规定下一个请求必须在前一个响应到达之前才能发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。
HTTP1.1HTTP1.1继承了HTTP1.0的简单,克服了HTTP1.0性能上的问题
长链接HTTP1.1增加了Conection字段,通过设置keep-Alive保持HTTP连接不断,避免每次客户端与服务器请求都要重复建立释放TCP连接。提高了网络利用率。
如果客户端向关闭HTTP连接,可以在请求头中携带Co ...
Redis缓存穿透,雪崩
缓存雪崩什么是缓存雪崩由于
设置缓存时,key都采用了相同expire
更新策略
数据热点
缓存服务宕机
等原因,可能导致缓存数据同一时刻大规模不可用,或者都更新
解决方案
更新策略在时间上做到比较均匀
使用的热数据尽量分散到不同的机器上
多台机器做主从复制或者多副本,实现高可用
实现熔断限流机制,对系统进行负载能力控制
在原有失效时间基础上增加一个随机值,比如1~5分钟的随机,这样每个缓存的过期时间重复率就会降低,集体失效概率也会大大降低。
缓存穿透什么是缓存穿透大量并发查询不存在的KEY,导致都直接将压力透传给数据库
为什么多次透传?不存在一直为空。需要注意让缓存能够区分KEY不存在和查询到一个空值
例如:访问id=-1的数据。可能出现绕过Redis依然频繁访问数据库,称为缓存穿透,多出现在查询为null的情况不被缓存时。
解决方案
缓存空值的KEY,这样第一次不存在也会被加载会记录,下次拿到有这个KEY
Bloom过滤或RoaringBitmap判断Key是否存在
最常见的布隆过滤器,将多有可能存在的数据哈希到一个足够大的Bitmap中,一个一定不存在的数据会被这个Bit ...
3.计算机网络 —— 传输层
传输层三次握手
三次握手是TCP连接的建立过程。在握手之前,主动打开连接的客户端结束CLOSE阶段,被动打开的服务器也结束CLOSE阶段,并进入LISTEN阶段。随后进入三次握手阶段:
首先客户端向服务器发送一个SYN包,并等待服务器确认,其中:
标志位为SYN,表示请求建立连接。
序号为Seq = x (x 一般为1)
随后客户端进入SYN-SENT阶段
服务器接收到客户端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文,其中:
标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接。
序号为Seq = y
确认号为ACK = x + 1, 表示收到客户端的序号Seq并将其值加1 作为自己确认号Ack的值,随后服务器端进入SYN-RECV阶段。
客户端接收到发送的SYN+ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段。并返回最后一段报文。其中:
标志位为ACK,表示确认收到服务器端同意连接的信号
序号为Seq = x + 1,表示收到服务器端的确认号ACK ...
2.计算机网络 —— 应用层
应用层HTTP头部包含那些信息HTTP头部本质上是一个传递额外重要信息的键值对。主要分为:通用头部、请求头部、响应头部、实体头部
通用头部
协议头
说明
举例
Cache-Control
用来指定当前的请求/回复中是否使用缓存机制
Cache-Control:no-store
Connection
客户端(浏览器)想要优先使用的连接类型
Connetion: keep-alive(Upgrade)
Date
报文创建时间
Date:Dec,26 2015 17:30:00 GMT
Trailer
会实现说明在报文主体后记录那些首部字段,该首部字段可以使用在HTTP/1.1版本分块传输编码时
Trailer:Expiress
Transfer-Encoding
用来改变报文格式
Transfer-Encoding: chunked
Upgrade
要求服务器升级到一个高版本协议
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Via
告诉服务器,这个请求是由哪些代理发出的
Via: 1.0 fred, 1.1 ...
1.计算机网络 —— 协议层次以及服务
OSI七层模型
OSI模型全称为开放式通信系统互连参考模型,是国际标准化(ISO)提出的一个视图使各种计算机在世界范围内互连为网络的标准框架。OSI将计算机网络体系结构划分为七层,每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高的一层。
应用层应用层位于OSI参考模型的第七层,其作用是通过应用程序间的交互来完成特定的网络应用。该层协议定义了应用进程之间的交互规则,通过不同的应用层协议为不同的网络应用提供服务。例如域名系统DNS,支持万维网应用的HTTP协议,电子邮件系统采用SMTP协议等。在应用层交互的数据单位我们称之为报文。
表示层表示层的作用是使通信的应用程序能够解释交换数据的含义,其位于OSI参考模型的第六层,向上为应用层提供服务,向下接受来自会话层的服务。该层提供的服务只要包括数据压缩,数据加密以及数据描述。这使得应用程序不必担心在各台计算机中表示和存储的内部格式差异。
会话层会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层提供了数据交换的定界和同步功能, ...
16.JVM —— 垃圾回收器
垃圾回收器GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商,不用版本的JVM来实现。
由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。
从不同角度分析垃圾收集器,可以将GC分为不同的类型。
Java不同版本新特性
语法层面:Lambda表达式、switch、自动拆箱装箱、enum
API层面:Stream API、新的日期时间、OPtional、String、集合框架
底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池位置变化
垃圾收集器分类按线程数分按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器
串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。
在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能可以远超并行回收器和并发回收器。所以,串行回收器默认被应用在客户端的Client模式下的JVM中。
在并发能力比较强的CPU上,并行回收器产生的停顿时间要短于串行回收器。
和串行回收相反,并行收集可 ...
15.JVM —— 垃圾回收概述
垃圾回收概述概念内存的分配与回收
什么是垃圾在提到什么是垃圾之前,我们先看下面一张图
从上图可以看到,Java和C++的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集
垃圾收集 不是Java的伴生物,早在1960年,第一门开始使用内存动态分配和垃圾收集的Lisp语言诞生
关于垃圾收集的三个经典问题:
那些内存需要回收
什么时候回收
如何回收
垃圾收集机制是Java的招牌能力,极大的提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战。
垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾
如果不及时对内存中的垃圾进行清理,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其他对象使用,甚至可能导致内存溢出
为什么需要GC
清理内存垃圾,防止OOM
整理内存空间,方便内存分配
对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而 ...
14.JVM —— StringTable
StringTableString的基本特性
String:字符串,使用一对””引起来表示
String s1 = “mogublog”; // 字面量的定义方式 创建一个对象 或者不创建对象
String s2 = new String(“moxi”); //创建一个或者两个对象 s2 为新创建的
String声明为final 的,不可被继承
String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String 可以比较大小
String在JDK8及以前内部定义了 fianl char[] value用于存储字符串数据。JDK9时改为byte[]
为什么JDK9改变了结构String类的当前实现将字符存储在char数组中,每个字符使用两个字节(16位)。从许多不同的应用程序收集的数据表明,字符串是堆使用的主要组成部分,而且,大多数字符串对象只包含拉丁字符。这些字符只需要一个字节的存储空间,因此这些字符串对象的内部char数组中有一半的空间将不会使用。
我们建议改变字符串的内部表示clasš从utf - 16字符 ...
13.JVM —— 执行引擎
执行引擎执行引擎概述执行引擎属于JVM的下层,里面包括 解析器、即时编译器、垃圾回收器
执行引擎是Java虚拟核心的组成部分之一。”虚拟机”是一个相对于”物理机”的概念,这两种都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约的定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式
JVM的主要任务是负责装在字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令,符号表,以及其他辅助信息
那么,如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
执行引擎的工作流程
执行引擎在执行的过程中究竟需要什么样的字节码指令完全依赖于PC寄存器
每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址
当 ...