http和rpc简介
HTTP 的本质?HTTP 和 RPC 的区别?HTTP 的本质首先你要明确 HTTP 是一个协议,是一个超文本传输协议。
它基于 TCP/IP 来传输文本、图片、视频、音频等。
重点来了。
HTTP 不提供数据包的传输功能,也就是数据包从浏览器到服务端再来回的传输和它没关系。
这是 TCP/IP 干的。
那 HTTP 有啥用?我们来分析一波。
我们上网要么就是获取一些信息来看,要么就是修改一些信息。
比如你用浏览器刷微博就是获取信息,发微博就是修改信息。
所以说浏览器需要告知服务器它需要什么,这次的请求是要获取哪些信息?发怎么样的微博。
这就涉及到浏览器和服务器之间的通信交互。
而交互就需要一种格式。
像你我之间的谈话就用中文,你要突然换成俄语我听不懂那不就 GG 了。
所以说 HTTP 它规定了一种格式,一种通信格式,大家都用这个格式来交谈。
这样不论你是什么服务器、什么浏览器都能顺利的交流,减少交互的成本。
就像全世界如果都讲中文,那我们不就不需要学英文了,那不就较少交互的成本了。
不像现在我们还得学英文,不然就看不懂文档等等。
万一之后俄语又起来了,咱还得对接俄文,这交互成本是 ...
浏览器输入url后
步骤(1)DNS 解析
(2)TCP 连接
(3)发送 HTTP 请求
(4)服务器处理请求并返回 HTTP 报文
(5)浏览器解析渲染页面
(6)连接结束
详细内容DNS解析
输入 IP,此时电脑发送一个 DNS 请求到本地 DNS 服务器(一般是网络接入服务商提供 eg:电信,移动);
本地 DNS 服务器会首先查询它的缓存记录,如果有,则直接返回结果,若没有,本地 DNS 服务器还要向 DNS 根服务器进行查询;
DNS 根服务器没有记录具体域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,可到域服务器上继续查询,并给出域服务器地址;
本地服务器继续向域服务器发出请求,返回域名的解析服务器地址;
本地 DNS 向域名解析服务器发出请求,收到域名与 IP 地址对应关系;
本地 DNS 服务器将 IP 地址返回电脑,且保存副本到缓存已备下次查询。
TCP连接主要是三次握手:
1. 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
2. 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个 ...
滑动窗口
滑动窗口我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。
这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。
如果你说完一句话,我在处理其他事情,没有及时回复你,那你不是要干等着我做完其他事情后,我回复你,你才能说下一句话,很显然这不现实。
按数据包进行确认应答
所以,这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。
为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。
那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
假设窗口大小为 3 个 TCP 段,那么发送方就可以「连续发送」 3 个 TCP 段,并且中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」。如下图:
用滑动窗口方式并行处理
图中的 ACK 600 确认应 ...
三次握手和四次挥手
一、TCP 报文段简介在介绍三次握手和四次挥手之前,先来简单认识一下 TCP 报文段的结构--TCP 首部包含以下内容,请留意其中的控制位,在三次握手和四次挥手过程中会频繁出现:
端口号 (Source Port and Destination Port):每个 TCP 报文段都包含源端和目的端的端口号,用于寻找发送端和接收端应用进程。这两个值加上 IP 首部中的源端 IP 地址和目的端 IP 地址就可以确定一个唯一的 TCP 连接。
序号 (Sequence Number):这个字段的主要作用是用于将失序的数据重新排列。TCP 会隐式地对字节流中的每个字节进行编号,而 TCP 报文段的序号被设置为其数据部分的第一个字节的编号。序号是 32 bit 的无符号数,取值范围是0到 232 - 1。
确认序号 (Acknowledgment Number):接收方在接受到数据后,会回复确认报文,其中包含确认序号,作用就是告诉发送方自己接收到了哪些数据,下一次数据从哪里开始发,因此,确认序号应当是上次已成功收到数据字节序号加 1。只有 ACK 标志为 1 时确认序号字段才有效 ...
4.HashMap实现原理
HashMap的实现原理概述HashMap是Java中对Map接口的实现类,是最常用的实现类中之一。主要有以下几个特性:
HashMap中的key 和 value 都允许为null, 但最多智能拥有一个null的key
HashMap不保证顺序性
HashMap非线性安全
HashMap的数据结构:
HashMap内部是以数组+链表的方式存储的数据。
HashMap的数组中,每个元素称之为“桶”。需要注意的是,这个“桶”并不等同于“键值对(Entity)”。至于它是什么请往下看。
初始化
HashMap在初始化时会创建一个Entity的数组。其个数为16。其源码类似下面的代码:
1234567static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; final int hash; ……}
其中key和value不必多说,不过它还包含了一个next属性,这说明它可以组织成一 ...
02.索引
索引什么是索引索引是一个单独的,存储在磁盘上的数据结构,包含着对数据表里所有记录的引用指针,使用索引可以快速记录找出在某个或多个列中有一特定值的行,所有MySQL列数据都可以被索引,所有MySQL列类型都可以被索引,对相关列使用时提高查询操作速度的最佳途径。
索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。MySQL中索引的存储类型有两种,即BTREE和HASH,具体和表的存储引擎相关。MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
优点:
通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
可以大大加快数据的查询速度,这也是创建索引的主要原因
在实现数据的参考完整性方面,可以加速表和表之间的连接
在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。
缺点:
创建索引和维护索引需要耗费时间,并且随着数据量的增加所耗费的时间也会增加
索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的 ...
01.事务的隔离性
MySQL事务MySQL事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除该人员相关的信息,如信箱、文章等等,这样,这些数据库操作语句就构成一个事务
在MySql中只有使用了Innodb数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
事务用来管理insert、update、delete语句
一般来说,事务是必须满足四个条件(ACID):
原子性(Atomicity):一个事务中的所有操作要么全部完成,要么全部不完成,不会在结束中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全符合所有的预设规则,这包含资料的精度,串联性以及后续数据库可以自发性地完成预定的工作
隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多 ...
Redis基础
概述什么是RedisRedis是一个使用C语言写成,凯源的高性能key-value非关系缓存数据库。他支持存储的value类型比较多,包括String(字符串)、list(集合)、set(集合)、zset(sorted-set–有序集合) 和 hash (哈希类型)。Redis都是基于缓存的,所以很快,每秒都可以处理10万读写操作,是一直性能最好的key-value DB。redis也可以实现数据写入磁盘中,保证了数据的安全不丢失,而且redis的操作时原子性的
Redis 有那些优缺点优点:
读写性能优异,redis能读的速度是110000次/s,写的速度是810000次/s
支持数据持久化,支持AOF和RDB两种持久化方式
支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操控台合并的原子执行
数据结构丰富,除了支持String类型的value 外还支持hash、set、zset、list等数据结构
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
缺点:
数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局 ...
17.锁升级和锁状态
前言锁的状态总共有四种,级别由低到高依次为:无锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级。在JDK1.6之前,synchronized还是一个重量级锁,是一个效率比较低下的锁,但在JDK1.6后,JVM为了提高锁的获取与释放效率(sychronized) 进行了优化,引入了偏向锁和轻量级锁,从此以后锁的状态就有四种(无锁, 偏向锁, 轻量级锁,重量级锁),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进行锁升级(从低级别到高级别),不能锁降级(高级别到低级别),意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。
锁的四种状态在synchronized最初的实现方式是“阻塞或唤醒一个Java线程需要操作系统切换cpu状态来完成,这种状态切换需要耗费处理器时间,如果同步代码块中内容过于简单,这种切换的时间可能比用户代码执行的时间还长”,这种方式就是synchronized实现同步最初的方式,这也是当初开发者诟病的地方,这也是在JDK6以前 synchronized ...
java异常
java把异常作为一类,当做对象来处理。所有异常类的基类是Throwable类,两大子类分别是Error 和 Exception。
系统错误由Java虚拟机抛出,用Error类表示,Error类描述的是内部系统错误,例如Java虚拟机崩溃。这种情况仅凭程序自身是无法处理的,在程序中也不会对Error异常进行捕捉和抛出。
异常(Exception)又分为RuntimeException(运行时异常)和 CheckedException(检查时异常),两者区别如下:
RuntimeException:程序运行过程中才可能发生的异常,一般为代码的逻辑异常,例如:类型错误,数组越界,空指针异常等
CheckedException:编译期间可以检查到的异常,必须显示的进行处理(捕获或者抛出到上一层)。例如:IOException, FileNotFoundException等等。
java异常体系结构图
首先说明一点,java中的Exception类的子类不仅仅只是像上图所示只包含IOException和RuntimeException这两大类,事实上Exception的子类很多很多,主要 ...