1. 程式人生 > >tcp三次握手四次揮手

tcp三次握手四次揮手

tcp 三次握手 數據傳輸 四次揮手

tcp三次握手四次揮手圖解

1、tcp三次握手

技術分享圖片
第一次握手:建立連接時,客戶端發送SYN到服務器,並進入SYN_SENT狀態
第二次握手:服務器收到請求後,回送SYN+ACK信令到客戶端,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到SYN+ACK包,向服務器發送確認ACK包,客戶端進入ESTABLISHED狀態,服務器收到請求後也進入ESTABLISHED狀態,完成三次握手,此時TCP連接成功,客戶端與服務器開始傳送數據

1.1 TCP三次連接狀態

技術分享圖片
1、客戶端發起連接
2、服務端確認
3、客戶端再次響應回復確認 TCP三次握手成功

1、問:第二次確認不就可以了麽?
 答:為了確認客戶端是否已經收到了服務端發出的信息,如果服務端發出的信息沒有得到有效回復,那麽超出時間後服務端會在次發送重連信息,直到超時丟棄,第三步中如果服務器沒有收到客戶端的最終ACK確認報文,會一直處於SYN_RECV狀態,將客戶端IP加入等待列表,並重發第二步的SYN+ACK報文。重發一般進行3-5次,大約間隔30秒左右輪詢一次等待列表重試所有客戶端。另一方面,服務器在自己發出了SYN+ACK報文後,會預分配資源為即將建立的TCP連接儲存信息做準備,這個資源在等待重試期間一直保留。更為重要的是,服務器資源有限,可以維護的SYN_RECV狀態超過極限後就不再接受新的SYN報文,也就是拒絕新的TCP連接建立。 DDOS來了解一下

    比如: A說 中午幫我帶個咖啡
                 B說:中午啥咖啡,   然後A一直不回復,長期等待中,再說一次A還是不回復,B就直接會無視說這個逗逼
又或者說  B說:中午啥咖啡
                A回: 你喝啥我就喝啥, 這樣就能建立一次有效的連接。

2、問:TCP建立連接為什麽是三次握手
第一次握手成功:說明客戶端的數據可以被服務端收到,說明客戶端的發功能可用,說明服務端的收功能可用。但客戶端自己不知道數據是否被接收
第二次握手成功:說明服務端的數據可以被客戶端收到,說明服務端的發功能可用,說明客戶端的收功能可用。同時客戶端知道自己的數據已經正確到達服務端,自己的發功能正常。但是服務端自己不知道數據是否被接收

第三次握手成功:說明服務端知道自己的數據已經正確到達客戶端端,自己的發功能正常。至此服務成功建立

2、TCP數據傳輸

數據連接大致如圖
技術分享圖片
當客戶端與服務端建立連接之後,客戶端向服務端先發送數據,分片發送, 服務端接收完數據之後會返回一個確認信息,說明已經接收完了,如果客戶端沒有收到這個ack,那麽服務端重發一個ack信息.

技術分享圖片

1、問:如果客戶端發送數據完成,客戶端就掛了,服務端接收到的文件完整麽?
   客戶端發送按MTU將數據到服務端 (客戶端一次會將數據全部發送過來),服務端接收到數據在內核態中,由內核態復制到用戶態,這段數據是完整的,所以說在客戶端傳輸完就斷開,並不會影響到數據的完整性,就是唯一一點要確認的是 客戶端發送到服務端的數據是完整的麽? 這裏可以用md5值來看一下檢驗。

3、tcp四次揮手

技術分享圖片
1、第一次揮手:客戶端發送[fin+ack]請求,說明的確沒有數據在在傳輸了,此時狀態為fin_wait1;
2、第二次揮手:服務端接收到客戶端的請求,確認可以斷開連接發送[ack]確認,此時狀態為close_wait,客戶端收到確認信息狀態信息改為fin_wait2,
3、第三次揮手:然後會在發送一個自己本身斷開的請求[fin,ack],服務端就連接斷開了,狀態位為last_ack;
4、第四次揮手:客戶端發送最後一次的確認信息[ack],此時狀態為time_wait,服務端收到後將狀態改為close關掉狀態

大白話就是:A: 老大我吃完我走了  
                      B:好的, (A這時準備開走)那你走吧,   
                      A:老大下次再見哈

當數據傳輸完成之後,會產生四次揮手,狀態如下
技術分享圖片

tcp三次握手四次揮手