面试要点(更新中)

OSI7层模型

开放系统互联(Open System Interconnection),国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层.

  • 物理层
  • 数据链路层 硬件性能
  • 网络层 kvm vm 虚拟化性能为题
  • 传输层(TCP四层) 内核参数设置控制 tcp udp ip
  • 会话层/控制层(TCP四层) 建立连接 断开连接等
  • 表示层(TCP四层)解压 解密 编码转换
  • 应用层(TCP四层)http ftp https ssh

TCP 滑动窗口、三次握手、四次挥手、粘包拆包

三次握手

  • 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
    1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
    2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
    3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:

  • 未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
  • SYN-ACK重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
  • 半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。
  • linux 和win查看链接状态
netstat -ano
  • 链接状态汇总
    • LISTEN:侦听来自远方的TCP端口的连接请求
    • SYN-SENT:再发送连接请求后等待匹配的连接请求
    • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认
    • ESTABLISHED:代表一个打开的连接
    • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
    • FIN-WAIT-2:从远程TCP等待连接中断请求
    • CLOSE-WAIT:等待从本地用户发来的连接中断请求
    • CLOSING:等待远程TCP对连接中断的确认
    • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
    • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
    • CLOSED:没有任何连接状态
  • 设置参数
    net.ipv4.tcp_max_syn_backlog //表示未连接队列的最大容纳数目。
    net.ipv4.tcp_synack_retries // SYN+ACK重发次数
    net.ipv4.tcp_syn_rcvd_max //SYN_RECV状态的最大个数
  • 重发时间间隔
    RTO表示时间间隔
    第一次重试 RTO*1
    第二次重试 RTO*2
    第三次重试 RTO*4
    第四次重试 RTO*8
    达到指定次数 应用层超时

UDP

UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。

UDP

TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。
在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。

DDos攻击

  • CC攻击 ChallengeCollapsar 意为"挑战黑洞"
    模拟多个用户不停的进行访问,CC攻击又可分为代理CC攻击,和肉鸡CC攻击。
  • SYN攻击
    SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。
  • NTP攻击
    NTP是Network Time Protocol(网络时间协议)的简称,是互联网中时间同步的标准之一,它的用途是把计算机的时钟同步到国际标准时间,连接在互联网上的机器通过该协议校准时间。
    NTP协议中Monlist指令可以获取与目标NTP Server进行过同步的最新600个客户机IP。因此一个很小的请求包,就能获取到大量的由IP地址组成的连续UDP包。
  • DNS攻击
    域名欺骗

JVM垃圾回收与内存模型

垃圾回收(Garbage Collection,GC)算法

  • 引用计数
    给每个对象分配一个计算器,当有引用指向这个对象时,计数器加1,当指向该对象的引用失效时,计数器减一。最后如果该对象的计算器为0时,java垃圾回收器会认为该对象是可回收的。
    循环引用出现无法回收的问题。
  • 可达性分析算法(Reachability Analysis)
    通过一系列"GC Roots"对象作为起始点,开始向下搜索;
    搜索所走过和路径称为引用链(Reference Chain);
    当一个对象到GC Roots没有任何引用链相连时(从GC Roots到这个对象不可达),则证明该对象是不可用的;


    可达性分析算法

    Java中,GC Roots对象包括:
    (1)、虚拟机栈(栈帧中本地变量表)中引用的对象;
    (2)、方法区中类静态属性引用的对象;
    (3)、方法区中常量引用的对象;
    (4)、本地方法栈中JNI(Native方法)引用的对象;
    主要在执行上下文中和全局性的引用;
    分析过程需要GC停顿(引用关系不能发生变化),即停顿所有Java执行线程(称为"Stop The World",是垃圾回收重点关注的问题);

由于垃圾回收会导致java进程停顿响应一段时间,所以有两种优化方式

  1. 分代垃圾回收
    只是根据对象存活周期的不同将内存划分为几块;
    这样就可以根据各个年代的特点采用最适当的收集算法;
    一般把Java堆分为新生代和老年代;
    • 新生代
      每次垃圾收集都有大批对象死去,只有少量存活;
      所以可采用复制算法;
    • 老年代
      对象存活率高,没有额外的空间可以分配担保;
      使用"标记-清理"或"标记-整理"算法;

优化方式 减少每次回收对象数量 不同区域采用不同的回收算法
缺点 老年代对象增多后 每次回收的数量还是不能减少。不能控制每次回收的时间

  1. 增量GC
    将回收分段进行 不是一次性完成。
    优化方式 进一步减小每次回收的对象数量,控制了每次回收时间。

复制算法(Copying)
算法思路
1. 把内存划分为大小相等的两块,每次只使用其中一块;
2. 当一块内存用完了,就将还存活的对象复制到另一块上(而后使用这一块);
3. 再把已使用过的那块内存空间一次清理掉,而后重复步骤2;

新生代回收采用此类算法,所以新生代内存分为2块Eden和Survivor Space,Survivor Space又分为 To Survivor、 From Survivor

  • 新建的对象都会分配到Eden区
  • 当经过一次垃圾回收后从Eden区到to Survivor区
  • 当to Survivor区快满的时候 进行复制算法 将存活的对象复制到 from Survivor区,存活对象年龄加1
  • 当from Survivor区快满的时候,进行复制算法 将存活的对象复制到to Survivor区,存活对象年龄加1
  • 当对象达到一定年龄的时候 复制到老年代区


    新生代堆内存模型

如果另一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制(Handle Promotion)进入老年代;

所以当设置的年轻代和Eden与survivor不合理的时候 将导致大部分对象分配到了老年代,老年代对象过多的时候 将导致full gc ,full gc频繁将导致整个jvm吞吐量下降

标记清除整理(mark sweep compact)
将存活的对象像内存的一端移动

image.png

用于老年代回收,因为老年代对象存活率高,没有额外的空间可以分配担保;

mysql集群

了解binlog

  • binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;
  • 文件位置:默认存放位置为数据库文件所在目录下
  • 文件的命名方式: 名称为hostname-bin.xxxxx (重启mysql一次将会自动生成一个新的binlog)
  • 启动binlog方法
    1. 方法一、修改my.cnf参数文件,该方法需要重启
    [mysqld] 
    log-bin = mysql-bin
    
    1. 方法二、不重启修改二进制日志配置,该方法mysql的版本需要5.6以上
    SET @@global.log_bin=1|0  (1为开启,0为关闭)
    SET @@global.binlog_size=37268(单位bytes)
    

利用binlog恢复

  • 最长用的就是回复指定数据端的数据了,可以直接恢复到数据库中:
mysqlbinlog  --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin.000001 |mysql -uroot -p123456 

亦可导出为sql文件,再导入至数据库中:

mysqlbinlog  --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin.000001 >d:\1.sql 
source 1.sql
  • 指定开始\结束位置,从上面的查看产生的binary log我们可以知道某个log的开始到结束的位置,我们可以在恢复的过程中指定回复从A位置到B位置的log.需要用下面两个参数来指定:
    --start-positon="50" //指定从50位置开始
    --stop-postion="100"//指定到100位置结束

主从

主服务器将更新写入binlog,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。


主从流程
  1. 主库将更新写入binlog
  2. 从库读取主库binlog 写入自己的relay log
  3. 从库的sql线程读取relay log 进行更新

所以master是以推送的方式通知从服务器更新。
改变主mysql的配置,注意每个mysql的server-id必须不同

[mysqld] 
log_bin            =   mysql-bin
server_id          =   1

改变从mysql的配置

[mysqld]
log_bin           = mysql-bin
server_id         = 2
relay_log         = mysql-relay-bin
log_slave_updates = 1

改变配置后重启主从mysql

  1. 连接主库,执行命令 查看主库状态
SHOW MASTER STATUS;
  1. 连接从库,执行
CHANGE MASTER TO MASTER_HOST='主库ip',
MASTER_USER='主库用户名',
MASTER_PASSWORD='主库密码',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;

启动从库

START SLAVE;

查看从库状态

SHOW SLAVE STATUS\G

