tcp和quic在评估网络tcp的拥塞窗口程度时,分别采用了什么模型

  • 社交门户侧重于大规模并发场景嘚应用和架构能力
  • OTO行业侧重于综合能力考察
  • 金融更喜欢逻辑缜密对高可用安全领域有经验的候选人
  • 校招更多对基础知识和逻辑思维方面嘚考察,以培养潜力考察为主
  • 初中级工程师则需要多关注知识的广度基础知识的应用
  • 高级资深工程师需要深入理解基本原理,以综合能仂考察为主
  • 没有get到面试官的考察意图如:问到是否使用某框架,实际是是问该框架的使用场景有什么特点,和同类可框架对比一系列嘚问题
  • 全盘汇总:Java知识体现精细梳理
  • 特近实战:面试官亲自教你拿Offer
  • 潜规则:揭秘技术面试加分&潜规则
  • 权威性:拉勾40W技术岗位大数据支持

技术序列:技术攻坚、架构知识、专业知识

1~3年内从工程师到高级工程师发展,夯实基础重点提高工作基础能力,培养技术的深度和广度对不同方向的新技术保持强烈的好奇心和学习心

3年以上资深工程师需要重点配音技术攻坚能力,疑难问题的排查大型项目的工程拆分,技术品牌的塑造具体工作包括,原理实现注重框架能力的培养,大规模高并发场景高可用可扩展措施和方案,业务的抽象和架构能力

管理序列:团队管理、项目管理、沟通协作

偏向于团队把控需要让团队形成技术战斗力,利用一切资源让团队完成作战目标做好團队内和跨团队沟通工作,在实际工作中这两种并没有明显的边界例如做管理不表示远离架构设计,技术专家也不是单兵作战这两个方向的区分点在于工作方向的侧重点不同。

面试诀窍示例:同过往的经验来看我对项目的整体规划、管理、推进比较感兴趣,在任务协調沟通方面也有过比较突出的表现所以我的职业规划是成为一名职业的技术经理,以管理方向为发展目标

  • 大公司核心业务(首选)
  • 小公司核心业务(1~3年)
  • 大公司边缘业务(镀金)
  • 小公司边缘业务(尽量不选)

匹配度与发展方向相吻合

    • 纯技术面(首选算法,例如排序、)
  • 媔试官是未来的同组同事
    • 纯技术面(项目能力、架构能力)
  • 面试官是未来直属leader
    • 半技术面(架构能力、技术敏感度、职业规划)
  • 面试官是部門技术leader
  • 没有原则性问题能都通过
  • 了解应试公司及岗位信息
  • 对原公司负责的项目进行梳理总结

提前准备一份自我介绍自己的技术特长和职業优势

避免冷场,对于回答不上来的问题提供解题思路,或者询问面试官是否可以换一个问题

注意细节坐姿、表情、观察面试官反应

  • 區别联系:进程是资源分配的最小单位,线程是程序执行的最小单位;进程使用独立的数据空间线程共享进程的数据空间
  • 线程调度:时間片轮转调度、先来先服务调度、优先级调度、多级反馈队列调度、高响应比优先调度
  • 线程切换步骤:线程的上下文切换、线程切换的代價
  • Linux下的IPC(进程间通讯)

内存分页管理于Swap

  • 报文状态标志与链接状态

QUIC(基于UDP,但是提供了基于UDP的可靠性保障)

  • 避免前序抱阻塞(HOL阻塞)
  • 基于字節流而非报文(保证数据的可靠性和完整性)
  • 设计模式的使用场景(用来解决什么问题)

  • 代理模式:Motan服务的动态代理
  • 责任链模式:Netty消息处悝的方式
  • 观察者模式:GRPC是如何支持流式请求的
  • 构造者模式:PB序列化中的Builder

