關於計算機網絡的TCP三次握手和四次揮手的問題,面試官想聽到怎樣的回答?

龔一鳴




描述一下三次握手的過程,回答不出基本上就game over了。

如果沒有什麼錯誤,再讓對方描述一下握手報文裡都有哪些關鍵字段,能夠說出ISN這個關鍵詞,接著問。

ISN代表什麼?意義何在?

ISN,發送方的字節數據編號的原點,讓對方生成一個合法的接收窗口。

ISN是固定不變的嗎?

動態隨機。

ISN為何要動態隨機?

增加安全性,為了避免被第三方猜測到,從而被第三方偽造的RST報文Reset。

還有嗎?

ISN動態隨機使得每個tcp session的字節序列號沒有重疊,如果出現tcp五元組衝突這種極小概率情況的發生,一個session的數據也不會被誤認為是另一個session的。

剛才你提到第三方可以偽造RST報文,需要滿足什麼條件才能得逞?

需要sequence number 位於對方的合法接收窗口內。而由於ISN是動態隨機的,猜出對方合法接收窗口難度加大。

如果ISN = 0,那麼猜出的難度就大大降低。

三次握手的第一次可以攜帶數據嗎?為何?

不可以,三次握手還沒有完成。

對方難道不可以將數據緩存下來,等握手成功再提交給應用程序?

這樣會放大SYN FLOOD攻擊。

如果攻擊者偽造了成千上萬的握手報文,攜帶了1K+ 字節的數據,而接收方會開闢大量的緩存來容納這些巨大數據,內存會很容易耗盡,從而拒絕服務。

那第三次可以攜帶數據嗎?為何?

可以。

能夠發出第三次握手報文的主機,肯定接收到第二次(服務器)握手報文,對嗎?

因為偽造IP的主機是不會接收到第二次報文的。

所以,能夠發出第三次握手報文的,應該是合法的用戶。

儘管服務器側的狀態還沒有“established”,接收到第三次握手的瞬間,狀態就會切換為“established”,裡面攜帶的數據按照正常流程走就好。

剛才你提到偽造TCP報文儘管有難度,那麼有什麼辦法,可以讓接收方檢測出TCP報文是偽造的、或被篡改的? 你覺得TLS可以做到嗎?

使用TCP的安全選項,option 29,可以讓通信雙方TCP報文強制有HMAC,只有雙方擁有HMAC KEY,也只有通信雙方可以生成並校驗對方的HMAC,任何第三方都沒有辦法偽造、或篡改而不被接收方發現。

TLS位於TCP之上,不對TCP報文頭進行完整性保護,只對應用層數據本身做數據完整性保護,所以TLS並不能保護TCP的安全。

RST報文為例,完完全全是一個TCP報文頭,沒有任何報文體,對嗎?沒有完整性保護,其實脆弱的很,偽造RST報文是一個有難度,但理論上絕對可行的操作。

看到有人說,只看到過TCP狀態位為’FIN +ACK’,但從來沒有看過狀態位只有 ‘FIN’,你應該怎樣給他解釋?

RFC793明確規定,除了第一個握手報文SYN除外,其它所有報文必須將ACK= 1。

很好,RFC規定的背後肯定有合理性的一面,能否深究一下原因?

TCP作為一個可靠傳輸協議,其可靠性就是依賴於收到對方的數據,ACK對方,這樣對方就可以釋放緩存的數據,因為對方確信數據已經被接收到了。

但TCP報文是在IP網絡上傳輸,丟包是家常便飯,接收方要抓住一切的機會,把消息告訴發送方。最方便的方式就是,任何我方發送的TCP報文,都要捎帶著ACK狀態位。

ACK狀態位單獨能承擔這個消息傳遞的任務嗎?

不能!需要有 Acknowledge Number配合才行。

如果我方發出的Acknowledge Number == 10001,那意味著序列號10000及之前的字節已經成功接收。

如果對方佔據字節序列號10000是應用層數據,那麼就是確認應用層數據。

如果對方佔據字節序列號10000是’FIN’狀態位,那麼就是確認接收到對方的’FIN’。

更多文章,可以關注公眾號(chexiaopangnetwork) 閱讀!


車小胖談網絡




面試官期望的


做為在大廠拿到《認證面試官》的我來說,我更期望能看到面試者的答案是:

  • 三次握手原理,四次揮手原理

  • 過程解讀,說不清楚,請在面試官前畫圖

  • 舉例子

  • why,為什麼不是四次握手,三次揮手;為什麼甚至需要握手? 為什麼消息不能與第一個數據包一起發送?

  • 發散思維,安全方面考慮。

  • 比較兩點是後面的,或者說抓包軟件名稱,分析過之類的。

有朋友也才加過谷歌的面試,公司也出過這樣的題目:tcp 3 way handshake and setting the FIN bit?當然答案也因人而異。


可參考


  • 三次握手主要用於創建TCP套接字連接。 它的工作原理是:


  1. 客戶端節點通過IP網絡將SYN數據包發送到同一網絡或外部網絡上的服務器。 這個數據包的目的是詢問/推斷服務器是否能打開新的連接。

  2. 目標服務器必須具有可以接受和啟動新連接的開放端口。 當服務器從客戶端節點收到SYN數據包時,它會響應並返回一個確認收據 - ACK數據包或SYN / ACK數據包。

  3. 客戶端節點從服務器接收SYN / ACK並用ACK數據包進行響應。

  4. 完成此過程後,將創建連接並且主機和服務器可以進行通信。
    最好還畫一個圖:(English better!,發散到why,security better)



歡迎關注,以互聯網的獨特視角,解鎖更多,共同進步!

小鳥攻城獅


用簡單的例子比喻三次握手:甲乙兩人對話,

甲:我說的話能聽見嗎?(第一次握手)

乙:你說的話我能聽見,我說的話你能聽見嗎?(第二次握手)

甲:你說的話我也能聽見。(第三次握手)

三次握手成功後即開始數據接收和發送。



再用個簡單的例子說一下四次揮手:

甲:我們分手吧!

乙:亞美得!

甲:堅決分手!

乙:好吧!祝你幸福!



這就是四次揮手,然而在抓包的時候發現,三次握手每次都是有的,而四次揮手有的時候只有三次,當乙方數據傳輸完畢,甲發出fin信號的時候,乙就會斷開連接,甲再發個ack確認號即可完成四次揮手


分享到:


相關文章: