TCP 的三次握手
第一次,客戶端與服務端建立鏈接,需要發送請求連接的消息
第二次,服務端接口到數據后,返回一個確認的操作*(至此客戶端和服務端鏈路建立成功)
第三次,服務端還需要發送要與客戶端建立鏈接的請求
第四次,客戶端收到數據后,返回一個確認的操作(至此服務端到客戶端的鏈路建立成功)
由于建立鏈接時沒有數據傳輸,所以第二次確認和第三次請求可以合并為一次發送tcp協議為了實現可靠傳輸,通信雙方需要判斷自己已經發送的數據包是否都被接收方收到,如果沒有收到,就需要重新發送,為了實現這個需求,就引出 序號 seq ,和確認號 ack的使用
四次揮手
第一次揮手: 客戶端(服務端也可以主動斷開) 向服務端說明想要關閉連接
第二次揮手: 服務端會回復確認,但不是關閉,因為此時服務端可能還有數據在傳輸中
第三次揮手:待到服務端數據傳輸都結束后,服務端向客戶端發出消息,我要斷開連接了
第四次揮手,客戶端收到服務端的斷開信息后,給予確認,服務端收到確認后正式關閉1 代表客戶端 2代表服務端1 -> 2
FIN=1
2 -> 1
ACK =1
FIN =1
1 -> 2
ACK =1
轉換狀態
三次握手狀態轉換
1.客戶端發送syn包向服務端請求建立TCP 連接,客戶端進入 SYN_SEND 狀態
2.服務端收到請求之后,向客戶端發送 SYN+ACK 的合成包,同時自身進入 SYN_RECV 狀態
3.客戶端收到回復之后,發送 ACK信息,自身進入 ESTABLISHED 狀態
4.服務端收到ACK數據之后,進入 ESTABLISHED狀態 四次揮手過狀態轉換
1.客戶端發送完數據之后,向服務器請求斷開連接,自身進入 FIN_WAIT_1 狀態
2.服務端收到 FIN 包之后,回復ACK包表示已經收到,但是此時服務端可能還有數據沒有發送完成,自身進入CLOSE_WAIT 狀態,表示對方已發送完成且請求關閉連接,自身發送完成之后可以關閉連接
3.服務端數據發送完成之后,發送FIN包給客戶端,自身進入LAST_ACK 狀態,等待客戶端 ACK確認
4,客戶端收到FIN 包之后,回復一個ACK包,并進入TIME_WAIT 狀態如果機器 TIME_WAIT 過多,會造成端口耗盡,可以修改內核參數
tcp_tw_recycle=1 端口重用