龔一鳴
描述一下三次握手的過程,回答不出基本上就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套接字連接。 它的工作原理是:
客戶端節點通過IP網絡將SYN數據包發送到同一網絡或外部網絡上的服務器。 這個數據包的目的是詢問/推斷服務器是否能打開新的連接。
目標服務器必須具有可以接受和啟動新連接的開放端口。 當服務器從客戶端節點收到SYN數據包時,它會響應並返回一個確認收據 - ACK數據包或SYN / ACK數據包。
客戶端節點從服務器接收SYN / ACK並用ACK數據包進行響應。
完成此過程後,將創建連接並且主機和服務器可以進行通信。
最好還畫一個圖:(English better!,發散到why,security better)
小鳥攻城獅
用簡單的例子比喻三次握手:甲乙兩人對話,
甲:我說的話能聽見嗎?(第一次握手)
乙:你說的話我能聽見,我說的話你能聽見嗎?(第二次握手)
甲:你說的話我也能聽見。(第三次握手)
三次握手成功後即開始數據接收和發送。
再用個簡單的例子說一下四次揮手:
甲:我們分手吧!
乙:亞美得!
甲:堅決分手!
乙:好吧!祝你幸福!
這就是四次揮手,然而在抓包的時候發現,三次握手每次都是有的,而四次揮手有的時候只有三次,當乙方數據傳輸完畢,甲發出fin信號的時候,乙就會斷開連接,甲再發個ack確認號即可完成四次揮手