TCP/IP面試一覽


本文由 簡悅 SimpRead 轉碼, 原文地址 https://mp.weixin.qq.com/s/ACQz-OZN-oitoMzdvI3RfA

前言

最近和一同學聊天,他想換工作,然后去面了一家大廠。當時,他在簡歷上寫着精通 TCP/IP,本着對 TCP 協議稍有了解,面試官也不會深問的想法,就寫了精通二字。沒想到,大意了

開場

朋友約的是十點半的面試,提前了十分鍾到,然后安靜地坐在沙發等待,順便回憶下之前看的資料。快到十點半時,一個高瘦,穿着格子衫的男子推開門而進,說了句 “你好,我們來開始面試吧!”,朋友不失禮貌地笑着回了句 “行”

面試官:看你簡歷說精通 TCP 和 IP,那我們來討論下網絡模型和 TCP、IP 協議,講下你的理解先

  • 朋友(怎么一上來就問 TCP,不按套路出牌啊,不該問問 java 基礎嗎?不過常規題,我還行)

  • 朋友:網絡模型一般分七層:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層。應用層的協議包括 HTTP、FTP、SMTP,而 TCP 屬於傳輸層,IP 協議則屬於網絡層

  • 朋友:TCP/IP 網絡模型層次由上到下,層層包裝,每一層都對應不同的協議解析,我來畫個圖

面試官:看你畫的圖,TCP 有自己的首部結構,這都有哪些字段,最好說說它們的作用

  • 朋友(什么鬼!當我百度詞典,這怎么記得住?等等,昨天晚上好像看過,有印象)

  • 朋友:繼續畫個圖,直觀點

  • 朋友:TCP 首部結構先是 16 位的源端口號和目標端口號、接着是 32 位的序列號和確認號。再下面就是 4bit 的頭部長度和 6 個 bit 的保留位及 6bit 的標志位

  • 朋友:16 位的屬性則有窗口大小(控制發送窗口),檢驗和(校驗數據段是否未被修改)及緊急指針。最后是選項,其長度由頭部長度決定

  • 朋友:詳細說下序列號,它是 TCP 報文段的一數字編號,為保證 TCP 可靠連接,每一個發送的數據段都要加上序列號。建立連接時,兩端都會隨機生成一個初始序列號。而確認號是和序列號配合使用的,應答某次請求時,則返回一個確認號,它的值等於對方請求序列號加 1

  • 朋友:而 6 個標志位分別是,URG:這是條緊急信息,ACK: 應答消息,PSH: 緩沖區尚未填滿,RST: 重置連接,SYN: 建立連接消息標志,FIN:連接關閉通知信息

  • 朋友:窗口大小是接收端用來控制發送端的滑動窗口大小

面試官:那 TCP 和 UDP 有什么區別

  • 朋友(松了一口氣)

  • 朋友:1)連接方面: TCP 面向連接。UDP 是無連接的,發送數據之前不需要建立連接

  • 朋友:2)安全方面: TCP 提供可靠的服務,保證傳送的數據,無差錯,不丟失,不重復,且按序到達。UDP 則是盡最大努力交付,不保證可靠交付

  • 朋友:3)傳輸效率:TCP 傳輸效率相對較低,UDP 傳輸效率高

面試官:剛才你說 TCP 是可靠的連接,它是怎么實現的

  • 朋友:TCP 的連接是基於三次握手,而斷開則是四次揮手

  • 朋友:為了保障數據不丟失及錯誤(可靠性),它有報文校驗、ACK 應答、超時重傳 (發送方)、失序數據重傳(接收方)、丟棄重復數據、流量控制(滑動窗口)和擁塞控制等機制

面試官:具體說一說三次握手和四次揮手機制

  • 朋友(又是常規題,曬曬水啦)

  • 朋友:TCP 是可靠的雙向通道,所以需要三次握手和四次揮手,我來畫個圖

  • 三次握手

  • 四次揮手

  • 朋友:提前搶答下,關閉連接時需要四次揮手,比建立時多一次,是因為被動關閉端或許還有數據沒被送出去,不能像握手時一樣,第二次握手既是發起握手也是響應握手

面試官:如果沒有三次握手會有什么問題呢

  • 朋友:如果只有兩次握手,client 發連接請求后不會再 ACK 服務端的 SYN

  • 朋友:此時若客戶端因為自身原因判斷建立連接失敗,可能會重復建立 TCP 連接,而服務端卻會認為那些被 client 丟棄的 TCP 還是有效,會白白浪費資源

面試官:TIME_WAIT 和 CLOSE_WAIT 的區別在哪

  • 朋友:CLOSE_WAIT 是被動關閉形成的;當對方 close socket 而發送 FIN 報文過來時,回應 ACK 之后進入 CLOSE_WAIT 狀態。隨后檢查是否存在未傳輸數據,如果沒有則發起第三次揮手,發送 FIN 報文給對方,進入 LAST_ACK 狀態並等待對方 ACK 報文到來

  • 朋友:TIME_WAIT 是主動關閉連接方式形成的;處於 FIN_WAIT_2 狀態時,收到對方 FIN 報文后進入 TIME_WAIT 狀態;之后再等待兩個 MSL(Maximum Segment Lifetime: 報文最大生存時間)

