TCP为什么三次握手?
參考:公眾號 小林coding
常見回答:三次握手保證雙方都具有接受和發送數據的能力。
主要原因:
1. 防止重復歷史連接的初始化
2.同步雙方初始序列號
3.避免資源的浪費
1. TCP為什么三次握手?
1.1? 防止重復歷史連接的初始化
序列號seq標記已發送數據的位置,確認號ack表示數據已接受,期望下一次數據序列號seq = ack
當因為網絡擁塞導致超時重傳建立連接的請求:設兩次請求seq分別為:100, 200,在第二次請求發送后,客戶端記錄seq = 200, 即使網絡恢復舊請求成功得到響應,此時ack = 101, 在客戶端處校驗不通過,發送RST終止這次連接。
如果采用兩次握手:(中間綠色的服務端發送數據就被浪費,并且需要進行連接的銷毀)
?1.2 同步雙方初始序列號
使用序列號可以保證數據的發送是有序的,同時記錄已發送數據的位置,便于對比請求響應ack確定下一次發送數據的位置。
在三次握手的情況下,雙方都對請求作出響應,表示數據接受,初始化發送數據的序列號;保證雙方都進入數據可發送和接受的狀態。
其中的四次握手,說的服務端響應階段需要發送標志位:SYN, ACK,SYN用于初始化序列號,ACK表示確定數據接受成功;而最優的三次握手中,將這兩個階段放到一起,減少一次請求
3.其他問題
3.1 為什么客戶端和服務端的初始化序列號不同?
可以注意到,在三次握手的建立過程中,很多情況下客戶端的seq = x, 而服務端的序列號 seq = y
這樣做的原因為了防止歷史報文被下一個相同的四元組(tcp連接)接收
服務端和接收端中分別維護窗口大小,用于接收數據;如果使用不同的seq, 可以保證及時連接重置,舊的歷史數據也很大程度不會落入接收窗口中,不會使數據污染。
假設每次初始化序列號都是0:
?
3.2 為什么要在傳輸層分片?
MTU:網絡中最大數據包長度, 包括:IP頭 + TCP頭?+ 數據報,以太網一般1500
MSS:最大數據報長度
當數據報超過MSS的時候進行數據分片。
如果在IP中進行分片,網絡層中不包含重傳機制,一旦某一個分片丟失,會導致這次請求的所有數據都要重傳。
3.3 SYN攻擊
????????在TCP 連接建立是需要三次握手,假設攻擊者短時間偽造不同 IP 地址的?SYN?報文,服務端每接收到一個?SYN?報文,就進入SYN_RCVD?狀態,但服務端發送出去的?ACK + SYN?報文,無法得到未知 IP 主機的?ACK?應答,久而久之就會占滿服務端的半連接隊列,使得服務器不能為正常用戶服務。
4、四次揮手
? ? ? ? 進入連接斷開階段:
? ? ? ? 第一次:客戶端數據發送結束,發送FIN, 服務端接受后進入close_wait狀態
? ? ? ? 第二次:服務端響應客戶端斷開連接的請求
? ? ? ? 第三次:服務端接收數據結束,發送FIN, 客戶端接收后進入time_wait狀態
? ? ? ? 第四次: 客戶端響應服務端請求,發送ack, 在time_wait階段下等待2MSL時間;如果這個時間間隔內沒有收到服務端的請求,進入close狀態
主動關閉連接的,才有time_wait狀態
相比于三次握手,這里的FIN 和 ACK需要分開,表示服務端仍可以接受數據;因此需要四次揮手
4.1 為什么需要2MSL
什么是MSL: 是報文段在網絡中傳輸的最長時間;超過這個時間,就會被丟棄
2MSL:客戶端發送確認報文ACK + 等待服務端請求(如果ACK丟失,重新發送FIN)兩次請求的最長存活時間;當超過這個時間,表示報文發送成功。
4.2 為什么要有TIME_WAIT狀態
1. 防止歷史數據被后面相同的四元組(TCP連接)接收。假設第一次TCP連接中seq = 100, 整個過程中發送一次seq = 101的報文,但是因為網絡產生延遲,在TCP關閉前也沒有成功接收。再重新建立一個TCP連接使用seq = 100, 此時上一次連接中的報文到達,并且接收窗口 [100, x]可以接受這次的數據;導致了新的連接接受了上一次的舊數據。
?
2. 保證接收數據方能夠正常斷開;如果沒有2MSL, 當客戶端發送ACK后直接進入關閉狀態,如果ACK丟包,導致服務端重新發送FIN, 此時沒有接收方,服務端一直沒有斷開連接
后續LInux中的看不懂。。。慢慢看吧,哎
總結
以上是生活随笔為你收集整理的TCP为什么三次握手?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计师找灵感,这5个网站就够了
- 下一篇: 小红书-笔记灵感-项目总结