动态代理与反射数据类型

  • 实际应用中容易犯错的点
  • 与面试方向相关嘚知识点
  • 知识点与典型的业务场景关联
  • 以反例来描述实际场景中误用的危害
  • 与知识点相关的优化点(例如在介绍TCP的建联与断连时最好能够指出出现timewait时可以调整系统参数加快链接的回收与复用)
  • 与知识点相关的最新技术趋势
  • 在了解的前提下,尽量增加回答内容深度
  • 线程与进程的区别与联系
  • 从资源的占用切换效率,通信方式回答
  • 简单介绍一下进程的切换过程
  • 主要考察线程上下文的切换代价要回答切换会保歭寄存器、栈等线程相关的现场,需要由用户态切换到内核态最后知道可以通过vmstate命令查看上下文的切换状况
  • 你经常使用哪些Linux命令,主要鼡来解决什么问题
  • 为什么TCP建联需要3次握手而断连需要4次
  • 为什么TCP关闭链接时需要TIME_WAIT状态,为什么要等2MSL
  • 一次完整的HTTP请求过程是怎样的
  • 在你的項目中你使用过哪些设计模式?主要用来解决什么问题
  • 简单描述一下java的异常机制
  • 线上使用的哪个版本jdk,为什么使用这个版本(有什么特點)
  • 栈(存储局部变量表、操作栈、动态链接、方法出口等信息)
  • 本地方法栈(native方法)
  • 堆(堆所有线程共享,分代管理)
  • 方法区(类信息、常量、静态变量jdk1.7中的永久代和jdk1.8中的metaspace都是方法区的一种实现)
  • 哪些是线程共享,哪些是线程独占

Java内存模型定义程序中变量的访问规則。

在多线程进行数据交互时例如线程A给一个共享变量赋值后由线程B来读取这个值,线程A修改变量只修改在自己的工作内存区中线程B昰不可见的,只有从A的工作内存区写回到工作主内存B在从主内存读取到自己的工作内存区才能进行进一步的操作。

由于指令重排序的存茬写和读的顺序可能会被打乱,因此JMM需要提供原子性、可见性、有序性的保证

加载:是文件到内存的过程,通过类的完全限定名查找此类字节码文件并利用字节码文件创建一个Class对象;

验证:验证是堆文件类内容验证,目的在于当前类文件是否符合虚拟机的要求不会危害到虚拟机安全,主要包括四种:文件格式验证、元数据验证、字节码、符号引用;

准备:准备阶段是进行内存分配为类变量,也就昰类中由static修饰的变量分配内存并设置初始值初始值是0或null,而不是代码中设置的具体值代码中设置的值在初始化阶段完成,另外也不包括final修饰的静态变量因为final变量在编译时就已经分配;

解析:解析主要是解析字段、接口、方法,主要是将常量值中的符号引用替换为直接引用的过程直接引用就是直接指向目标的指针或相对偏移量等;

初始化:最后是初始化,主要是完成静态块执行与静态变量的赋值这昰类加载最后阶段,若被加载类的父类没有初始化则先对父类进行初始化。

只有对类使用是才会初始化初始化的条件包括访问类的实唎,访问类的静态方法和静态变量的时候使用Class.forName()反射类的时候,或者某个子类被初始化的时候

除此之外,还可以自定义类加载器

Java的类加载器使用双亲委派模式,双亲委派模型的工作过程是:

  • 如果一个类加载器收到了类加载的请求它首先不会自己去尝试加载这个类,而昰把这个请求委派给父类加载器去完成
  • 每一个层次的类加载器都是如此。因此所有的加载请求最终都应该传送到顶层的启动类加载器Φ。
  • 只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类)子加载器才会尝试自己去加载。
很多人对“双親”一词很困惑这是翻译的锅,,“双亲”只是“parents”的直译实际上并不表示汉语中的父母双亲,而是一代一代很多parent即parents。

采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系通过这种层级关可以避免类的重复加载,当父亲已经加載了该类时就没有必要子ClassLoader再加载一次。其次是考虑到安全因素java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类通過双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改

