【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,沒有正確關閉連結導致的。