面試官:TIME_WAIT 的作用呢,還有為啥狀態時間要保持兩個 MSL

  • 朋友 (這問得太深了吧,老哥。還好昨天偷偷補課了)

  • 朋友:1)TIME_WAIT 的作用是為了保證最后一次揮手的 ACK 報文能送達給對方,如果 ACK 丟失,對方會超時重傳 FIN,主動關閉端會再次響應 ACK 過去;如果沒有 TIME_WAIT 狀態,直接關閉,對方重傳的 FIN 報文則被響應一個 RST 報文,此 RST 會被動關閉端被解析成錯誤

  • 朋友:2)存在兩個連接,第一個連接正常關閉,第二相同的連接緊接着建立;如果第一個連接的迷路報文到來,則會干擾第二連接,等待兩個 MSL 則可以讓上次連接的報文數據消逝在網絡

面試官:剛才你還有提到擁塞控制,TCP 協議用什么方式去解決擁塞的

  • 朋友:第一方式是慢啟動和擁塞避免

  • 朋友:1)慢啟動,TCP 發送端會維護一個擁塞窗口(congestionwindow), 簡稱為 cwnd。擁塞窗口初始為 1 個報文段,每經過一次 RTT(數據完全發送完到確認的時間),窗口大小翻倍(指數增長,只是前期慢)

  • 朋友:2)擁塞避免,它思路是讓擁塞窗口 cwnd 緩慢增大,發送方的 cwnd 達到閥值 ssthresh(初始值由系統決定的) 之后,每經過一個 RTT 就把擁塞窗口加一,而不是加倍(收到兩個或四個確認,都是 cwnd+1),cwnd 呈線性增加(加法增大)

  • 朋友:(畫個圖好解析)

  • 朋友:如果遇到網絡擁塞,擁塞窗口閥值 ssthresh 減半,cwnd 設置為 1,重新進入慢啟動階段

面試官:那擁塞控制還有其他什么方式呢

  • 朋友:快重傳和快恢復

  • 朋友:1)快重傳是當接收方收到了一個失序的報文,則立馬報告給發送方,趕緊重傳

  • 朋友:假如接收方 M1 收到了,M2 沒有收到,之后的 M3、M4、M5 又發送了,此時接收方一共連續給發送方反饋了 3 個 M1 確認報文。那么快重傳規定,發送方只要連續收到 3 個重復確認,立即重傳對方發來的 M2(重復確認報文的后一個報文)

  • 朋友:2)快恢復

  • 朋友:當發送方連續收到三個重復確認,ssthresh 減半;由於發送方可能認為網絡現在沒有擁塞,因此與慢啟動不同,把 cwnd 值設置為 ssthresh 減半之后的值,然后執行擁塞避免算法,cwnd 線性增大

  • 朋友:(再來一圖)

面試官:知道滑動窗口不,客戶端和服務端控制滑動窗口的過程是怎樣的

  • 朋友:接收端將自己可以接收的緩沖區大小放入 TCP 首部中的 “窗口大小” 字段,通過 ACK 報文來通知發送端,滑動窗口是接收端用來控制發送端發送數據的大小,從而達到流量控制

  • 朋友:其實發送方的窗口上限,是取值擁塞窗口和滑動窗口兩者的最小值

面試官:那你知道滑動窗口和擁塞窗口有什么區別不

  • 朋友:相同點都是控制丟包現象,實現機制都是讓發送方發得慢一點

  • 朋友:不同點在於控制的對象不同

  • 朋友:1)流量控制的對象是接收方,怕發送方發的太快,使得接收方來不及處理

  • 朋友:2)擁塞控制的對象是網絡,怕發送方發的太快,造成網絡擁塞,使得網絡來不及處理

面試官:TCP 的粘包和拆包問題,你怎么看

  • 朋友:程序需要發送的數據大小和 TCP 報文段能發送 MSS(Maximum Segment Size,最大報文長度)是不一樣的

  • 朋友:大於 MSS 時,而需要把程序數據拆分為多個 TCP 報文段,稱之為拆包;小於時,則會考慮合並多個程序數據為一個 TCP 報文段,則是粘包;其中 MSS = TCP 報文段長度 - TCP 首部長度

  • 朋友:在 IP 協議層或者鏈路層、物理層,都存在拆包、粘包現象

面試官:那解決粘包和拆包的方法都有哪些?

  • 朋友:1)在數據尾部增加特殊字符進行分割

  • 朋友:2)將數據定為固定大小

  • 朋友:3)將數據分為兩部分,一部分是頭部,一部分是內容體;其中頭部結構大小固定,且有一個字段聲明內容體的大小

面試官:SYN Flood 了解嗎

  • 朋友:SYN Flood 偽造 SYN 報文向服務器發起連接,服務器在收到報文后用 SYN_ACK 應答,此應答發出去后,不會收到 ACK 報文,造成一個半連接

  • 朋友:若攻擊者發送大量這樣的報文,會在被攻擊主機上出現大量的半連接,耗盡其資源,使正常的用戶無法訪問,直到半連接超時