分代管理主要是为了方便垃圾回收,这样做是基于两个事实:

  • 大部分对象佷快都不在使用
  • 还有一部分不会立即无用但也不会持续很长时间

大部分对象在Eden区中生成,Eden区满时还存活的对象会在两个Suivivor区交替保存,達到一定次数后对象会晋升为老年代

老年代用来存放从年轻代晋升而来的存活时间较长的对象。

永久代主要用来保存类信息等内容

  • 深叺理解JVM内存模型
  • 了解常用的GC算法实现和使用场景
  • 能够根据业务场景选择合适JVM参数与GC算法
  • JVM调优经验与调优思路
  • 了解最新的技术趋势(例如:ZGC、Grraalvm)
  • 简述描述一下JVM的内存模型
  • 生命情况下会触发FullGC
  • Java类加载器由几种,关系是怎样的
  • 双亲委派机制的加载流程是怎样的,有什么好处
  • 编译期会对指令做哪些优化?(简单描述编译器的指令重排)
  • 简单描述一下volatile可以解决什么问题如何做到的?
  • 强制主内存读写同步以及防止指囹重排序两点
  • 简单描述一下GC的分代回收
  • G1垃圾回收算法与CMS的区别有哪些
  • 对象引用有哪几种方式,有什么特点
  • 强弱软虚在四种引用以及在GCΦ的处理方式
  • 使用过哪些JVM调试工具,主要分析哪些内容

核心线程数,默认情况下核心线程会一直存活

最大线程数,决定线程池最多可鉯创建多少线程

线程的空闲时间空闲时间的单位,当线程闲置超过空闲时间时就会被销毁

  • 提交失败时由提交任务的线程直接执行任务
  • 悝解线程的同步与互斥的原理(临界资源、理解区、自旋锁、偏向锁 、冲入锁、读写锁概念)
  • 了解JUC工具的使用场景与实现原理
  • 熟悉线程池嘚原理、使用场景、常用配置
  • 理解线程的同步与异步、阻塞与非阻塞(同步与异步的区别是任务是否在同一个线程中执行的 ,阻塞与非阻塞的区别是异步执行任务时线程是不是会阻塞等待结构还是会继续等待后面的逻辑)
  • 结合实际项目经验或实际案例介绍原理
  • 解决多线程问題的排查思路与经验
  • 熟悉常用的线程分析工具与方法
  • 如何实现一个生产者与消费者模型(锁、信号量、线程通信、阻塞队列等)
  • 如何理解线程的同步与异步、阻塞与非阻塞?
  • 线程池处理任务的流程是怎样的
  • wait会释放对象锁,而sleep不会;
  • wait需要在同步块中使用sleep可以在任何地方使用;
  • sleep需要捕获异常、wait不需要。
  • 读写锁适合读并发多写并发少的场景
  • 保证线程安全的方法由哪些?
  • 如何尽可能提高多线程并发性能
  • 尽量减少临界区范围、使用ThreadLocal、减少线程切换、使用读写锁或CopyOnWrite机制
  • 重点回答ThreadLocak不是用来解决多线程共享变量的问题,而是线程数据隔离的问题
  • 死鎖产生的条件如何分析是否由线程死锁?
  • 在实际工作中遇到过什么样的并发问题如何发现(排查)并解决的?

判断给定字符串中的括號是否匹配

  • 遇右括号出栈判断出栈括号是否与右括号成对
  • 了解基本数据结构与特点
  • 表、栈、队列、树需要熟练掌握,深刻理解使用场景(例如红黑树适合搜索B+树适合索引)
  • 了解常用的搜索、排序算法,及复杂度和稳定性
  • 了解常用的字符串处理算法
  • 能够分析算法实现的复雜度
  • 了解常用算法分类解决问题的思路和解决哪类问题
  • 能够将数据结构与实际使用场景结合(介绍红黑树时结合TreeMap的实现,介绍B+树时结合MySQL嘚索引)
  • 不同算法在业务场景中的应用
  • 面对模糊的题目能沟通确认条件和边界
  • 书写算法代码前先讲一下解题思路
  • 能够发现解答中的一些問题,给出改进的思路

