Java21届秋招面试题总结-网络篇

1.什么是OSI七层网络模型?

OSI七层模型是使各种计算机在世界范围内互连为网络的标准框架,由以下七层组成(由高到低)

应用层:直接面向用户的程序或服务,包括系统程序和用户程序,也可以理解为在电脑屏幕上看到的内容,即终端应用

常见协议:HTTP、FTP、DNS、SMTP

表现层:表示层就解决了不同系统之间的通信语法问题,主要是解释通讯数据的意义,如代码转换、格式变换等,使不同的终端可以表示。

会话层:为传输层服务,通过传输层建立数据连接传输通路。在不同的终端之间建立会话,并负责管理会话。

传输层:传输层为应用进程之间提供端到端的逻辑通信,定义了一些传输数据的协议和端口,主要从下层接收的数据进行分段和传输,到达目的地址后再进行重组。

常见协议:TCP、UDP

网络层:从源主机到目的主机选择一条合适的传输路径,承接传输层,为端到端的数据传输提供服务,并通过路由器实现功能

常见协议:IP、ARP、ICMP、IGMP

数据链路层:将物理层接收到的数据进行MAC地址的封装与解封装,这一层的数据叫做帧,并提供错误检测、纠正、流量控制,以确保数据的可靠传输

物理层:规定两个物理设备的标准,如网线的接口类型、各种传输介质的传输速率等。具体就是一台设备发bit流,另一台能够收到。发送端与接收端进行数模转换。

 

2.TCP协议的三次握手

先上图

Java21届秋招面试题总结-网络篇_第1张图片

顾名思义,三次握手代表TCP建立连接的三个阶段,即连接建立、数据传送、连接释放,在此过程中客户端和服务端需要交换三个TCP报文段。

第一次握手:客户端向服务端发出连接请求报文段,此时首部同步位为SYN=1,并携带一个序列号seq=x。值得注意的是,SYN报文段(即SYN=1的报文段)在TCP协议下是不能携带数据的,但需要消耗序列号

第二次握手:服务端接受到请求,向客户端发送确认报文段,SYN位和ACK位都为1,确认号ack=x+1,以及一个序列号seq=y。同样,这个报文段不能携带数据,需要消耗序列号

第三次握手:客户端向服务端发送确认,ACK位为1,确认号ack=y+1。需要注意的是,ACK报文段可以携带数据,如果不携带数据则不消耗序号

 

延伸问题:为什么不是两次握手或是四次握手?

1.三次握手保证了客户端和服务端都有发送和接收数据的能力,如果仅是两次握手,只能保证客户端有发送数据能力以及接收端有发送和接收数据能力。

2.仅两次握手,服务端不能知道客户端接收到其发送的数据。

如,第一次客户端发送请求,第一次握手请求由于网络阻塞等原因卡在半路。客户端发送第二次请求,双方经过两次握手之后进行数据传输。传输完成后,双方释放连接,进入CLOSED状态。此时被阻塞的第一次请求到达服务端,服务端收到后,开辟空间准备接受连接,并发送请求给客户端。但是这个时候客户端处于CLOSED状态,它是不会接收服务端发过来的数据包的。服务端发送完后,没有第三次握手,不知道客户端是CLOSED,所以会一直等待,造成服务器资源浪费

3.四次握手多此一举。

 

3.TCP协议的四次挥手

先上图

Java21届秋招面试题总结-网络篇_第2张图片

第一次挥手:客户端向服务端发出连接释放报文段,并停止发送数据,主动关闭TCP连接。报文段中首部终止控制位FIN置1,其序号seq=,x,其值等于前面已传送过的数据的最后一个字节的序号加1。A进入FIN_WAIT_1状态

第二次挥手:服务端向客户端发出确认报文,确认号ack=x+1,自身序列号为seq=y,等于服务端前面已传送过的数据的最后一个字节的序号加1。服务端进入CLOSE_WAIT状态。注意,此时TCP连接仅处于半关闭状态,即仅客户端向服务端这个方向关闭了而已。服务端向客户端发数据,客户端仍要接收

