Java面经——计算机网络

/ Java面经 / 0 条评论 / 4691浏览

经过两个月的面试,还是积累了比较多的面试经验,面试的时候会问很多基础的东西,然而这些往往是平时容易忽略的知识。现在我将这两个月准备的内容以及面试中常问的知识点都整理一下写成博客,方便大家也方便自己以后复习巩固,有的回答不一定标准,如果发现问题欢迎联系我进行修正。今天的内容是计算机网络部分。

1.OSI开放式互联参考模型有哪些组成?

第1层:物理层

机械、电子、定时接口通信信道上的原始比特流传输,将010101等比特数据转换为电流强弱来进行传输(数模转换与模数转换)

网卡

第2层:数据链路层

物理寻址,同时将原始比特流转换为逻辑传输线路。这一层提供错误检测与纠正,以确保数据传输的可靠性。

交换机

第3层:网络层

将网络地址翻译成对应的物理地址。控制子网的运行,入逻辑编制、分组传输、路由选择。

协议:TCP/IP

路由器

第4层:传输层

传输层解决了传输质量的问题,控制流量、数据包分割等。

协议:TCP、UDP

第5层:会话层

不同机器上的用户之间建立及管理会话。

第6层:表示层

解决不同系统语法通信的问题,加解密、转换翻译、压缩解压缩。

第7层:应用层

协议:HTTP

2.TCP/IP模型有哪些组成?

该模型将OSI中的应用层、表示层、会话层归并到应用层,数据链路层、物理层归并到链路层。

先自上而下,后自下而上处理数据头部。

3.什么是TCP协议?

TCP是网络传输层协议,是一种面向连接的、可靠传输的、基于字节流的传输协议。

4.什么是UDP协议?

UDP也是网络传输层协议,是一种无连接的传输协议,提供面向事务的简单不可靠信息传送服务,传输速率相对较快,但不能保证数据可靠性。

5.TCP报文头有哪些组成?

包含源端口和目的端口、Sequence Number(分段标识符)、Acknowledgement Number(确认收到的标识符)

TCP Flags:

  • URG:紧急指针标志
  • ACK:确认序号标志
  • PSH:push标志
  • RST:重置连接标志
  • SYN:同步序号,用于建立连接过程
  • FIN:finish标志,用于释放链接

进程间通信必须有唯一标识符,在同一计算机中用PID标识,在不同计算机中用端口标识。

6.UDP报文有哪些组成?

源端口号、目的端口号、目的地址、数据报长度、奇偶校验和、数据等

7.讲一讲TCP的三次握手?

握手是为了建立连接(为了初始化Sequence Number),避免传输的数据包乱序问题,握手成功之后会建立一个全双工通信通道。

8.讲一讲三次握手中SYN Flood隐患以及其解决措施

SYN Flood问题起因:

SYN Flood隐患:恶意程序向服务器发送SYN数据报,然后下线,造成服务器要等63秒才能断开连接,攻击者就可以将服务器的SYN队列耗尽,让正常的连接无法进行。

针对SYN Flood的防护措施

9.TCP的保活机制。

10.为什么需要第三次握手?两次不可以吗?

不可以

  1. TCP会用Sequence Number来拼接数据保证数据的有序性,为了初始化Sequence Number的初始化值,第二次报文发送了Seq之后需要第三次向服务器确认
  2. 如果首次握手超时,客户端已经掉线服务器就建立连接会容易遭受SYN Flood攻击,第三次握手确保客户端在线
  3. 如果首次握手超时,客户端并没有掉线,客户端重发数据包导致多个客户端SYN请求到服务器,如果没有第三次握手就会建立多个新的连接,有了第三次握手确认一次之后其他SYN包会被丢弃

客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到链接释放以后的某个时间才到达Server。这是,Server误以为这是Client发出的一个新的链接请求,于是就向客户端发送确认数据包,同意建立链接。若不采用“三次握手”,那么只要Server发出确认数据包,新的链接就建立了。由于client此时并未发出建立链接的请求,所以其不会理睬Server的确认,也不与Server通信;而这时Server一直在等待Client的请求,这样Server就白白浪费了一定的资源。若采用“三次握手”,在这种情况下,由于Server端没有收到来自客户端的确认,则就会知道Client并没有要求建立请求,就不会建立链接。