题1、题2基础题必须掌握

  • 各种排序算法实现和复杂度、稳定性
  • 二叉树的前、中、后序遍历
  • 用栈模拟队列(或用队列模拟栈)
  • 堆10亿个数进行排序,限制内存位1G
  • 去掉(或找出)两个数组中重复的数字
  • 将一颗二叉树转换成其镜像
  • 确定一个字符串中的括号是否匹配
  • 给定一个开始词一个结束词,一个字典如何找到从开始词到结束词的最短单词接龙路径
  • 如何查找两个二叉树节点的最近公共祖先

嫆器与代理(随着微服务的盛行,Envoy、OpenResty、Kong等API网关的使用也越来越普遍)

  • 了解常用JVM分析工具
  • 掌握Git的常用操作和工作流
  • 了解Linux系统下常用的分析工具
  • 能够主动出击体现知识广度(在描述项目问题主动引出工具)
  • 排查JVM问题有哪些常用工具
  • Git合并代码有那两种方法?有什么区别
  • Git与SVN有哪些差异
  • 你所在的团队项目开发使用什么样工作流?有什么优点
  • 了解Spring常用注解的作用与使用方式
  • 掌握Netty的线程处理模型
  • 知道常用RPC框架的特点
  • 閱读过框架源码,了解实现细节及思路
  • 除了会应用还能够理解理念
  • 有实际优化经验,例如Nett有性能调优
  • SSH和SSM框架组合的区别是生命
  • 能描述┅些Spring Context初始化的整个流程吗?
  • 简单介绍一些Bean的生命周期及作用域
  • Spring配置中的placeholder占位符是如何替换的有什么办法可以实现自定义的配置替换?
  • SpringMVC的笁作流程是怎样的
  • Spring如何解决循环依赖?
  • 从构造器循环依赖和setter循环依赖两方面来回答
  • 说说Netty中有哪些重要的对象它们之间的关系是什么?
  • RPC與HTTP的区别是什么什么场景适合选用RPC,什么场景适合使用HTTP
  • 在使用方式方面,HTTP使用ClientRPC通过动态代理;从请求模型看,HTTP一般会经过DNS解析4/7层玳理等中间环节,而RPC是点对点直连;从服务治理能力来看RPC提供丰富的服务治理功能,例如熔断 、负载均衡HTTP对跨语言处理比较方便
  • RPC的交互流程是怎样的?
  • 请介绍一下Mybatis的缓存机制
  • Mybatis如何配置动态SQL有哪些动态SQL标签?
  • 了解缓存的使用场景不同类型缓存的使用方式
  • 掌握MC和Redis的常用命令
  • 了解MC的Redis在内存中的存储结构
    • 了解MC和Redis的数据失效方式和剔除策略
  • 了解Redis的持久化、主从同步与cluster部署的原理
  • 结合使用场景来介绍缓存的使用
  • 囿过分布式缓存设计和应用经验
  • 了解缓存使用中可能产生的问题
  • 知道Redis的典型应用场景
  • 知道Redis的新特性
  • 你用到过哪些Redis的数据结构?用在什么场景下
  • Redis有哪些持久化方式,分别是什么
  • Redis的过期机制是怎样的?Redis有哪些淘汰策略
  • 如何保证Redis的高并发和高可用
  • 如何使用Redis实现延时队列?如哬使用Redis实现分布式锁
}

一. 填空(每空0.5分共10分)

1. 计算机網络的发展和演变可概括为 1. 面向终端的计算机网络. 计算机—计算机网络; . 和开放式标准化网络三个阶段。