第三次挥手:服务端主动向客户端释放连接,发出的报文必须使FIN=1,ACK=1,同时还必须重复上面的确认号ack=x+1。并消耗一个新的序列号

第四次挥手:客户端发送最后的确认,将ACK置1,确认号ack=z+1,以及序列号seq=w。然后进入到TIME_WAIT状态。注意,此时TCP连接还没有完全释放。必须经过2MSL(MSL为最长报文段寿命)后客户端才会进入CLOSED状态

 

延伸问题1:为什么需要2MSL?

1.防止客户端向服务端发送消失超时或ACK丢失,预留的时间可以完成重发,重新完成第三次挥手+第四次挥手

2.防止客户端在服务端确认关闭前,再次连接上该服务端,所以要保证服务端要在客户端前关闭

虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假想网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

 

延伸问题2:为什么TCP断开连接比建立连接多一次?

第二次挥手,服务端接收到客户端发过来的FIN报文,此时服务端可能正在传输数据,不能立即停止发送数据,因此只能先发送一个ACK确认报文告诉客户端收到了FIN报文。等到要发送的数据发送完了,才会主动向客户端发送FIN报文

第二次握手可以将SYN和ACK一起发送,但是第二次挥手不能将ACK和FIN一起发送,所以多了一次

 

4.TIME_WAIT、CLOSE_WAIT状态的作用,大量出现怎么办?

1.TIME_WAIT是主动释放连接方才会出现的状态,第四次挥手时,如最终ACK丢失,即挥手失败,被关闭方必须重新发送FIN进行第三次挥手,而关闭方必须维持TIME_WAIT状态,保证自己可以接收,然后再重发最终ACK

当处于TIME_WAIT状态时,源端口无法被使用。大量TIME_WAIT状态时,需要打开系统的TIME_WAIT重用和快速回收

2. CLOSED_WAIT是被动关闭的一方才会出现的状态。在对方关闭连接后,自身程序里没有检测,或者本身忘了需要自身主动关闭连接(第三次挥手),于是这个资源就一直被程序占用着

出现大量CLOSED_WAIT时,需要立即关闭运行程序,或者修改程序的bug,然后测试上线

 

5.如何解决TCP的粘包问题?

在TCP传输过程中,发送端为了提高效率,经常将多个数据包缓存起来,合成一个数据包进行发送。粘包问题就是两个不同的数据包,被合并成一个包,造成错误处理

解决:发送端在发送数据之前,向接收端告知发送内容的大小。具体做法是

1.在每次发送数据的固定偏移位置,写入数据包的长度(发送端和接收端约定好的),拿到数据包后先读该偏移位置的长度

2.接收端读取到偏移的数据时,就可以知道数据包的长度

3.当接收到的数据长度不足时,继续接收直到满意的长度

4.当接收的数据多于固定长度时,则截断数据,并将多于的数据缓存起来,按照第三步处理

 

6.HTTP协议中1.0、1.1与2.0版本有什么区别

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

2.HTTP1.1 在一个TCP连接上可以传输多个HTTP请求和响应(长连接),减少了建立和关闭连接的消耗和延迟。同时,允许客户端不用等待上一次请求结果返回,就可以发出下一次请求。但服务器端必须按照接收到客户端请求的先后顺序,依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。这样就容易造成响应阻塞。

3.HTTP2.0支持多路复用,一个TCP连接可以有多个并行的请求,而HTTP1.1版本中客户端需要发送多个并行请求,则必须使用多个TCP连接。此外HTTP2.0中,采用二进制分帧机制,帧是最小的数据单位,客户端和服务器HTTP消息分解为互不依赖的帧,然后乱序发送,然后在接收端重新组装,这样就完成了消息的传输。HTTP2.0通过二进制分帧机制,发送端将这些帧乱序发送,在接收端并行交错地发送响应,响应之间互不干扰。通过该技术,避免了HTTP1.1的队首阻塞问题,极大提高传输性能

 

