最近和一同學聊天,他想換工作,然後去面了一家大廠。當時,他在履歷上寫着精通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:伺服器臨時維護,過載;可恢複
面試官:不錯,再考考你,session和cookie有什麼差別
朋友: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證書認證,正确擷取服務端的公鑰
朋友:接着用戶端會通過公鑰和服務端确認一種加密算法,後面的資料則可以使用該加密算法對資料進行加密
面試官:你能詳細說下TLS/SSL的認證過程不...(此時面試官放在桌面的手機震動了起來,他下意識看了看手機,停頓下)
朋友面試暫時告一段落(下回繼續)
Java 的知識面非常廣,面試問的涉及也非常廣泛,重點包括:Java 基礎、Java 并發,JVM、MySQL、資料結構、算法、Spring、微服務、MQ 等等,涉及的知識點何其龐大,是以我們在複習的時候也往往無從下手,今天小編給大家帶來一套 Java 面試題,題庫非常全面,包括 Java 基礎、Java 集合、JVM、Java 并發、Spring全家桶、Redis、MySQL、Dubbo、Netty、MQ 等等,包含 Java 後端知識點 2000 +
資料擷取方式:關注公種浩:“有故事的程式員”擷取上述資料