前言
本系列是有关Java开发的面试题,结合本人实际面试经历以及网上面试经验总结而来。这是第三篇。以下内容均为本人参考别人的文章(https://Javaguide.cn以及搜索到的一些博客),用自己的话总结出来,适合直接背题。
Java面试题之计算机网络篇
文章目录
- 前言
- Java面试题之计算机网络篇
- 1.get和post的区别
- 2.http和https区别
- 3.键入网址后会发生什么呢
- 4.DNS解析过程(8次UDP)
- 5.TLS的四次握手
- 6.TCP和UDP的区别
- 7.tcp三次握手
- 8.TCP四次挥手过程是怎么样的
- 9.为什么 TIME_WAIT 等待的时间是 2MSL?
- 10.拥塞窗口概念
- 11.拥塞控制有哪些控制算法?
- 12.http请求包含哪些内容
- 13.TCP的粘包和拆包
- 14.HTTP1.0 HTTP2.0 HTTP3.0
- 15.什么是 TCP keepalive 呢(TCP 的保活机制)
- 16.TCP连接时,进程突然奔溃会发生什么
- 17.TCP连接后服务器宕机,有迅速重启,会发生什么
- 18.HTTP常用状态码
- 19.DNS的底层使用TCP还是UDP
- 总结
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这种需要快速响应的域名解析服务。
总结
计算机网络在面试环节属于高频面试点。欢迎各位进行补充,共同学习共同进步。
数风流人物,还看今朝。希望大家可以关注一下,后续还会接着更新。