7.什么是HTTPS协议,如何保证加密通信?

HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

使用HTTPS协议在传输数据之前,需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方传输数据的时候使用的密码。下面来具体说一下这次握手的过程。

Java21届秋招面试题总结-网络篇_第3张图片

过程梳理:

1.浏览器将自己支持的一套加密规则发给服务器,服务器从中选择一组加密算法和Hash算法

2.服务器向浏览器发送数据包(包含证书,网站地址,加密公钥,颁发机构),浏览器会对证书进行验证,如果该证书可靠,浏览器左上角会显示一把锁,表示安全连接

3.浏览器生成一串随机数,并使用接收到的加密公钥对其进行加密,加密后将其发给服务器,服务器用自己的私钥对其解密,即双方商定了一个随机数。该随机数成为后续双方通信的密钥

注意:在双方商定随机数的这一过程使用的是非对称加密的方式,后续双方进行数据的通信则为对称加密的方式

 

8.在浏览器中打开一个网址,整个过程是怎么样的?

比如在浏览器上输入www.baidu.com,直到页面响应在浏览器上,经历了什么呢?

可以按照前面说到的网络传输的层级结构来回答

1.DNS解析:输入网址后,浏览器会去查找DNS服务器,通过DNS服务器解析域名后,返回对应的IP地址(应用层)

2.发送HTTP请求:将浏览器发出的请求,遵循HTTP协议,打包成一个HTTP请求数据包(传输层)

3.建立TCP连接:使用TCP协议建立可靠连接,TCP连接需要设置端口,发送方的端口随机选一个,接收方的端口一般是默认的80端口,对请求数据进行包装,加上TCP头,存端口信息(传输层)

4.IP路由选择:通过IP协议,对TCP数据包再加一个IP头,包含本机和目标机器的IP地址(网络层)

5.IP地址解析:通过ARP协议将IP地址解析为对应的MAC(物理)地址,通过以太网协议,把IP数据包封装到以太网数据包中,然后加上以太网数据包的头,头里放了本机网卡的MAC地址和网关的MAC地址(数据链路层)

注意:IP地址和MAC地址是对应的关系,一个网络设备的IP地址可以更换,但是MAC地址一般是固定不变的

6.处理请求:服务器处理请求返回响应,浏览器解析渲染页面

 

9.TCP和UDP的区别?

1.TCP是面向连接的,传输数据前通信双方需要通过三次握手建立可靠连接,UDP是面向无连接的,通信双方不需要建立连接即可发送数据。

2.TCP传输的数据无差错,不丢失,安全可靠,按序到达,UDP只会尽力发送数据,不保证数据的可靠。

3.TCP是一点对一点的,但UDP可以一点对多点

4.TCP是以字节流模式发送数据的,UDP是以数据报模式发送的

5.TCP应用场景为文件下载,文件传输。要求数据传输可靠性高;UDP应用场景为视频语音,直播等实时传输量较大的应用场景。要求数据传输速度高

 

延伸问题:TCP是如何保证可靠传输的?

  1. 分割数据段
  2. 包编号
  3. 校验和
  4. 丢弃重复数据
  5. 流量控制
  6. 阻塞控制
  7. ARQ协议
  8. 超时重传

 

10.GET请求和POST请求有哪些区别?

1.传参位置: Get请求参数在地址栏,Post请求参数在HTTP请求体

2.参数大小 :Get请求参数为1K,Post请求参数大小无限制

3.是否缓存 :Get请求浏览器默认会缓存,Post请求不会

4.使用场景 :Get用于读取数据多一些,Post用于修改数据多一些

Get和Post本质上无区别,都是HTTP协议中的请求方式

 

 

 

你可能感兴趣的:(21校招总结,java,网络协议,https,网络)