面试

字节跳动面试题

操作系统

  • 进程有哪些状态
    • 一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态。
      运行态:进程占用CPU,并在CPU上运行
      就绪态:进程已经具备运行条件,但是CPU还没有分配过来
      阻塞态:进程因等待某件事发生而暂时不能运行
      [外链图片转存失败(img-wk8sYTzS-1562327473916)(字节跳动.assets/字节跳动-bd626954.png)]
    • 当然理论上上述三种状态之间转换分为六种情况;
      • 运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。
      • 就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
      • 运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
      • 阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
    • 以下两种状态是不可能发生的:
      • 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
      • 就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。
  • 进程间通信方式
    • 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    • 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    • 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    • 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
    • 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    • 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
    • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  • 进程调度算法
    1. 批处理系统
      • 批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。

      1.1 先来先服务
      先来先服务 first-come first-serverd(FCFS)
      按照请求的顺序进行调度。
      有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
      1.2 短作业优先
      短作业优先 shortest job first(SJF)
      按估计运行时间最短的顺序进行调度。
      长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。
      1.3 最短剩余时间优
      最短剩余时间优先 shortest remaining time next(SRTN)
      按估计剩余时间最短的顺序进行调度。

    2. 交互式系统
      • 交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。

      时间片轮转
      将所有就绪进程按 FCFS (先来先服务) 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
      时间片轮转算法的效率和时间片的大小有很大关系。因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
      2.2 优先级调度
      为每个进程分配一个优先级,按优先级进行调度。
      为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
      2.3 多级反馈队列
      如果一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。
      多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。
      每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
      可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

进程线程,fork和vfork

[外链图片转存失败(img-OEhxA291-1562327473917)(字节跳动.assets/字节跳动-0767a6fd.png)]

fork时内存空间发生了哪些变化

copy on write做了什么(这个之前没学到,大佬给我讲了一遍)

epoll底层数据结构,ET、LT

死锁(死锁条件、避免死锁、死锁检测、死锁预防)

调度的基本单位是什么

进程状态都有哪些,怎么转换

调度算法都有什么,调度的时机是什么

进程间通信方式都有哪些

进程和线程的区别?内存管理说一下你的了解。进程调度算法。

操作系统I/O模型了解吗?epoll模型了解吗?

阻塞IO 非阻塞IO(说了5种IO模型,详细说了下io复用)

计算机网络

基础介绍

  • TCP
    • 定义:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议
    • TCP三次握手
      • [外链图片转存失败(img-7IbJX6xu-1562327473917)(字节跳动.assets/字节跳动-b3dec35f.png)]
      • 具体步骤
        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状态,完成三次握手。
        4. 完成三次握手,客户端与服务器开始传送数据
    • TCP四次挥手
      • [外链图片转存失败(img-GUnhyh0U-1562327473918)(字节跳动.assets/字节跳动-6a5fd37e.png)]
      • 具体步骤
        1. 客户端先发送FIN,进入FIN_WAIT1状态
        2. 服务端收到FIN,发送ACK,进入CLOSE_WAIT状态,客户端收到这个ACK,进入FIN_WAIT2状态
        3. 服务端发送FIN,进入LAST_ACK状态
        4. 客户端收到FIN,发送ACK,进入TIME_WAIT状态,服务端收到ACK,进入CLOSE状态
        5. TIME_WAIT的状态就是主动断开的一方(这里是客户端),发送完最后一次ACK之后进入的状态。并且持续时间还挺长的。客户端TIME_WAIT持续2倍MSL时长,在linux体系中大概是60s,转换成CLOSE状态
      • TIME_WAIT
        • 定义:主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。 由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接
      • CLOSE_WAIT
        • 定义:被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。
      • 相关问题
        • 为什么需要 TIME_WAIT 状态?
          • 假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面 临重发最终ACK的情形。
        • 为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?
          • 如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被 丢弃。建立第二个连接的时候,不会混淆。
        • TCP为什么不是两次连接,而是三次握手?
          • 如果A与B两个进程通信,如果仅是两次连接。可能出现的一种情况就是:A发送完请报文以后,由于网络情况不好,出现了网络拥塞,即B延时很长时间后收到报文,即此时A将此报文认定为失效的报文。B收到报文后,会向A发起连接。此时两次握手完毕,B会认为已经建立了连接可以通信,B会一直等到A发送的连接请求,而A对失效的报文回复自然不会处理。依次会陷入B忙等的僵局,造成资源的浪费。
        • 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
          • 因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
        • 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
          • 虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文。
        • 总结:TCP如何保证可靠传输?
          1. 三次握手。
          2. 将数据截断为合理的长度。应用数据被分割成 TCP 认为最适合发送的数据块(按字节编号,合理分片)
          3. 超时重发。当 TCP 发出一个段后,它启动一个定时器,如果不能及时收到一个确认就重发
          4. 对于收到的请求,给出确认响应
          5. 校验出包有错,丢弃报文段,不给出响应
          6. 对失序数据进行重新排序,然后才交给应用层
          7. 对于重复数据能够丢弃重复数据
          8. 流量控制。TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端 只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲 区溢出。
          9. 拥塞控制。当网络拥塞时,减少数据的发送。
        • 专业名词解释
          • 滑动窗口
            • TCP 利用滑动窗口实现流量控制的机制。
            • 滑动窗口(Sliding window)是一种流量控制技术。早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题。
            • TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。
          • 流量控制
            • TCP 利用滑动窗口实现流量控制。
            • 流量控制是为了控制发送方发送速率,保证接收方来得及接收。
            • 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
          • 拥塞控制
            • 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
            • 拥塞处理包括了四个算法,分别为:慢开始,拥塞避免,快速重传,快速恢复。
            • [外链图片转存失败(img-0cEYWCie-1562327473918)(字节跳动.assets/字节跳动-6d973ad7.png)]
              • 慢开始
                • 发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。
                • 慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
              • 拥塞避免
                • 拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长
                • 当cwnd<ssthresh时,使用慢开始算法。
                • 当cwnd>ssthresh时,改用拥塞避免算法。
                • 当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
                • 无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。
              • 快速重传
                • 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
                • [外链图片转存失败(img-acYlur86-1562327473919)(字节跳动.assets/字节跳动-bf128aa4.png)]
              • 快速恢复
                1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
                2. 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。
                  TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输
  • HTTP
    • 定义:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

    • 特点

      1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
      2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
      3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
      4. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
      5. 支持B/S及C/S模式
    • 通信传输流
      [外链图片转存失败(img-6KHbuzQw-1562327473919)(字节跳动.assets/字节跳动-83336b8f.png)]

      • 发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反之,接收端在层与层传输数据时,每经过一层时会把对应的首部消去
      • ARP 是一种用以解析地址的协议,根据通信方的 IP 地址就可以反查出对应的 MAC 地址。
    • 各种协议与HTTP协议的关系

      • [外链图片转存失败(img-wRL0iw3E-1562327473920)(字节跳动.assets/字节跳动-6868c863.png)]
    • 请求消息Request和响应消息Response

      • 下面则是从客户端发送给某个 HTTP 服务器端的请求报文中的内容:
         GET /index.htm HTTP/1.1
         Host: hackr.jp
      
      • 起始行开头的GET表示请求访问服务器的类型,称为方法(method)。随后的字符串 /index.htm 指明了请求访问的资源对象, 也叫做请求 URI(request-URI)。最后的 HTTP/1.1,即 HTTP 的版本号,用来提示客户端使用的 HTTP 协议功能。 综合来看,这段请求内容的意思是:请求访问某台 HTTP 服务器上的/index.htm 页面资源。
      • 请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
      • 请求内容的处理结果以响应的形式返回:
        HTTP/1.1 200 OK
        Date: Tue, 10 Jul 2012 06:50:15 GMT
        Content-Length: 362
        Content-Type: text/html
        <html>
        ……
        
      • 在起始行开头的 HTTP/1.1 表示服务器对应的 HTTP 版本。紧挨着的 200 OK 表示请求的处理结果的状态码(status code)和原因 短语(reason-phrase)。下一行显示了创建响应的日期时间,是首部字段(header field)内的一个属性。 接着以一空行分隔,之后的内容称为资源实体的主体(entitybody)。
    • HTTP是无状态协议

      • HTTP 协议自身不具备保存之前发送过的请求或响应的功能,这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
      • HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能,于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
    • Keep-Alive模式

      • 当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
        [外链图片转存失败(img-G3W7lbwT-1562327473921)(字节跳动.assets/字节跳动-3fd80941.png)]
      • http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭
      • 当HTTP采用keepalive模式,当客户端向服务器发生请求之后,客户端如何判断服务器的数据已经发生完成?
        1. 使用消息首部字段Conent-Length
          • 故名思意,Conent-Length表示实体内容长度,客户端(服务器)可以根据这个值来判断数据是否接收完成。但是如果消息中没有Conent-Length,那该如何来判断呢?又在什么情况下会没有Conent-Length呢?请继续往下看……
        2. 使用消息首部字段Transfer-Encoding
          • 当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-length消息首部字段告诉客户端需要接收多少数据。但是如果是动态页面等时,服务器是不可能预先知道内容大小,这时就可以使用Transfer-Encoding:chunk模式来传输数据了。即如果要一边产生数据,一边发给客户端,服务器就需要使用"Transfer-Encoding: chunked"这样的方式来代替Content-Length。
          • chunk编码将数据分成一块一块的发生。Chunked编码将使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分,头部内容指定正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。
    • 状态码

      • 200 OK //客户端请求成功
      • 301 Moved Permanently //永久重定向,使用域名跳转
      • 302 Found // 临时重定向,未登陆的用户访问用户中心重定向到登录页面
      • 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
      • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
      • 403 Forbidden //服务器收到请求,但是拒绝提供服务
      • 404 Not Found //请求资源不存在,eg:输入了错误的URL
      • 500 Internal Server Error //服务器发生不可预期的错误
      • 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    • HTTP方法

      1. get:客户端向服务端发起请求,获得资源。请求获得URL处所在的资源
      2. post:向服务端提交新的请求字段。请求URL的资源后添加新的数据
      3. head:请求获取URL资源的响应报告,即获得URL资源的头部
      4. patch:请求局部修改URL所在资源的数据项
      5. put:请求修改URL所在资源的数据元素
      6. delete:请求删除url资源的数据
    • GET和POST区别

      • GET
        • 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的

        /test/demo_form.asp?name1=value1&name2=value2

        1. GET 请求可被缓存
        2. GET 请求保留在浏览器历史记录中
        3. GET 请求可被收藏为书签
        4. GET 请求不应在处理敏感数据时使用
        5. GET 请求有长度限制(浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url)
        6. GET 请求只应当用于取回数据
        7. GET产生一个TCP数据包(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
      • POST
        • 请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

        POST /test/demo_form.asp HTTP/1.1
        Host: w3schools.com
        name1=value1&name2=value2

        1. POST 请求不会被缓存
        2. POST 请求不会保留在浏览器历史记录中
        3. POST 不能被收藏为书签
        4. POST 请求对数据长度没有要求
        5. POST产生两个TCP数据包(对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据))
      • 相同点
        • HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的
      • 一次完整的HTTP请求过程
        • 域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
      • HTTP长连接
        • 在HTTP1.0和HTTP1.1协议中都有对长连接的支持。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持.
        • http1.0请求与服务端的交互过程:
          1. 客户端发出带有包含一个header:”Connection: keep-alive“的请求
          2. 服务端接收到这个请求后,根据http1.0和”Connection: keep-alive“判断出这是一个长连接,就会在response的header中也增加”Connection: keep-alive“,同是不会关闭已建立的tcp连接.
          3. 客户端收到服务端的response后,发现其中包含”Connection: keep-alive“,就认为是一个长连接,不关闭这个连接。并用该连接再发送request.转到a)
        • URI是以一种抽象的,高层次概念定义统一资源标识,URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。
      • HTTPS和HTTP的区别
        • https协议需要到CA申请证书,一般免费证书很少,需要交费。
        • http是超文本传输协议,信息是明文传输;https 则是具有安全性的ssl加密传输协 议。
        • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
        • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
        • http默认使用80端口,https默认使用443端口
    • HTTP的缺点

      1. 通信使用明文(不加密) , 内容可能会被窃听
      2. 不验证通信方的身份, 因此有可能遭遇伪装
      3. 无法证明报文的完整性, 所以有可能已遭篡改
  • HTTPS
    • 定义:
      • HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用SSL(Secure Socket Layer) 和 TLS(Transport Layer Security) 协议代替而已。
      • 通常, HTTP 直接和 TCP 通信。 当使用 SSL时, 则演变成先和 SSL通信, 再由 SSL和 TCP 通信了。 简言之, 所谓 HTTPS, 其实就是身披SSL协议这层外壳的 HTTP。
      • SSL是独立于 HTTP 的协议, 所以不光是 HTTP 协议, 其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL协议使用。 可以说 SSL是当今世界上应用最为广泛的网络安全技术
    • https是如何保证数据传输的安全
      • https实际就是在TCP层与http层之间加入了SSL/TLS来为上层的安全保驾护航,主要用到对称加密、非对称加密、证书,等技术进行客户端与服务器的数据加密传输,最终达到保证整个通信的安全性。
        [外链图片转存失败(img-NvZ3DGiN-1562327473921)(字节跳动.assets/字节跳动-bc73734f.png)]
      • SSL/TLS
        • SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”
        • 因为原先互联网上使用的HTTP协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。 SSL 因为应用广泛,IETF 就把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。所以两个是没区别的
      • SSL/TLS作用
        1. 认证用户和服务器,确保数据发送到正确的客户机和服务器;
        2. 加密数据以防止数据中途被窃取;
        3. 维护数据的完整性,确保数据在传输过程中不被改变。
          [外链图片转存失败(img-Gb45gyF6-1562327473922)(字节跳动.assets/字节跳动-6baa6564.png)]
  • 网络为什么要分层
    • 网络协议分层,和计算机领域的其他分层,比如三层架构的分层,在本质上是一样的。分层的本质是通过分离关注点而让问题简单化。再说一遍,分层的本质是通过分离关注点而让问题简单化。
    • 当一个系统足够复杂时,通过聚合分为不同层次, 每层都是内聚的,对外屏蔽复杂性。 那么宏观上看去,管理和问题定位很容易到具体层次。 然后层层递进,很容易定位问题。
      1. 只关注整个结构中的其中某一层,它只需要知道通过与底层的接口就可以获得所需要的服务;
      2. 可以很容易的用新的实现来替换原有层次的实现
      3. 可以降低层与层之间的依赖
      4. 使得复杂的计算机网络系统变得易于设计,实现和标准化
      5. 利于各层逻辑的复用
  • URI和URL
    • URI(Uniform Resource Identifier 的缩写,统一资源标识符),用来唯一的标识一个资源。
    • Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的。 URI一般由三部组成:
      1. 访问资源的命名机制
      2. 存放资源的主机名
      3. 资源自身的名称,由路径表示,着重强调于资源。
    • URL(Uniform/Universal Resource Locator 的缩写,统一资源定位符),它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
    • URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
    • 采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
      1. 协议(或称为服务方式)
      2. 存有该资源的主机IP地址(有时也包括端口号)
      3. 主机资源的具体地址。如目录和文件名等
        [外链图片转存失败(img-Gew3O9gi-1562327473922)(字节跳动.assets/字节跳动-11deee91.png)]
  • 为什么有IP地址还需要MAC地址
    • IP可以保证要发送的包在网络中传输,到达目标服务器所在的局域网的网关。 但是到了网关后,IP就没用了,因为局域网的IP对应的机器是不确定的,可能今天对应A机器,明天对应B机器。 所以在局域网中使用IP寻址是不严谨的,这时就需要MAC地址来唯一对应一台机器,这样网络包就可以准确的传输到需要的主机上了
  • DNS使用的协议
    • 既使用TCP又使用UDP
    • 首先了解一下TCP与UDP传送字节的长度限制:
      • UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。
    • 区域传送时使用TCP,主要有一下两点考虑:
      1. 辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。‘
      2. TCP是一种可靠的连接,保证了数据的准确性。
    • 域名解析时使用UDP协议:
      • 客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。
  • Cookies和Session区别
    • Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。 session: 当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。 cookie机制:采用的是在客户端保持状态的方案,而session机制采用的是在服务端保持状态的方案。同时我们看到由于服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助cookie机制来达到保存标识的目的。
    • Session是服务器用来跟踪用户的一种手段,每个Session都有一个唯一标识:session ID。当服务器创建了Session时,给客户端发送的响应报文包含了Set-cookie字段,其中有一个名为sid的键值对,这个键值Session ID。客户端收到后就把Cookie保存浏览器,并且之后发送的请求报表都包含SessionID。HTTP就是通过Session和Cookie这两个发送一起合作来实现跟踪用户状态,Session用于服务端,Cookie用于客户端
    • 现在很多技术开始使用token进行身份的确认,java中有webtoken

