【0202】32个Java 面试必考点 操作系统与计算机网络

一、计算机网络(服务之间通过不同的网络协议进行交互)

在这里插入图片描述

1、理解网络四/七层模型

2、学习Http 、TCP、UDP 协议

3、TCP的报文状态标志与链接状态,在排查网络问题时非常重要,必须要明白协议状态,才方便抓包分析。

4、Nagel算法和 ACK延迟的产生背景,了解解决小包问题,提高数据载荷比。知道对于延迟比较敏感且发送数据频率较低的场景可以关闭Nagel算法。

5、关于TCP的Keepalive,是一种长时间没有数据发送的场景下,TCP保持链接可用的机制,知道TCP Keepalive的开启和设置方式。

6、明白TCP是如何通过滑动窗口机制来实现流量控制的。

7、掌握HTTP协议的规范,知道协议中的 Method、Header、Cookies,需要了解常见状态码的含义,例如 404、503、302 等。

8、 HTTPS 的交互流程。

9、HTTP2 目前还比较新:HTTP2 多路复用、Stream 流式交互、流量控制、服务端推送、头部压缩等新特性

10、UDP的传输层协议,UDP的特点是非链接、非可靠传输,但是效率非常高。

11、QUIC 已经被标准化为 HTTP3 协议。QUIC 是基于 UDP 协议,但 QUIC 提供了类似 TCP 的可靠性保证和流量控制。QUIC 可以有效避免 HTTP2 协议的前序包阻塞问题,能实现零 RTT 建连,提供 FEC 前向纠错能力。

二、TCP 协议特点

TCP 是传输层协议,对应 OSI 网络模型的第四层传输层

1、TCP 协议是基于链接的:传输数据前需要先建立好链接,然后再进行传输。

2、TCP链接建立,可以在链接上进行双向的通信。

3、TCP 的传输是基于字节流而不是报文,将数据按字节大小进行编号,接收端通过 ACK 来确认收到的数据编号,通过这种机制,TCP 协议能够保证接收数据的有序性和完整性。=>TCP 能够提供可靠性传输。

4、TCP 还能提供流量控制能力,通过滑动窗口来控制数据的发送速率。滑动窗口的本质是动态缓冲区,接收端根据自己的处理能力,在 TCP 的 Header 中动态调整窗口大小,通过 ACK 应答包通知给发送端,发送端根据窗口大小调整发送的的速度。

5、TCP 协议拥塞控制

A) TCP 协议网络问题可能会导致大量重传,进而导致网络情况进一步恶化

B) TCP 处理拥塞控制主要用到了慢启动、拥塞避免、拥塞发生、快速恢复四。

三、TCP 三次握手建连

TCP 在传输上是双工传输,不区分 Client 端与 Server 端(我们把主动发起建连请求的一端称作 Client 端,把被动建立链接的一端称作 Server 端。)

在这里插入图片描述

1、建立链接

A) Server 端先监听端口: Server 端建立链接前的初始状态就是 LISTEN 状态

B) 这时 Client 端准备建立链接,先发送一个 SYN 同步包,发送完同步包后,Client 端的链接状态变成了 SYN_SENT 状态。

2、Server 端收到 SYN 后,同意建立链接,会向 Client 端回复一个 ACK。

由于 TCP 是双工传输,Server 端也会同时向 Client 端发送一个 SYN,申请 Server 向 Client 方向建立链接。发送完 ACK 和 SYN 后,Server 端的链接状态就变成了 SYN_RCVD。

3、Client 收到 Server 的 ACK 后,Client 端的链接状态就变成了 ESTABLISHED 状态,同时,Client 向 Server 端发送 ACK,回复 Server 端的 SYN 请求。

Server 端收到 Client 端的 ACK 后,Server 端的链接状态也就变成了的 ESTABLISHED 状态,建连完成,双方随时可以进行数据传输。

注意:

建连时(可能产生 SYN 洪水攻击发生)

A) 就是 Server 端收到 Client 端的 SYN 请求后,发送了 ACK 和 SYN,但是 Client 端不进行回复,导致 Server 端大量的链接处在 SYN_RCVD 状态,进而影响其他正常请求的建连。

B) 可以设置 tcp_synack_retries = 0 加快半链接的回收速度,或者调大 tcp_max_syn_backlog 来应对少量的 SYN 洪水攻击

四、四次挥手断连

在这里插入图片描述

TCP 链接的关闭,通信双方都可以先发起(先发起的一方看作 Client)

1、通信中 Client 和 Server 两端的链接都是 ESTABLISHED 状态,Client 先主动发起了关闭链接请求,Client 向 Server 发送了一个 FIN 包,表示 Client 端已经没有数据要发送了,然后 Client 进入了 FIN_WAIT_1 状态。

2、Server 端收到 FIN 后,返回 ACK,然后进入 CLOSE_WAIT 状态。此时 Server 属于半关闭状态,因为此时 Client 向 Server 方向已经不会发送数据了,可是 Server 向 Client 端可能还有数据要发送。

3、当 Server 端数据发送完毕后,Server 端会向 Client 端发送 FIN,表示 Server 端也没有数据要发送了,此时 Server 进入 LAST_ACK 状态,就等待 Client 的应答就可以关闭链接了。

4、Client 端收到 Server 端的 FIN 后,回复 ACK,然后进入 TIME_WAIT 状态。TIME_WAIT 状态下需要等待 2 倍的最大报文段生存时间,来保证链接的可靠关闭,之后才会进入 CLOSED 关闭状态。而 Server 端收到 ACK 后直接就进入 CLOSED 状态。

注意
为什么需要等待 2 倍最大报文段生存时间之后再关闭链接?

A) 保证 TCP 协议的全双工连接能够可靠关闭;

B) 保证这次连接的重复数据段从网络中消失,防止端口被重用时可能产生数据混淆。

C) 建连时,Server 端的 SYN 和 ACK 合并为一次发送,而断链时,两个方向上数据发送停止的时间可能不同,所以不能合并发送 FIN 和 ACK。这就是建连三次握手而断链需要四次的原因。

D) 实际应用中有可能遇到大量 Socket 处在 TIME_WAIT 或者 CLOSE_WAIT 状态的问题。一般开启 tcp_tw_reuse 和 tcp_tw_recycle 能够加快 TIME-WAIT 的 Sockets 回收;而大量 CLOSE_WAIT 可能是被动关闭的一方存在代码 bug,没有正确关闭链接导致的。

猜你喜欢

转载自blog.csdn.net/qq_40996741/article/details/108990493