11.讲一讲TCP的四次挥手

12.为什么需要四次挥手?

因为TCP是全双工,发送方和接收方都需要FIN报文和ACK报文

13.四次挥手中为什么会有TIME_WAIT状态

14.什么情况下服务器会出现大量CLOSE_WAIT状态?

当很多Client大量请求然后关闭Socket连接,服务器方忙于读或写,没有及时关闭连接。

服务器一旦达到CLOSE_WAIT上限就会抛出too many open files异常,甚至有可能造成服务器崩溃。

15.TCP的特点

16.UDP的特点

17.TCP协议如何来保证传输的可靠性

18.解释一下什么是RTT和RTO

19.TCP滑动窗口的作用

20.解释一下TCP中的滑动窗口协议

窗口滑动协议是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待接收确认报文前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。

在TCP报文头中的window字段用于接收方通知发送方还有多少缓存区可以接收数据,避免过多数据发送到接收方,造成接收方来不及处理甚至缓存区崩溃。

TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP窗口机制有两种,一种是固定窗口大小,另一种是滑动窗口。数据在传输时,TCP会对所有数据进行编号,发送方在发送过程中始终保持着一个窗口,只有落在发送窗口内的数据帧才允许被发送;同时接收方也始终保持着一个接收窗口,只有落在窗口内的数据才会被接收。这样通过改变发送窗口和接收窗口的大小就可以实现流量控制。

窗口计算过程原理图如下图所示,其各个指针含义:

发送方窗口:

接收方窗口:

21.什么情况会造成流量控制的死锁?如何避免死锁发生?

当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。

为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。

22.拥塞控制和流量控制的区别

23.在浏览器地址栏输入一个地址,按下回车之后经历的流程

  1. DNS解析。逐层查询url的DNS缓存,解析出url域名所对应的ip地址,其顺序是:浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、根域名服务器缓存、顶级域名服务器缓存;
  2. TCP链接。根据ip地址简历TCP链接,三次握手;
  3. 发送HTTP请求;
  4. 服务器处理请求并返回HTTP报文;
  5. 浏览器收到服务器发送的html文件并渲染到窗口;
  6. 释放TCP连接,四次挥手。

24.HTTP状态码

25.解释一下HTTP 1.0、1.1、2.0各版本的区别

HTTP1.0不支持长连接,1.1以后支持长连接,从头部Keep-Alive可以看到。

HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求

HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent  connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).

HTTP2.0多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;支持request多路复用;新的二进制格式压缩头部

26.GET请求和POST请求的区别

之前有写过这个问题的博客,见我另一篇博客:HTTP中GET与POST的区别

27.什么是SSL?

SSL全名Security Sockets Layer,即安全套接层,它是为网络通信提供安全及数据完整性的一种安全协议,是操作系统对外的API,SSL3.0后更名为TLS。它采用身份验证和数据加密保证网络通信的安全和数据的完整性。

28.SSL使用的加密算法有哪些?

29.简述一下HTTPS协议的数据传输流程

  1. 浏览器将支持的加密算法信息发送给服务器
  2. 服务器选择一套浏览器支持的加密算法,将验证身份的信息以证书的形式回发给浏览器
  3. 浏览收到证书验证其合法性,并结合证书公钥加密信息发送给服务器
  4. 服务器使用私钥解密信息,验证哈希,加密相应消息回发浏览器
  5. 浏览器解密相应消息,并对消息进行验证。

30.HTTP和HTTPS有什么区别?

31.什么是Socket?

socket是TCP/IP协议的抽象,是操作系统对外开放的接口

32.简述一下socket通信流程

见下图:

33.请使用java编写一个基于TCP通信的程序

见我之前的博客:Java网络编程实现

34.请使用java编写一个基于UDP通信的程序

见我之前的博客:Java实现UDP通信

微信公众号浏览体验更佳,在这里还有更多优秀文章为你奉上,快来关注吧!

北风IT之路