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

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

【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 端。)

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

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 洪水攻击

四、四次挥手断连

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

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,没有正确关闭链接导致的。