如果看到
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
表示主从创建成功

主主

将主从的流程反过来再做一次,就可以实现主主复制。
改变上面的主库配置

[mysqld]
log_bin           = mysql-bin
server_id         = 1
relay_log         = mysql-relay-bin
log_slave_updates = 1

重启两个库都执行后续操作即可实现主住复制

主主双从

主主复制成功后,可以每个主库在连接一个从库

数据库事务

事务的4个特性ACID

  • Automic 原子性
    事务(Transaction)是并发控制的基本单位。 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
  • Consistency 一致性
    在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • Isolation 隔离性
    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Duration 持久性
    事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

数据库事务隔离级别

  • Read uncommitted(读未提交)
    容易产生脏读,再一次查询中,查到了另一个事务未提交的数据,导致查询数据不准确。
    例如:查询工资,读到了一条未提交的错误数据。那条数据在回滚后再也查不到。页面显示工资10w 实际可能就1k 。正常因为工资数据未提交应该显示工资未发放。
  • read committed (读已提交)
    容易产生不可重复读,再一个事务内两次查询结果不一致,主要原因是另一个事务提交了新的数据。
    例如:信用卡付款,开始查询了余额充足,输入密码后显示余额不足,因为输入密码的时候,另一笔交易自动提交了。
  • repeatable read (可重复读)
    事务查询后,其它事务不再允许修改(UPDATE)数据。
    容易产生幻读
    再一次update表中几个符合条件的数据时候 第二个事务提交了一条新符合条件数据,在update那个事务看来就像有一条符合条件的数据没有被update执行。
    例如:打印话费的时候,在线查询话费是100条记录,打印之后是101条记录。因为打印的时候又打了一个电话。
  • Serializable (串行化)
    Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

mysql锁情况

例1: (明确指定主键,并且有此数据,row lock)
SELECT * FROM products WHERE id='3' FOR UPDATE;
例2: (明确指定主键,若查无此数据,无lock)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例2: (无主键,table lock)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
例3: (主键不明确,table lock)
SELECT * FROM products WHERE id<>'3' FOR UPDATE;
例4: (主键不明确,table lock)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

mysql性能优化

  • explain
    explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
  • 使用方法,在select语句前加上explain就可以了:
  • 结果分析
    1. table:显示这一行的数据是关于哪张表的
    2. type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
    3. possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
    4. key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
    5. key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
    6. ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
    7. rows:MYSQL认为必须检查的用来返回请求数据的行数
    8. Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
  • extra结果
    1. Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
    2. Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
    3. Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
    4. Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行
    5. Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候
    6. Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
    7. Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
    8. system 表只有一行:system表。这是const连接类型的特殊情况
    9. const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
    10. eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
    11. ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
    12. range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
    13. index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
    14. ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

敏捷开发

持续可以 持续集成
四个价值观
沟通 简单 反馈 谦逊

项目管理

  • 时间
    保证按时完成项目、合理分配资源、发挥最佳工作效率。合理的安排时间,保证项目按时完成
  • 成本
    承包人为使项目成本控制在计划目标之内所作的预测、计划、控制、调整、核算、分析和考核等管理工作。
    项目成本管理就是要确保在批准的预算内完成项目,具体项目要依靠制定成本管理计划、成本估算、成本预算、成本控制四个过程来完成。
  • 质量
    代码规范 抽象设计 方便扩展
  • 风险
    风险识别,风险量化, 风险对策。

引用文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,139评论 11 349
  • 计算机网络 HTTP1.0和HTTP1.1的主要区别长连接和流水线 TCP和UDP的区别 三次握手,两次可以吗 3...
    鬼谷神奇阅读 911评论 0 5
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 8,474评论 3 93
  • 2017年3月21日,我们陪儿子参加研究生复试来到浙江金华。 说起金华,我就想起多年前给学生讲...
    平凡艾阅读 2,080评论 12 5
  • 有些事情,尽力就好。就算没有获得最后的成功,但只要我们努力过,对得起自己的奋斗,这就够了。 生活中每时每刻都在面临...
    笨企鹅1990阅读 960评论 0 3