【Java开发岗面试】八股文—计算机网络

声明:

  1. 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。
  2. 本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试技巧等等,如有建议,可以友好指出,感谢,我也会不断完善。
  3. 想了解我个人情况的,可以关注我的B站账号:东瓜Lee
  1. OSI 七层网络模型,你了解吗?具体功能有哪些?

    总共有7层,自上向下为:

    1. 应用层:构建具体的应用和服务,例如HTTP服务、SNMP服务、DNS服务等等
    2. 表示层:主要对接收的数据进行操作,把计算机能够识别的内容转换成人能够识别的内容。
    3. 会话层:在传输层的基础上建立连接和管理会话。
    4. 传输层:定义了传输数据的协议和端口号,主要用于数据的分段、传输和重组,主要协议有TCP和UDP。
      1. TCP传输控制协议:面向连接的可靠协议
      2. UDP用户数据报协议:面向无连接的不可靠协议
    5. 网络层:主要用于对IP地址进行封装和解析(这一层的数据叫作数据包)(工作设备:路由器、防火墙等)
    6. 数据链路层:主要用于对MAC地址进行解析和封装(这一层的数据叫作数据帧)(工作设备:网桥、交换机)
    7. 物理层:主要定义了物理设备标准,它的主要作用是传输比特流(这一层的数据叫作比特)(工作设备:网卡、集线器、中继器)

    OSI七层网络可以把应用层、表示层和会话层 归到一起 作为应用层,也就是五层网络模型


  1. TCP/IP四层模型?

    1. 应用层:负责具体应用层协议的定义,包括:

      1. HTTP超本文传输协议
      2. FTP文件传输协议
      3. SMTP电子邮件传输协议
      4. DNS域名服务解析协议
    2. 传输层:使源端和目的端机器上的对等实体可以基于会话相互通信。

      ​ 在这一层定义了两个端到端的协议TCP 和UDP 。

    3. 网络层:主要用于数据的传输、路由及地址的解析,以保障主机可以把数据发送给任何网络上的目标。数据经过网络传输,发送的顺序和到达的顺序可能发生变化。

      ​ 在网络层使用IP和ARP(地址解析协议)

    4. 网络接口层:定义了主机间网络连通的协议

      ​ 具体包括Echernet 、FDDI 、ATM 等通信协议


  1. 计算机网络分层的优缺点

    优点:

    1. 相互独立,层与层之间要联系可以通过接口。
    2. 层与层之间的依赖较少,一层的改动不会对另一层有很大的影响。
    3. 有利于标准化,有利于各层逻辑复用

    缺点:

    1. 一层出现了问题容易对其他层产生影响
    2. 有时会导致级联的修改:比如对下层做了修改,那上层也相应要修改,比较麻烦,要把控好全局

  1. 说一下TCP的三次握手?

    这是基于传输层的TCP协议来实现客户端和服务端之间建立连接的方式

    1. 客户端发送SYN报文给服务端
    2. 服务端接收到SYN报文后,回应一个SYN和ACK报文
    3. 客户端收到服务端的SYN报文,回应一个ACK报文给服务端,就建立了连接

  1. 为什么要三次握手?两次行不行?四次呢?

    所谓握手也就是客户端和服务端建立连接的通信过程,理论上来说当然是越少次数越好(通信过程要资源的开销),但是想要建立正确的连接(也就是要保证客户端和服务端都确认 自己和对方 的发送和接收功能是正常的),就至少要有三次握手。

    第一次握手:客户端发送网络包,服务端接收。

    ​ 服务端得出结论:客户端的发送能力、服务端的接收能力是正常的。

    第二次握手:服务端发包,客户端接收。

    ​ 客户端得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器 并不能确认客户端的接收能力是否正常。

    第三次握手:客户端发包,服务端接收。

    ​ 服务端得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常, 就可以建立正确的连接了。

    「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;

    「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。

    TCP第一次握手丢失了,会发生什么?

    ​ 客户端发送给服务端SYN报文后,迟迟得不到服务端的(SYN+ACK)回应,就会触发超时重传 机制,重传5次以后,还是接收不到回应,就不连接了。

    TCP第二次握手丢失了,会发生什么?

    ​ 服务端给客户端发送SYN+ACK报文丢失,那么客户端就会一直等待,会触发重传SYN机制,服 务端也会重传。

    TCP第三次握手丢失了,会发生什么?

    ​ 客户端接收到服务端的SYN+ACK后,会给服务端发送ACK报文,进入连接状态,如果丢失了ACK报文,服务端一直接收不到,就会重传SYN+ACK,让客户端也重传ACK报文。


  1. TCP四次挥手的过程?

    1. 客户端调用断开连接的请求,向服务器端发送一个终止标志位 FIN = 1,seq=u 的消息。

    2. 服务器在收到这个消息后,返回一个 ACK=1,ack=u+ 1 ,seq=v 的消息给客户端,表示接收到客户端断开链路的操作请求。

    3. 服务器端将关闭链路前需要发送给客户端的消息发送给客户端,在等待该数据发送完成后,发送一个终止标志位FIN = 1 ,ACK= 1 ,seq=w,a ck= u+ 1 的消息给客户端(表示关闭链路前服务器需要向客户端发送的消息已经发送完毕,请求客户端确认关闭从服务器到客户端的链路操作。)

    4. 客户端在接收到这个最终的FIN 消息后,发送一个 ACK = l ,seq=u + l ,ack=w+ I 的消息给服务器端,表示接收到服务器端的断开连接请求,并准备断开服务器端到客户端的链路。

      客户端经过等待计时器设置的时间后,客户端将进入CLOSE 状态。


  1. 说一下TCP与UDP的区别?

    1. TCP是传输控制协议,UDP是用户数据报协议
    2. TCP是面向连接的(三次握手、四次挥手),UDP是面向无连接的
    3. TCP是可靠的(使用了接收确认和重传机制,使得发出去的信息都是可达的),UDP是不可靠的(只是将数据发出去,不管能不能接收)
    4. TCP适用于要求可靠数据传输的场景(比如传文件),UDP适用于不需要可靠传输的场景(比如打电话、直播,即使丢包了一些也没关系)
    5. TCP只有一对一的传输方式,UDP可以一对一、一对多、多对多的传输
    6. TCP是面向字节流的,UDP是面向报文

  1. 如果已经建立了TCP连接,但是客户端突然出现故障了怎么办?
    TCP设有一个保活计时器,服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  1. 拔掉网线后,原有的TCP连接还在吗?

    还存在,因为TCP连接在Linux内核中是一个socket结构体,结构体内容包含了TCP的信息,即使拔掉网线,操作系统也不会更改这个结构体的内容,所以TCP连接还是存在的。


  1. TCP的粘包和拆包?

    TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为)一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

    为什么会产生粘包和拆包呢?

    1. 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包;
    2. 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;

    粘包和拆包有什么不好的?

    1. 粘包:把多个数据包粘合在一起进行发送,可能会导致接收端无法正确区分每个数据包,导致接收到的数据出现混乱。
    2. 拆包:把一个大的数据包拆成多个小数据包,可能会导致接收端收到的数据不完整。

    如何解决粘包和拆包呢?

    1. 在发送端 将每个数据包封装为固定长度,接收端按照固定长度来对数据进行解析
    2. 在数据包中 增加特殊字符或者特殊标记,表示一个数据包的开始和结尾

  1. TCP的流量控制?

    简单来说,就是让发送方的发生速率不要太快,防止接收方来不及接收 而出现数据的丢包。

    经过TCP的三次握手后,发送端和接收端就能进行数据传输了,但是发送端不能疯狂地向接收端发送数据,因为接收端接收不过来的话,接收方只能把处理不过来的数据存在缓存区里。如果缓存区都满了,发送方还在疯狂发送数据的话,接收方只能把收到的数据包丢掉,这就浪费了网络资源。

    TCP是通过滑动窗口来进行流量控制的,也就是一个动态变化的窗口。


  1. TCP的拥塞控制?

    由于IP网络自身出现了拥堵,那么发送方的发生速率就要被控制,这就是拥塞控制,目的就是避免 发送方的数据 填满整个网络,使得网络更加拥堵,而出现数据的丢包。

    发生方是能感知到网络出现了拥塞的,比如说发送方没有在规定时间内接收到响应报文,也就是发生了超时,就会认为网络出现了拥塞。

    为了对发送方的发送速率进行限制,定义了一个叫做拥塞窗口的概念,拥塞窗口 cwnd 是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态的变化

    拥塞控制算法

    1. 慢启动
    2. 拥塞避免
    3. 快重传
    4. 快恢复

  1. 如何在 Linux 系统中查看 TCP 的连接状态?
    在 Linux 可以通过 netstat -napt 命令查看。

  1. TCP 和 UDP 分别对应的常见应用层协议有哪些?

    基于TCP的应用层协议有:HTTP、FTP、SMTP、SSH(安全外壳协议)、TELNET(网络电传)

    基于UDP的应用层协议:DNS、TFTP(简单文件传输协议)


  1. IP地址有哪些分类?

    IP地址=网络号+主机号

    1. 网络号:标志主机所连接的网络地址属于互联网的哪一个网络
    2. 主机号:标志主机地址其属于该网络中的哪一台主机

    IP地址分为A,B,C,D,E五大类:

    • A类地址(1~126):以0开头,网络号占前8位,主机号占后面24位。
    • B类地址(128~191):以10开头,网络号占前16位,主机号占后面16位。
    • C类地址(192~223):以110开头,网络号占前24位,主机号占后面8位。
    • D类地址(224~239):以1110开头,保留位多播地址。
    • E类地址(240~255):以11110开头,保留位为将来使用。

  1. 说下ARP 协议的工作过程?

    ARP 地址解析协议,它是用于实现IP地址到MAC地址的映射

    源主机和目的主机进行通信时:

    1. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己的ARP列表,是否存在目的IP地址对应的目的MAC地址:

      1. 如果有,源主机就直接将数据包发送到这个MAC地址对应的目的主机

      2. 如果没有,就向本地网段发起一个 ARP请求的广播包,来查询目的主机对应的MAC地址(ARP请求的数据包里,包括源主机的IP地址、MAC地址、目的主机的IP地址)

        网络中所有的主机收到这个ARP请求包后,会检查其中的目的IP地址是否和自己的IP地址一致:

        1. 如果不相同,就会忽略此数据包;
        2. 如果相同,该主机首先将源主机的IP地址和MAC地址添加到自己的ARP列表中,然后给源主机发送一个 ARP响应数据包,告诉对方 自己就是它需要的MAC地址,源主机收到这个ARP响应数据包后,将目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。
        3. 如果源主机一直没有收到ARP响应数据包,表示ARP查询失败,就不能进行通信。

  1. HTTP的原理?

    1. HTTP 遵循请求/响应模型:客户端向服务器发送请求,服务器处理请求 并响应给客户端。

    2. HTTP 是一个无状态的协议:无状态是指客户端和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应后,连接就被关闭了,在服务器端不会保留连接的有关信息。

      (比如同一个客户端向服务端发送两次请求,服务端并不知道这两次请求是来自同一个客户端发出的)


  1. 在浏览器地址栏输入一个URL 到显示主页的过程是什么?

    1. 浏览器 根据URL 通过域名解析器DNS 查找对应到的IP地址
    2. 浏览器与服务器 通过三次握手 建立TCP连接
    3. 浏览器向服务器 发送一个HTTP请求
    4. 服务器处理请求、生成响应,再将响应返回给浏览器
    5. 浏览器收到响应后进行解析 并渲染页面
    6. 浏览器与服务器 通过四次挥手 结束TCP连接

  1. 说下HTTP/1.0,1.1,2.0的区别?

    1. HTTP/1.0:默认使用短连接,每次请求都需要建立一个TCP连接。

    2. HTTP/1.1:默认使用长连接,TCP连接默认不会关闭,可以被多个请求复用。

      而且还引入了管道机制,在同一个TCP连接里面,客户端可以同时发送多个请求,这样就进一步改进了HTTP协议的效率。

    3. HTTP/2.0:引入了多路复用:在一个连接里,客户端和服务端都可以同时发送多个请求或响应


  1. HTTP 如何实现长连接?在什么时候会超时?

    ​ HTTP/1.0协议默认是短连接,设置长连接可以在头部设置Connection字段指定为keep-alive,从HTTP/1.1以后,连接默认都是长连接。


  1. 说说HTTP常用的状态码及其含义?

    • 1xx - 信息性状态码:比如服务器正在处理客户端的请求。
    • 2xx - 成功类状态码:请求已经完成,服务器向客户端提供了响应。
    • 3xx –重定向状态码:服务器收到了请求,但是请求被重定向到了其他地方。
    • 4xx – 客户端错误状态码:客户端发生错误,比如404页面找不到错误
    • 5xx – 服务端错误状态码:客户端没错误,但是服务器出现了错误。

  1. HTTP 常用的请求方式

    HTTP协议一共有9种请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、TRACE、CONNECT

    熟悉的四种请求方式就是:GET、POST、PUT、DELETE,使用restful开发也就是用这四种请求方式

    @PostMapping:添加操作(对象在请求体)
    @DeleteMapping("/{id}"):根据id删除
    @PutMapping:修改操作(对象在请求体)
    @GetMapping:查询所有
    @GetMapping("/{id}"):通过id查询
    
    1. GET:是最常见也是最简单的http请求,它主要用作于获取资源。也就是说我客户端请求什么,你服务器就原样给我返回什么,可以携带参数,参数直接放在url地址栏。
    2. POST:主要用来传输实体,比如客户端需要向服务器传输一些东西的时候呢,这个时候就可以用POST方法了。也可以用GET,但是没这么安全(信息直接暴露了)
    3. PUT:主要用来传输文件,但是由于Http/1.1的PUT方法不带验证机制,存在安全性问题,所以一般的网站都不用这个方法来进行文件传输。
    4. DELETE:主要是用来删除某个资源,是和PUT完全相反的方法,同时该方法也不带认证机制,所以一般网站并不会对它进行开放使用。

  1. GET和POST有什么区别?

    1. GET的本质是从服务器上获得数据,POST本质是向服务器传递数据
    2. GET传递的参数在url可见,不安全,POST传递的参数在url上不可见,相对安全
    3. GET请求是可以缓存的,POST请求不可以缓存

  1. 请求转发和重定向有什么区别?

    请求转发:request.getRequestDispatcher(URL地址).forward(request, response)

    重定向:response.sendRedirect(URL地址)

    区别

    1. 请求转发是一次请求,重定向是两次请求(请求转发的速度更快)
    2. 请求转发之后地址栏上的地址不会变化,重定向的地址栏会发生变化
    3. 请求转发是服务器的行为,重定向是需要客户端参与的行为
    4. 请求转发的网址只可以是本站点的网址,重定向时可以是任何网址

  1. Cookie和Session是什么?有什么区别?

    Cookie是客户端会话技术、Session是服务端会话跟踪技术

    都是用来完成 一次会话内多次请求间的 数据共享

    区别

    1. 存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
    2. 安全性: Cookie 不安全,Session 安全
    3. 数据大小: Cookie 最大3KB,Session 无大小限制
    4. 存储时间: Cookie 可以长期存储,Session 默认30分钟
    5. 服务器性能: Cookie 不占服务器资源,Session 占用服务器资源
    6. Session其实是基于Cookie实现的。

  1. 什么是HTTPS?

    HTTPS = HTTP+SSL

    HTTP 被用于在浏览器和服务器之间传递信息,但是是以明文的方式发送信息,不提供数据加密,所以容易被截取而直接读取到信息,因此 HTTP 不适合传输一些敏感信息。

    为了保证数据传输的安全, HTTPS 在HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并对浏览器和服务器之间的通信进行了数据加密,以保障数据传输的安全性。

  2. HTTPS的工作原理是什么?

    1. 客户端发起HTTPS请求:输入一个https的网址,然后连接到服务器的443端口。
    2. 服务端返回证书:服务器在收到消息后 响应客户端并返回证书,证书中包含服务器信息、域名、申请证书的公司、公钥、数据加密算法等。
    3. 客户端验证证书:客户端在收到证书后,判断证书的签发机构是否正确,并使用该签发机构的公钥确认签名是否有效, 客户端还会确保在证书中列出的域名就是它正在连接的域名。如果客户端确认证书有效,则生成对称密钥,并使用公钥将对称密钥加密
    4. 客户端和服务端的密钥交换:客户端将 使用公钥加密后的对称密钥 发送给服务器,服务器在接收到对称密钥后使用私钥解密
    5. 进行安全的数据传输:经过上述步骤,客户端和服务器就完成了密钥对的交换,在之后的数据传输过程中,客户端和服务端就可以基于对称加密。数据加密之后在网络上传输,就保证了数据传输的安全性。

  1. HTTPS的加密流程是怎样的?【待学习】

  1. HTTP 与 HTTPS 的区别?

    1. http是超文本传输协议,信息是以明文传输的;https是具有安全性的加密传输协议,引入了SSL,具有了身份验证和数据加密的效果。
    2. http的默认端口为80;https的默认端口为443。

  1. URI和URL的区别?

    URI,全称是Uniform Resource Identifier),统一资源标志符,主要作用是唯一标识到一个资源。

    URL,全称是Uniform Resource Location),统一资源定位符,主要作用是提供资源的路径

    URI像是身份证,可以唯一标识一个人,而URL更像一个住址,可以通过URL找到这个人。


  1. RPC是什么?是一种协议吗?
    RPC(远程过程调用)是一个通用的概念,而不是一个具体的协议。RPC是一种编程模型,允许一个程序调用另一个地址空间中的子函数,通常是在远程系统上,使得调用远程函数像调用本地函数一样。

    实现RPC涉及使用一个或多个协议来完成过程或方法的远程调用。已经开发了几种协议用于实现RPC,每个协议都定义了一组特定的规则和约定,用于执行远程过程调用,但它们都共享相同的基本思想,即使得远程调用看起来像本地调用一样。

    总之,RPC是一种用于进行远程过程调用的编程模型,已经开发了各种协议来实现它。


  1. RPC和HTTP有什么区别和联系?

    RPC是远程过程调用,它的核心目标就是为了让开发人员在调用远程方法的时候 就像调用本地方法一样方便,而且RPC也不是一个协议,它就是一个通信协议的规范

    而HTTP是超文本传输协议,它是浏览器和服务器之间进行数据传输的的通信协议,两者都不是一个类型的,无法比较

    非要说的话就是:

    1. RPC可以基于TCP,也可以基于HTTP

  1. 常见的限流算法

    (比如电商系统有秒杀业务,秒杀的请求量太大了,要做限流)

    1. 固定窗口
    2. 滑动窗口
    3. 漏桶算法
    4. 令牌桶算法

【后续继续补充,敬请期待】

你可能感兴趣的:(---Java开发岗面试---,java,面试,计算机网络,春招,秋招,校招,offer)