這篇文章跟大家分享一些位元組跳動最愛考的,關於電腦網路的前端面試題。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
注意:每題前面出現的(xx) 數字代表這題出現的頻次,此電腦網路基礎是基於30 篇前端面經整理出的問題和對應的回答、參考連結等。文章內容為拿到 Offer 的本人整理。
#HTTP 快取又分為強快取與協商快取:
首先透過Cache-Control 驗證強快取是否可用,如果強快取可用,那麼直接讀取快取
如果不可以,那麼就進入協商快取階段,發起HTTP 請求,伺服器透過請求頭中是否帶上If-Modified-Since 和If-None-Match 這些條件請求欄位檢查資源是否更新:
若資源更新,那麼傳回資源和200狀態碼
如果資源未更新,那麼告訴瀏覽器直接使用快取取得資源
(3 )問:HTTPS 是什麼?具體流程
(4)問:三次握手和四次揮手
三次握手主要流程:
一開始雙方處於CLOSED 狀態,然後服務端開始監聽某個連接埠進入LISTEN 狀態
然後客戶端主動發起連接,發送SYN,然後自己變成SYN-SENT,seq = x
服務端收到之後,回傳SYN seq = y 和ACK ack = x 1(對於客戶端發來的SYN),自己變成SYN-REVD
之後客戶端再發送ACK seq = x 1, ack = y 1給服務端,自己變成EASTABLISHED 狀態,服務端收到ACK,也進入ESTABLISHED
SYN 需要對端確認,所以ACK 的序列化要加一,凡是需要對端確認的,一點要消耗TCP 封包的序列化
為什麼不是兩次?
無法確認客戶端的接收能力。
如果首先客戶端發送了 SYN 封包,但是滯留在網路中,TCP 以為丟包了,然後重傳,兩次握手建立了連接。
等到客戶端關閉連線了。但是之後這個包如果到達了服務端,那麼服務端接收到了,然後發送相應的數據表,就建立了鏈接,但是此時客戶端已經關閉連接了,所以帶來了鏈接資源的浪費。
為什麼不是四次?
四次以上都可以,只不過三次就夠了
#四次揮手
一開始都處於ESTABLISH 狀態,然後客戶端發送FIN 封包,帶上seq = p,狀態變成FIN-WAIT-1
服務端收到之後,發送ACK 確認,ack = p 1,然後進入CLOSE-WAIT 狀態
客戶端收到之後進入FIN-WAIT-2 狀態
#過了一會兒等資料處理完,再發送FIN、ACK,seq = q,ack = p 1,進入LAST-ACK 階段
客戶端收到FIN 之後,客戶端收到之後進入TIME_WAIT(等待2MSL),然後發送ACK 給服務端ack = 1 1
服務端收到之後進入CLOSED 狀態
客戶端這個時候還需要等待兩次MSL 之後,如果沒有收到服務端的重發請求,就表示ACK 成功到達,揮手結束,客戶端變成CLOSED 狀態,否則進行ACK 重發
為什麼需要等待2MSL(Maximum Segement Lifetime):
因為如果不等待的話,如果服務端還有很多資料包要向客戶端發,且此時客戶端連接埠被新應用程式佔據,那麼就會接收到無用的資料包,造成資料包混亂,所以說最保險的方法就是等伺服器發來的資料包都死翹翹了再啟動新應用。
1個MSL 保證四次揮手中主動關閉方最後的ACK 封包能最終到達對端
1個MSL 保證對端沒有收到ACK 那麼進行重傳的FIN 封包能夠到達
為什麼是四次而不是三次?
**如果是三次的話,那麼服務端的ACK 和FIN 合成一個揮手,那麼長時間的延遲可能讓TCP 一位FIN 沒有達到伺服器端,然後讓客戶的不斷的重發FIN
參考資料
#https://zhuanlan.zhihu.com/p/86426969
在 HTTP 中回應體的 Connection 欄位指定為 keep-alive
在TCP 連結中,對於發送端和接收端而言,TCP 需要把發送的資料放到發送快取區, 將接收的資料放到接收快取區。而常常會存在發送端發送過多,而接收端無法消化的情況,所以就需要流量控制,就是在透過接收快取區的大小,控制發送端的發送。如果對方的接收快取區滿了,就不能再繼續發送了。而這種流量控制的過程就需要在發送端維護一個發送窗口,在接收端維持一個接收窗口。
TCP 滑動視窗分為兩種: 發送視窗和接收視窗。
參考資料
#https://juejin.im/post/5e527c58e51d4526c654bf41#heading-38
本質不同
Ajax 即非同步JavaScript 和XML,是一種創建互動式網頁的應用的網頁開發技術
websocket 是HTML5 的一種新協議,實現了瀏覽器和伺服器的即時通訊
生命週期不同:
#websocket 是長連接,會話一直保持
ajax 發送接收之後就會斷開
適用範圍:
websocket 用於前後端即時互動資料
ajax 非即時
發起人:
AJAX 用戶端發起
了解WebSocket 嘛?
長輪詢和短輪詢,WebSocket 是長輪詢。 具體例如在一個電商場景,商品的庫存可能會變化,所以需要及時反映給用戶,所以客戶端會不停的發請求,然後伺服器端會不停的去查變化,不管變不變,都返回,這個是短輪詢。
#HTTP 如何實現長連線?什麼時候會超時?
透過在頭部(請求和回應頭)設定Connection: keep-alive,HTTP1.0協定支持,但是預設關閉,從HTTP1.1協定以後,連線預設都是長連線
HTTP 一般會有httpd 守護進程,裡面可以設定keep-alive timeout,當tcp 連結閒置超過這個時間就會關閉,也可以在HTTP 的header 裡面設定逾時時間
TCP 的keep-alive 包含三個參數,支援在系統核心的net.ipv4 裡面設定:當TCP 連結之後,閒置了tcp_keepalive_time,則會發生偵測包,如果沒有收到對方的ACK,那麼會每隔tcp_keepalive_intvl 再發一次,直到發送了tcp_keepalive_probes,就會丟棄該連結。
tcp_keepalive_intvl = 15
tcp_keepalive_time = 1800tcp_keepalive_time = 1800
fetch 符合關注點分離,使用Promise,API 更加豐富,支援Async/Await語意簡單,更語意化
可以使用isomorphic-fetch ,同構方便
#問:TCP 如何保證有效傳輸及擁塞控制原則。
可靠體現在:有狀態、可控制有狀態是指TCP 會確認發送了哪些報文,接收方受到了哪些報文,哪些沒有收到,保證資料包按序到達,不允許有錯誤
可控制的是指,如果出現丟包或網路狀況不佳,則會跳轉自己的行為,減少發送的速度或重發
所以上面能保證資料包的有效傳輸。
擁塞控制原理
原因是有可能整個網路環境特別差,容易丟包,那麼發送端就應該注意了。
慢啟動閾值擁塞避免
快速重傳
#快速回覆
對於擁塞控制來說,TCP主要維護兩個核心狀態:############擁塞視窗(cwnd)############慢啟動閾值(ssthresh)######### #######在傳送端使用擁塞視窗來控制傳送視窗的大小。 ###
然後採用一種比較保守的慢啟動演算法來慢慢適應這個網絡,在開始傳輸的一段時間,發送端和接收端會首先透過三次握手建立連接,確定各自接收視窗大小,然後初始化雙方的擁塞窗口,接著每經過一輪RTT(收發延遲),擁塞窗口大小會增加一倍,直到達到慢啟動閾值。
然後開始進行擁塞避免,擁塞避免具體的做法就是之前每一輪 RTT,擁塞窗口翻倍,現在每一輪就加一個。
快速重傳
在TCP 傳輸過程中,如果發生了丟包,接收端就會發送之前重複ACK,例如第5 個包丟了,6、7 達到,然後接收端會為5,6,7 都發送第四個包的ACK,這個時候發送端受到了3 個重複的ACK,意識到丟包了,就會馬上進行重傳,而不用等到RTO (超時重傳的時間)
選擇性重傳:報文首部可選性中加入SACK 屬性,透過left edge 和right edge 標誌那些包到了,然後重傳沒到的套件
快速恢復
#如果發送端收到了3 個重複的ACK,發現了丟包,覺得現在的網路狀況已經進入擁塞狀態了,那麼就會進入快速恢復階段:
會將擁塞閾值降低為擁塞視窗的一半
接著擁塞視窗大小變成壅塞閾值
接著擁塞視窗再進行線性增加,以適應網路狀況
應用層
#應用層:應用層、表示層、會話層:HTTP
HTTP 2 改進