说一下timewait和closewait(大佬讲了timewait中等待报文在网络中消失具体指的是路由器的缓存)

  • 上文详细介绍

说一下拥塞控制。udp报文最大长度(说了MTU1500,但是之前在网上看到过实际会更小,后来看到Internet是576)

  • 上文详细介绍

http长连接短连接

  • 上文详细介绍

路由器是哪一层的,有什么功能,路由寻址怎么找的,路由表存了什么

  • 路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。
  • 路由器包含了3(网络层)、2(数据链路层)和1(物理层)三层。

ping协议会发生什么事情

总结步骤:
(1) A主机构建一个ICMP格式的数据包;
(2) ICMP协议+B主机的IP地址 交给IP协议;
(3) IP层构建一个数据包(A主机的IP地址+控制信息+B主机的IP地址),获得B主机的MAC地址,以便构建一个数据帧(IP协议会根据B主机的IP地址和自己的子网掩码判断是不是属于同一层网络。如果是属于同一层网络的话,就会获得B主机的MAC地址)
(4) 主机B接受到主机A的发过来的数据帧以后,先检查该帧中包含的B的IP地址,并和本地的物理地址进行比对,如果符合的话,就接受,否则,就抛弃。同样,需要将该数据帧交由自己的IP层协议,IP层检查以后,再交由ICMP协议,构建一个ICMP的应答包,发送给主机A。

2、http是有状态还是无状态? TCP是有状态还是无状态?

非常详细

客户端禁用cookie怎么办? 你说的实现方式安全吗(使用token实现)

4、SL,http和https,https是有状态还是无状态?

  • TL; DR:传输管道(TLS)是有状态的
  • TLS / SSL是有状态的。 Web服务器和客户端(浏览器)缓存会话,包括加密密钥以提高性能 不 为每个请求执行密钥交换。
  • HTTPS中的S与传输有关,而与协议无关。对于HTTPS,HTTP协议的语义保持不变。如 关于维基百科上的HTTPS的文章 状态,

TCP状态转换图,画一下。

[外链图片转存失败(img-n1Zl6QTq-1562327473923)(字节跳动.assets/字节跳动-ed7be458.png)]

(4)dns协议,让后udp还是tcp

  • DNS在进行区域传输的时候使用TCP协议,其它时候则使用UDP协议;
  • 为什么既使用TCP又使用UDP?
    • 域名解析时使用UDP协议:
      客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过TCP三次握手,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。
      区域传送时使用TCP,主要有一下两点考虑:
      1.辅域名服务器会定时(一般时3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。区域传送将使用TCP而不是UDP,因为数据同步传送的数据量比一个请求和应答的数据量要多得多。
      2.TCP是一种可靠的连接,保证了数据的准确性。

(5)http response里面都有哪些内容

基本算法

反转链表,topk问题说思路、时间复杂度

树的节点最大距离

链表翻转

二叉树的最大路径

二叉树Z字打印

一个从1开始的有序数组,找字典序第k大的数,说思路(leetcode440 没做过,提示了一下树,想出来了)

排序算法

O(Nlog(N))的排序算法?我回答有归并排序、快排、堆排,数组转换为堆

连通域的数量

二分搜索相关

实现一个缓存队列 ,二叉树的镜像

java

线程池实现

生产者消费者实现(BlockingQueue)

java垃圾回收机制

集合

ArrayList
  • 遍历的时候能删除元素吗? 删除的时候会报什么异常
CopyOnWriteArrayList的相关特性?
hashmap
  • hashmap插入的时候,哈希冲突解决? 查找的时候,哈希冲突怎么解决

5、String为什么设计成final不可变? 是怎么实现不可变的?6、自己能实现一个不可变的类吗?

equals 和 hashcode 为什么要一起重写?如果不重写hashcode会出现什么问题?

多线程:并发和并行,原子类,CAS操作

17、synchronized和reentrentlock哪个效率高?

分布式、微服务、负载均衡、高可用

设计模式

单例

redis缓存

redis都有哪些数据类型

数据库

索引的使用条件 优化 最左原则

数据库索引,然后说一下索引的优缺点

SQL

mysql的索引:B+树底层实现?B树的底层实现?为什么要用B+树而不用B树?

最左前缀匹配具体是怎么实现查找的?最左前缀匹配用了B+树的哪些特性?

(a,b,c)联合索引,为什么不能单用(b),而一定要用(a,b)?B+树是怎么实现的?

什么是幻读,不可重复读?这些概念是在事务内还是事务外?事务内?

mysql怎么实现可重复读?设置了可重复读隔离级别底层是怎么实现的? (MVCC)

了解MVCC吗?怎么实现的?什么是快照读?快照读能读取到最新的吗?快照读和当前读的区别?

linux系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值