面試官:對 TCP 的掌握挺不錯的,下面問下 HTTP 的知識。你知道一次 HTTP 請求,程序一般經歷了哪幾個步驟?

  • 朋友:1)解析域名 -> 2)發起 TCP 三次握手,建立連接 -> 3)基於 TCP 發起 HTTP 請求 -> 4)服務器響應 HTTP 請求,並返回數據 -> 5)客戶端解析返回數據

面試官:HTTP 有哪幾種響應狀態碼,列舉幾個你熟悉的

  • 朋友:大概有以下幾種

  • 200:表示成功正常請求

  • 400:語義有誤,一般是請求格式不對

  • 401:需求用戶驗證權限,一般是證書 token 沒通過認證

  • 403:拒絕提供服務

  • 404:資源不存在

  • 500:服務器錯誤

  • 503:服務器臨時維護,過載;可恢復

  • 朋友:1)存儲位置不同,cookie 是保存在客戶端的數據;session 的數據存放在服務器上

  • 朋友:2)存儲容量不同,單個 cookie 保存的數據小,一個站點最多保存 20 個 Cookie;對於 session 來說並沒有上限

  • 朋友:3)存儲方式不同,cookie 中只能保管 ASCII 字符串;session 中能夠存儲任何類型的數據

  • 朋友:4)隱私策略不同,cookie 對客戶端是可見的;session 存儲在服務器上,對客戶端是透明對

  • 朋友:5)有效期上不同,cookie 可以長期有效存在;session 依賴於名為 JSESSIONID 的 cookie,過期時間默認為 - 1,只需關閉窗口該 session 就會失效

  • 朋友:6)跨域支持上不同,cookie 支持跨域名訪問;session 不支持跨域名訪問

面試官:不錯,那你了解什么是 HTTP 分塊傳送嗎

  • 朋友:分塊傳送是 HTTP 的一種傳輸機制,允許服務端發送給客戶端的數據分成多個部分,該協議在 HTTP/1.1 提供

面試官:HTTP 分塊傳送有什么好處

  • 朋友:HTTP 分塊傳輸編碼允許服務器為動態生成的內容維持 HTTP 持久連接

  • 朋友:分塊傳輸編碼允許服務器在最后發送消息頭字段。對於那些頭字段值在內容被生成之前無法知道的情形非常重要,例如消息的內容要使用散列進行簽名

  • 朋友:HTTP 服務器有時使用壓縮 (gzip 或 deflate)以縮短傳輸花費的時間。分塊傳輸編碼可以用來分隔壓縮對象的多個部分。在這種情況下,塊不是分別壓縮的,而是整個負載進行壓縮。分塊編碼有利於一邊進行壓縮一邊發送數據

面試官:HTTP 的長連接你怎么理解

  • 朋友:長連接是指客戶端和服務建立 TCP 連接后,它們之間的連接會持續存在,不會因為一次 HTTP 請求后關閉,后續的請求也是用這個連接

  • 朋友:長連接可以省去 TCP 的建立和關閉操作,對於頻繁請求的客戶端適合使用長連接,但是注意惡意的長連接導致服務受損(建議內部服務之間使用)

面試官:HTTP 是安全的嗎?怎么做到安全的 HTTP 協議傳輸

  • 朋友:並非安全,HTTP 傳輸的數據都是明文的,容易被第三方截取;要做安全傳輸數據,可以使用 HTTP 的升級版 HTTPS 協議

面試官:HTTPS 和 HTTP 的區別,你是怎么理解的

  • 朋友:1)http 協議的連接是無狀態的,明文傳輸

  • 朋友:2)HTTPS 則是由 SSL/TLS+HTTP 協議構建的有加密傳輸、身份認證的網絡協議

面試官:SSL/TLS 是什么,HTTPS 的安全性是怎樣實現的?

  • 朋友:SSL(Secure Socket Layer 安全套接層) 是基於 HTTPS 下的一個協議加密層,保障數據私密性。TLS(Transport Layer Security) 則是升級版的 SSL

  • 朋友:https 在 http 基礎加了一層安全認證及加密層 TLS 或者 SSL,它首先會通過安全層進行 ca 證書認證,正確獲取服務端的公鑰

  • 朋友:接着客戶端會通過公鑰和服務端確認一種加密算法,后面的數據則可以使用該加密算法對數據進行加密

參考資料

[1]

騰訊面試 HTTP 與 TCP/IP20 連問,你能答出多少: https://blog.csdn.net/weixin_48182198/article/details/107611341

[2]

什么是 TCP/IP 協議?: https://blog.csdn.net/bjweimengshu/article/details/79214572

[3]

太厲害了,終於有人能把 TCP/IP 協議講的明明白白了!: https://developer.51cto.com/art/201906/597961.htm

[4]

TCP 的滑動窗口與擁塞窗口: https://blog.csdn.net/ligupeng7929/article/details/79597423


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM