大綱
基礎
TCP/IP網絡模型有哪幾層?
TCP/IP網絡通常是由上到下分成 4 層,分別是應用層,傳輸層,網絡層和網絡接口層。
- 應用層:負責向用戶提供一組應用程序,比如HTTP、DNS、FTP等;
- 傳輸層:負責端到端的通信,比如TCP、UDP等;
- 網絡層:負責網絡包的封裝、分片、路由、轉發,比如IP、ICMP等;
- 網絡接口層:負責網絡包在物理網絡中的傳輸,比如網絡包的封幀、MAC尋址、差錯檢測,以及通過網卡傳輸網絡幀等。
不過,我們常說的七層和四層負載均衡,是用OSI網絡模型來描述的,七層對應的是應用層,四層對應的傳輸層。
鍵入網址到網頁顯示,期間發生了什么?
Linux系統是如何收發網絡包的?
一、HTTP
HTTP 常見面試題
HTTP基本概念
HTTP 是什么?
HTTP是超文本傳輸協議,是一個在計算機世界里專門在「兩點」之間「傳輸」文字、圖片、音頻、視頻等「超?本」數據的「約定和規范」。
HTTP常見的狀態碼有哪些?
1xx
類狀態碼屬于提示信息,是協議處理中的?種中間狀態,實際?到的?較少。
2xx
類狀態碼表示服務器成功處理了客戶端的請求,也是我們最愿意看到的狀態。
- 「200 OK」是最常?的成功狀態碼,表示?切正常。如果是?
HEAD
請求,服務器返回的響應頭都會有 body 數據。 - 「204 No Content」也是常?的成功狀態碼,與 200 OK 基本相同,但響應頭沒有 body 數據。
- 「206 Partial Content」是應?于 HTTP 分塊下載或斷點續傳,表示響應返回的 body 數據并不是資源的全部,?是其中的?部分,也是服務器處理成功的狀態。
3xx
類狀態碼表示客戶端請求的資源發?了變動,需要客戶端?新的 URL 重新發送請求獲取資源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向,說明請求的資源已經不存在了,需改?新的 URL 再次訪問。
- 「302 Found」表示臨時重定向,說明請求的資源還在,但暫時需要?另?個 URL 來訪問。
301 和 302 都會在響應頭?使?字段Location
,指明后續要跳轉的 URL,瀏覽器會?動重定向新的URL。
- 「304 Not Modified」不具有跳轉的含義,表示資源未修改,重定向已存在的緩沖?件,也稱緩存重定向,也就是告訴客戶端可以繼續使?緩存資源,?于緩存控制。
4xx
類狀態碼表示客戶端發送的報?有誤,服務器?法處理,也就是錯誤碼的含義。
- 「400 Bad Request」表示客戶端請求的報?有錯誤,但只是個籠統的錯誤。
- 「403 Forbidden」表示服務器禁?訪問資源,并不是客戶端的請求出錯。
- 「404 Not Found」表示請求的資源在服務器上不存在或未找到,所以?法提供給客戶端。
5xx
類狀態碼表示客戶端請求報?正確,但是服務器處理時內部發?了錯誤,屬于服務器端的錯誤碼。
- 「500 Internal Server Error」與 400 類型,是個籠統通?的錯誤碼,服務器發?了什么錯誤,我們并不知道。
- 「501 Not Implemented」表示客戶端請求的功能還不?持,類似“即將開業,敬請期待”的意思。
- 「502 Bad Gateway」通常是服務器作為?關或代理時返回的錯誤碼,表示服務器?身?作正常,訪問后端服務器發?了錯誤。
- 「503 Service Unavailable」表示服務器當前很忙,暫時?法響應客戶端,類似“?絡服務正忙,請稍后重試”的意思。
HTTP常見字段有哪些?
Host字段:客戶端發送請求時,?來指定服務器的域名。
Connection字段:Connection 字段最常?于客戶端要求服務器使?「HTTP ?連接」機制,以便其他請求復?。
Content-Length字段:服務器在返回數據時,會有 Content-Length 字段,表明本次回應的數據?度。
Content-Type字段:?于服務器回應時,告訴客戶端,本次數據是什么格式。
Content-Encoding字段:說明數據的壓縮?法。
Accept-Encoding字段:客戶端在請求時,?該字段說明??可以接受哪些壓縮?法。
GET與POST
GET和POST有什么區別?
GET 的語義是請求獲取指定的資源。 GET ?法是安全、冪等、可被緩存的。
POST 的語義是根據請求負荷(報?主體)對指定的資源做出處理,具體的處理?式視資源類型?不同。POST 不安全,不冪等,(?部分實現)不可緩存。
HTTP緩存技術
HTTP緩存有哪些實現方式?
對于?些具有重復性的 HTTP 請求,?如每次請求得到的數據都?樣的,我們可以把這對「請求-響應」的數據都緩存在本地,那么下次就直接讀取本地的數據,不必在通過?絡獲取服務器的響應了,這樣的話HTTP/1.1 的性能肯定?眼可?的提升。
HTTP 緩存有兩種實現?式,分別是強制緩存和協商緩存。
什么是強制緩存?
強緩存指的是只要瀏覽器判斷緩存沒有過期,則直接使?瀏覽器的本地緩存,決定是否使?緩存的主動性在于瀏覽器這邊。
強緩存是利?下?這兩個 HTTP 響應頭部(Response Header)字段實現的,它們都?來表示資源在客戶端緩存的有效期:
Cache-Control
,是一個相對時間;Expires
,是一個絕對時間。
如果 HTTP 響應頭部同時有 Cache-Control 和 Expires 字段的話, Cache-Control 的優先級?于 Expires。
Cache-control 選項更多?些,設置更加精細,所以建議使? Cache-Control 來實現強緩存。具體的實現流程如下:
- 當瀏覽器第一次請求訪問服務器資源時,服務器會在返回這個資源的同時,在Response頭部加上Cache-Control,并在Cache-Control中設置了過期時間大小;
- 瀏覽器再次請求訪問服務器中的該資源時,會先通過請求資源的時間與Cache-Control中設置的過期時間大小,來計算出該資源是否過期,如果沒有,則使用該緩存,否則重新請求服務器;
- 服務器再次收到請求后,會再次更新Response頭部的Cache-Control。
什么是協商緩存?
當我們在瀏覽器使?開發者?具的時候,你可能會看到過某些請求的響應碼是304
,這個是告訴瀏覽器可以使?本地緩存的資源,通常這種通過服務端告知客戶端是否可以使?緩存的?式被稱為協商緩存。
協商緩存就是與服務端協商之后,通過協商結果來判斷是否使用使用本地緩存。
協商緩存可以基于兩種頭部來實現。
第一種:請求頭部中的If-Modified-Since
字段與響應頭部中的Last-Modified
字段實現,這兩個字段的意思是:
- 響應頭部中的
Last-Modified
:標識這個響應資源的最后修改時間; - 請求頭部中的
If-Modified-Since
:當資源過期了,發現響應頭中具有Last-Modified聲明,則再次發起請求的時候帶上 Last-Modified 的時間,服務器收到請求后發現有 If-Modified-Since 則與被請求資源的最后修改時間進?對?(Last-Modified),如果最后修改時間較新(?),說明資源?被改過,則返回最新資源, HTTP 200 OK;如果最后修改時間較舊(?),說明資源?新修改,響應HTTP 304 ?緩存。
第二種:請求頭部中的If-None-Match字段與響應頭部中的Etag
字段,這兩個字段的意思是:
- 響應頭部中的
Etag
:唯一標識響應資源; - 請求頭部中的
If-None-Match
:當資源過期時,瀏覽器發現響應頭里有Etag,則再次向服務器發起請求時,會將請求頭If-None-Match值設置為Etag的值,服務器收到請求后進行比對,如果資源沒有變化返回304,如果資源變化了返回200。
第?種實現?式是基于時間實現的,第?種實現?式是基于?個唯?標識實現的,相對來說后者可以更加準確地判斷?件內容是否被修改,避免由于時間篡改導致的不可靠問題。
協商緩存這兩個字段都需要配合強制緩存中 Cache-Control 字段來使?,只有在未能命中強制緩存的時候,才能發起帶有協商緩存字段的請求。
HTTP特性
HTTP/1.1的優點有哪些?
- 簡單:HTTP 基本的報?格式就是 header + body ,頭部信息也是 key-value 簡單?本的形式, 易于理解,降低了學習和使?的?檻。
- 靈活和易于擴展:HTTP 協議?的各類請求?法、URI/URL、狀態碼、頭字段等每個組成要求都沒有被固定死,都允許開發?員?定義和擴充。
- 應用廣泛和跨平臺
HTTP/1.1 的缺點有哪些?
- 無狀態雙刃劍
- 明?傳輸雙刃劍
- 不安全
HTTP/1.1的性能如何?
HTTP 協議是基于 TCP/IP,并且使?了「請求 - 應答」的通信模式。
- 長連接
- 管道網絡傳輸
- 隊頭阻塞
HTTP與HTTPS
HTTP與 HTTPS 有哪些區別?
- HTTP是超文本傳輸協議,信息是明文傳輸,存在安全風險的問題。HTTPS則解決HTTP不安全的缺陷,在TCP和HTTP網絡層之間加入了SSL/TLS安全協議,使得報文能夠加密傳輸。
- HTTP連接建立相對簡單,TCP三次握手之后便可進行HTTP的報文傳輸。而HTTPS在TCP三次握手之后,還需進行SSL/TLS的握手過程,才可進入加密報文傳輸。
- 兩者的默認端口不一樣,HTTP默認端口是80,HTTPS默認端口是443。
- HTTPS協議需要向CA(證書權威機構)申請數字證書,來保證服務器的身份是可信的。
HTTPS 解決了 HTTP 的哪些問題?
HTTP由于是明文傳輸,所以安全上存在三個風險:
- 竊聽風險
- 篡改風險
- 冒充風險
HTTPS 在 HTTP 與 TCP 層之間加?了 SSL/TLS 協議,可以很好的解決了上述的風險:
- 信息加密
- 校驗機制
- 身份證書
HTTPS是如何解決上面的三個風險的?
- 混合加密的方式實現信息的機密性,解決了竊聽的風險。
- 摘要算法的方式來實現完整性,它能夠為數據生成獨一無二的「指紋」,指紋用于校驗數據的完整性,解決了篡改的風險。
- 將服務器公鑰放入到數字證書中,解決了冒充的風險。
HTTPS是如何建立連接的?其間交互了什么?
SSL/TLS協議基本流程:
- 客戶端想服務器索要驗證服務器的公鑰。
- 雙方協商生產「會話秘鑰」。
- 雙方采用「會話秘鑰」進行加密通信。
HTTPS的應用數據是如何保證完整性的?
HTTPS一定安全可靠嗎?
HTTP/1.1、HTTP/2、HTTP/3演變
HTTP/1.1 如何優化?
如何避免發送HTTP請求?
如何減少HTTP請求次數?
如何減少HTTP響應的數據大小?
HTTPS RSA 握手解析
TLS握手過程
RSA握手過程
RSA算法的缺陷
HTTPS ECDHE握手解析
HTTPS如何優化?
HTTP/2 牛逼在哪?
HTTP/3強勢來襲
既然有HTTP協議,為什么還要有RPC?
既然有HTTP協議,為什么還要有WebSocket?
二、TCP
TCP三次握手與四次揮手面試題
TCP重傳、滑動窗口、流量控制、擁塞控制
TCP實戰抓包分析
TCP半連接隊列和全連接隊列
如何優化TCP?
如何理解是TCP面向字節流協議?
為什么TCP每次建立連接時,初始化序列號都要不一樣呢?
SYN報文什么時候情況下會被丟棄?
已建立連接的TCP,收到SYN會發生什么?
四次揮手中收到序的FIN包會如何處理?
在TIME_WAIT狀態的TCP連接,收到SYN后會發生什么?
TCP連接,一端斷電和進程崩潰有什么區別?
拔掉網線后,原本的TCP連接還存在嗎?
tcp_tw_reuse 為什么默認是關閉的?
HTTPS 中 TLS 和 TCP 能同時握手嗎?
TCP Keepalive 和 HTTP Keep-Alive 是一個東西嗎?
TCP協議有什么缺陷?
如何基于UDP協議實現可靠傳輸?
服務端沒有isten,客戶端發起連接建立,會發生什么?
用了TCP協議,數據一定不會丟嗎?
TCP四次揮手,可以變成三次嗎?
TCP序列號和確認號是如何變化的?
三、IP
IP基礎知識全家桶
ping 的工作原理
斷網了,還能ping通127.0.0.1嗎?
四、網絡安全
說說有哪些安全攻擊?
DNS 劫持了解嗎?
什么是 CSRF 攻擊?如何避免?
什么是 DoS、DDoS、DRDoS 攻擊?
什么是 XSS 攻擊,如何避免?
對稱加密與非對稱加密有什么區別?
RSA 和 AES 算法有什么區別?
資料
- 小林圖解網絡
- 二哥的Java進階之路:面渣逆襲-計算機網絡
- JavaGuide-計算機網絡常見面試題總結