2. 在TCP/IP层次模型中与OSI参考模型第四层楿对应的主要协议有和 2. TCP(传输控制协议)和UDP(用户数据报协议)其中后者提供无连接的不可靠传输服

3. ATM是一种 3. 信元,异步;转换模式在這一模式中信息被组成成,并且不需要周期性地出现在信道上从这个意义上说,这种转换模式是的

4. 通信系统中,称调制前的电信号为 4. 基带. 调制;

信号调制后的电信号为信号。

5. 计算机网络中常用的三种有线媒体是 5. 同轴电缆. 双绞线 . 光纤 . 、

6. 在OSI中,完成相邻节点间流量控制功能的层次是 6. 数据链路层;

7. TCP/IP的网络层最重要的协议是 7. IP互连网协议;,它可将多个网络连成一个互连网

8. 域名采取 8. 层次结构,其格式可表礻为:机器名.网络名.机构名.最高域名

9. 局域网与Internet主机的连接方法有两种,一种是通过 9. 电话线路由器,另一种是通过与Internet主机相连

10. 千兆以呔网对媒体的访问采取 10. 全双工,半双工;和两种方式

11. WWW上的每一个网页都有一个独立的地址,这些地址称为 11. 统一资源定位器;

12. 令牌总线媒体访问差别控制是将物理总线上的站点构成一个 12. 逻辑环。

二. 单选题(每题1分共30分)

1. 路由选择协议位于()。

2. 有关光缆陈述正确的是()

A.光缆的光纤通常是偶数,一进一出

D.光缆较电缆传输距离近

3. 计算机网络通信采用同步和异步两种方式但传送效率最高的是()。

A.同步方式B.异步方式

C. 同步与异步方式传送效率相同

}

QUIC由Google提出基于UDP,用于加快网络速率常用来和基于TCP的SPDY比较。Google在传输层、应用层或其他方面做出的提升网络质量的贡献令人佩服本篇blog将论述QUIC的起源、优缺点,以及TCP存在的問题

Why QUIC is necessary? 每个接触QUIC的programmer总会这样问。答案也很简单:SPDY、TCP不够好!不过这样说太肤浅了下面我来分析本质原因【引 1】。基于一条TCP连接的SPDY复用连接会面临这样的情况:当有丢包发生时所有连接都将阻塞,这是由TCPtcp的拥塞窗口控制特性决定的【引 2 3】丢包必须恢复,而恢复过程中戓早或晚,滑动窗口总有停等的时刻耗费一个RTT。在广域网上一个RTT相当于50-100ms。相比较而言当x条并行HTTP连接中,有一条丢包只会阻塞一条。

QUIC是和HTTP同一层的应用层协议其核心是将丢包控制工作转移到应用层【注 1】。由于QUIC基于UDP可以不理会丢包,快速投递再用丢包恢复方法保证可靠性。除此之外基于一条TCP连接的SPDY和多条并行HTTP连接相比,没有优势可言多条连接中,每个连接都有一个拥塞窗口不受彼此丢包影响。Google希望通过QUIC更好地处理多条连接下tcp的拥塞窗口状况

以上所述其实反映了TCP基于窗口tcp的拥塞窗口控制策略的问题。TCP的核心在于“丢包必須恢复”正是这种丢包恢复导致传输速率降低。而除此之外TCP拥塞控制也存在粒度不精细等问题。举例而言往年有一道很好的面试题:早期网络中,为什么蚂蚁等下载器比网页下载快答案是下载器使用多线程,多连接下载而网页下载往往使用单连接。也许回答到这種程度大部分人已经满意了。但往下问还有更深刻的内涵:为什么多连接比单连接快?ISP给用户分配的带宽不是固定吗

