Java面试题之计算机网络篇

前言

本系列是有关Java开发的面试题,结合本人实际面试经历以及网上面试经验总结而来。这是第三篇。以下内容均为本人参考别人的文章(https://Javaguide.cn以及搜索到的一些博客),用自己的话总结出来,适合直接背题。

Java面试题之计算机网络篇

1.get和post的区别

  • get通常用于获取资源,post用于创建或者修改资源
  • get没有请求体,请求参数附加在url上,有长度限制。post有请求体,请求参数没有长度限制
  • get请求是幂等的,多次请求效果一样,Post请求不是幂等的,每次请求都会对服务器资源产生影响。

2.http和https区别

  • 端口号:http默认是80,https默认是443.
  • http建立连接相对简单,tcp三次握手便可以进行http报文传输。而https在tcp三次握手后,还需要进行SSL/TSL的握手,才可以进入加密报文传输。
  • https更加安全,使用https的网站在搜索结果中会被优先展示

3.键入网址后会发生什么呢

  • 浏览器通过DNS解析,获取目标服务器的ip
  • 浏览器根据ip和端口,对目标服务器发起tcp连接
  • 连接建立后,像服务器发送http报文,请求获取数据
  • 服务器收到请求后没处理并响应数据
  • 浏览器进行渲染数据

大的流程就这样,更细节的还有DNS解析过程,tcp建立连接过程,ip包转发过程。

4.DNS解析过程(8次UDP)

  • 客户端发起一个DNS请求,询问某个域名的ip,发送给本地域名服务器。
  • 本地域名服务器查找本地是否有这个域名,有就直接返回。。否则跑去问根域名服务器
  • 根域名服务器不会解析这个域名,而是告诉本地域名服务器,这个域名归某个顶级域名服务器管,你去找它。
  • 本地域名服务器接着跑去问顶级域名服务器,顶级域名服务器会让他去找某个权威域名服务器
  • 本地域名服务器接着又跑去问权威域名服务器,得到了ip。
  • 最后本地域名服务器把ip告诉客户端,至此,DNS解析完成。

5.TLS的四次握手

  • 客户端像服务器发起加密通信请求,也就是clientHello信息,主要发送以下信息:客户端生成的随机数、支持的TLS版本、支持的密码套件列表。
  • 服务器收到后,像客户端发出响应,也就是severHello消息。回应内容如下:服务器生成的随机数、确认TSL版本、确认密码套件、服务器的数字证书。
  • 客户端收到服务器的回应后,先确认服务器证书真实性,若没有问题,取出服务器公钥。发送如下内容给服务器:一个随机数(用公钥加密)、三个随机数做一个摘要算出会话密钥。
  • 服务器收到后,用私钥解密,同时把三个随机数做一个摘要,进行校验。

至此,TSL握手阶段结束,接下来客户端和服务器进行的通信就是普通的http协议,只不过用会话密钥加密了内容。

6.TCP和UDP的区别

  • TCP需要建立连接,只能一对一通信;udp不需要建立连接,支持一对一、一对多、多对多通信
  • tcp提供可靠交付数据,udp不保证可靠
  • tcp有流量控制、拥塞控制;udp没有
  • tcp用于http通信、ftp文件传输;udp用于广播通信、视频、音频等

7.tcp三次握手

  • 一开始,客户端服务器都属于close状态,接着服务器主动监听某个端口,进入listen状态
  • 第一次握手:客户端发SYN=1报文,请求建立连接。之后客户端处于 SYN-SENT 状态。
  • 第二次握手:服务器回一个SYN=1,ack=1的报文,表示同意建立连接。之后服务端处于 SYN-RCVD 状态。
  • 第三次握手:客户端收到报文后,会发一个ack=1报文,且这次报名可以发送数据

最终两者都会进入到ESTABLISHED 状态。

8.TCP四次挥手过程是怎么样的

  • 第一次挥手:客户端打算关闭连接,此时发送FIN=1的报文,之后客户端进入FIN_WAIT_1
  • 第二次挥手:服务器收到后回复一个ACK报文,接着服务器进入CLOSE_WAIT
  • 客户端收到服务端的ACK应答报文后,进入FIN_WAIT_2状态
  • 第三次挥手:等待服务器处理完数据后,向客户端发送FIN=1的报文,之后服务器进入LAST_ACK状态
  • 第四次挥手:客户端收到后,回一个ack报文,之后进入Time_wait状态
  • 服务端收到应答报文后进入close状态,客户端在2MSL(报文最大生存时间)后,也自动进入close状态。

9.为什么 TIME_WAIT 等待的时间是 2MSL?

  • 若客户端发送的ack报文在1MSl时间内丢失,服务端会触发超时重传,再次发送FIN报文。
  • 可以看到2MSL时长相当于至少运行报文丢失一次
  • 为什么不是4或者8呢:概率实在是太小了,忽略它比解决它更有性价比

10.拥塞窗口概念

流量控制是避免发送方的数据填满接收方的缓存,但是并不知道在网络中发生了什么。于是有了拥塞控制

  • 拥塞窗口cwnd是发送方维护的一个状态变量,会根据网络的拥塞程度动态变化
  • 注意:发送窗口是拥塞窗口和接收窗口的最小值。

11.拥塞控制有哪些控制算法?

  • 慢启动算法:TCP在刚建立连接完成后,首先是有个慢启动过程。拥塞窗口从1开始,每过一个RTT,就会增长2倍
  • 拥塞避免算法:当拥塞窗口超过慢启动门限就会进去拥塞避免算法,每过一个RTT,就会增加1.
  • 快重传:当发送方收到三个相同ack时,会立即重传,不会等待超时。
  • 快恢复:快重传和快恢复算法一般同时使用。在设定拥塞窗口为原来一半后(同时慢启动门限也是拥塞窗口的一半),开始线性增加。

12.http请求包含哪些内容

  • 请求行(Request Line):包含请求方法(如GET、POST)、请求的资源路径(如/index.html)、以及HTTP
    协议版本(如HTTP/1.1)。
  • 请求头(Request Headers):包含各种键值对,用于传递客户端环境、请求内容、认证信息等。
  • 空行(Blank Line):用于分隔请求头和请求体。
  • 请求体(Request Body):仅在POST、PUT等方法中存在,包含需要发送到服务器的数据

13.TCP的粘包和拆包

在网络编程中,TCP协议的拆包和粘包问题时常见的挑战。由于TCP是流式协议,他不会保留发送时的数据边界,这导致接收放在读取数据时遇到拆包和粘包问题。

  • 拆包问题:一个完整的数据包被拆分成多个部分进行发送,接收方需要识别并重组这些分散的部分。
  • 粘包问题:多个数据包被合并成为一个包发送,接收方需要拆分出完整数据包

解决方法

  • 添加消息分隔符:在每个消息之间添加特定分隔符,接收方可以通过分隔符来区分消息
  • 使用消息头:在消息头部添加一个长度字段,提示消息的长度,接收方根据长度来读取数据

14.HTTP1.0 HTTP2.0 HTTP3.0

HTTP/1.1 相比 HTTP/1.0 性能上的改进:

  • 使用长连接的方式改善了HTTP/1.0短连接造成的性能开销。
  • 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

HTTP2.0做了什么优化

  • 头部压缩:如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。
  • 二进制格式:HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式
  • 并发传输:引出了 Stream 概念,多个 Stream 复用在一条 TCP 连接。
  • 服务器主动推送资源:服务端不再是被动地响应,可以主动向客户端发送消息。

HTTP3.0做了哪些优化

  • HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP。UDP 发送是不管顺序,也不管丢包的,所以不会出现像 HTTP/2 队头阻塞的问题。
  • 使用QUIC协议(Quick UDP Internet Connections),提供类似TCP的可靠性和多路复用。

15.什么是 TCP keepalive 呢(TCP 的保活机制)

  • 定义一个时间段,在这段时间内,如果没有任何连接相关的活动,TCP保活机制会开始作用
  • 具体就是每隔一段时间发送一个探测报文,该报文含有数据非常少
  • 如果连续几个报文都没有响应会认为当前TCP连接已经死亡,系统内核会将错误信息通知给上层程序

16.TCP连接时,进程突然奔溃会发生什么

  • TCP连接信息是由内核维护的,所以当服务端进程奔溃后,内核回收该进程所有TCP连接资源
  • 内核会代替进程跟客户端进行四次挥手
  • 上课时,老师使用kill命令杀掉进程后,服务端还是会发送FIN报文

17.TCP连接后服务器宕机,有迅速重启,会发生什么

  • 客户端发送报文没有得到响应,会继续发送
  • 等待服务器恢复时,内核会发送回复RST报文,重置TCP连接。

18.HTTP常用状态码

  • 1xx类状态码属于提示信息,是协议处理中的一种中间状态,实际用到较少
  • 2xx类状态码表示服务器成功处理了客户端请求
  • 3xx是服务端资源发生变动,也就是重定向。(301:永久重定向;302:临时重定向;)
  • 4xx表示客户端发送的报文有误,服务器无法处理
  • 5xx表示服务器处理时内部发生了错误。

19.DNS的底层使用TCP还是UDP

DNS基于UDP协议实现,DNS使用UDP协议进行域名解析和数据传输。因为基于UDP实现DNS能够提供低延迟(面向无连接)、简单快速(没有流量控制拥塞控制等复杂功能)、轻量级(头部较小,占用网络资源少)的特性,更适合DNS这种需要快速响应的域名解析服务。

总结

计算机网络在面试环节属于高频面试点。欢迎各位进行补充,共同学习共同进步。
数风流人物,还看今朝。希望大家可以关注一下,后续还会接着更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值