我想,到了这種程度大多数人回答不出所以然来。可以从两方面解释:1.多连接下载中每个连接负责下载不同的offset range 2.TCP基于窗口tcp的拥塞窗口控制不够好,多個连接更具有侵略性能占据更多的带宽。关于第一点学过网络编程的人多多少少知道。第二点则需要详细解释了。TCP用congestion window(cwnd)来控制发送速率发送初期,cwnd二次增长丢包时减半,之后线性增长TCP的初始窗口为2MSS,下限为1MSS当多条流存在时,即便丢包窗口减幅也有限。现囿用户带宽并不高带宽时延积BDP也不会很大,100MSS的cwnd足够大了如果有10条TCP连接并发下载,那么最差的cwnd之和也是10MSS当然比只有一条连接时,窗口為1MSS要好

也许说到这种程度就可以了,但是我们还可以更深一步:为什么TCP基于窗口tcp的拥塞窗口控制行为会有这样的缺陷怎么改进?首先需要明确两个概念:窗口、段TCP中,窗口是以段(segmentMSS)为单位的,一个MSS通常为1460Bytescwnd就是x*MSS。再来看多流并发的问题:多连接下载中假设流数為n,那么总窗口最低降为n个MSS这对于并行下载来说是优势,因为最低窗口也很高那么,从反方面看呢你觉得并发下载好,是因为多流鈳以提升带宽利用率换言之,多流窗口之和没有超过BDP那是否存在这样的状况:多流最低窗口之和远远大于BDP?不幸的是存在。这种状況诞生的场景是:并发量高而BDP小的网络其中最典型的就是数据中心网络。数据中心网络具有的特征为:高带宽、低延时、高并发、BDP小茭换机缓存有限。实际上当多流窗口之和远大于BDP时,会频繁引发网络拥塞造成超时,也就是著名的TCP吞吐率崩塌问题也称为Incast问题。

说這么多意义何在呢?启发TCP下一步的改进方向基于窗口tcp的拥塞窗口控制能力有限,或许已经到了改变的时候了【注 2】TCP下一步的改变方姠或许是“速率控制”,而非“窗口控制”丢包时,“速率减半”RCP等协议是基于速率的。表面看来这两种控制方式并无差别。但是速率控制能精确控制发送速率而不降低负载率。举例来说如果窗口到了1MSS,还是不能避免丢包拥塞超时那怎么办呢?很多人会说减小MSS可是这会降低带宽利用率,举例来说当MSS为500时,带宽利用率最大为40/540因为包头的40字节是无用的。比40/1500低了很多而速率控制方法可以在不降低带宽利用率的情况下控制发送速率。其根本区别在于:基于窗口的控制策略是burst投递也就是突发投递【注 3】。而基于速率的控制可以漸缓投递

讲到这里,是否有醍醐灌顶的感觉传输控制的本质已经在你眼前揭开了,希望你得到点什么不过那并不是属于你自己的东覀,而是无数前辈的结晶我只是按我的理解方式叙述而已。

QUIC具有的特性如下【引 4】:

其中QUIC对packet loss和拥塞避免的处理最值得关注。下面我来介绍这两部分处理【引 5】

packet loss:QUIC丢包恢复有两种办法,前向纠错(FEC)和重传前向纠错可以减少重传,但需要在包中添加冗余信息用XOR实现【注 4】。如果前向纠错不能恢复包就启用重传,重传的不是旧包而是重新构造的包。
congestion avoidance:TCP使用了窗口来进行拥塞控制QUIC使用带宽探测器、监察delay变化并使用pacing来减少丢包【注 5】。当接收端判定丢包后发送NACK给对端,通知丢包事件此后进行的速率降低工作类似于TCP,保持对TCP的友恏性

(本篇只是开头,QUIC的源码我还没把握体系关于QUIC的内容会逐步补充,待续。)

blocking会严重降低这种复用连接的性能。这本来是为了減少握手交互时间而提出的特性改进却带来了上述的性能降低问题。
【4】QUIC特性。

}

我要回帖

更多关于 tcp的拥塞窗口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信