網絡基礎19 TCP連接

TCP的特性

TCP位於網絡模型中的傳輸層,提供可靠的字節流服務,將大塊數據分割成爲以報文段(segment)爲單位的數據包進行管理,目的是爲了傳送更大數據。

一個TCP連接中,僅有兩方進行彼此通信,廣播和多播不能用於TCP

TCP使用了校驗和確認、重傳極致保證可靠傳輸。要注意,TCP並不能保證數據一定會被對方收到,因爲這是不能的。TCP能夠做的事如果有可能就把數據遞送到接收方,否則就(通過放棄重傳並且終端連接這一手段)通知用戶。因此準確說TCP也不是100%可靠的協議,它所能提供的是數據的可靠遞送或故障的可靠通知。

TCP的三次握手

爲了確保數據傳輸的可靠性,TCP協議採取了三次握手(three-way handshaking)策略。握手過程衡中使用了TCP的標誌——SYN(synchronize)和ACK(acknowledgement)。

所謂的三次握手,值得是建立一個TCP連接時,需要客戶端和服務器總共發送三個包,握手過程如下:

(1)第一次握手

客戶端首先發送一個帶SYN標誌(爲1)的數據包給對方,指明客戶端打算連接服務器的端口等信息。發送完成後,客戶算進入SYN_SEND狀態

(2)第二次握手

服務器收到後,回送一個帶有SYN/ACK標誌的數據包以示傳達確認信息,發送完成後服務端進入SYN_RCVD狀態

(3)第三次握手

最後客戶端再回傳一個帶ACK標誌的數據包,代表握手結束,客戶端和服務端都進入ESTABLISED狀態,TCP握手結束。

DoS攻擊

DoS攻擊就利用了三次握手的機制,客戶端僞造不存在的IP作爲源地址想服務器發送SYN報文,服務器收到之後會迴應一個SYN+ACK報文,並且在自己的半連接隊列中衛收到的SYN報文創建條目,等待客戶端的ACK迴應。

但是由於客戶端採用了IP欺騙,服務端的ACK+SYN報文不會收到迴應,就會等待、重傳,直到重傳次數超過系統規定的最大值後停止,並將這個SYN項目從半連接隊列中刪除。

如果在短時間內僞造大量不存在的IP地址,並快速發送大量這樣的SYN保溫給攻擊目標,服務器的版連接隊列就會被阻塞,系統資源被佔用,正常的SYN請求得不到及時的處理,嚴重的還會硬氣網絡堵塞甚至系統癱瘓

TCP的四次揮手

TCP的連接斷開需要發送四個包,因此稱爲四次揮手。客戶端和服務端均可以主動發起揮手操作

(1)第一次揮手

假設客戶端想要關閉連接,發送一個帶有FIN標誌的數據包給服務器,表明自己已經沒有數據可以發送了,但是仍可以接受數據。

發送完畢後客戶端進入FIN_WAIT_1狀態

(2)第二次揮手

服務端確認客戶端的FIN包,發送一個ACK確認包,表明自己接收到了客戶端關閉連接的請求,但是還沒有準備好關閉連接,需要繼續發送剩餘的數據

(3)第三次揮手

服務端準備好關閉連接時,向客戶端發送結束連接請求,發送帶有FIN標誌的數據包。發送完畢後,服務端進入LAST_ACK狀態,等待來自客戶端的最後一個ACK

(4)第四次揮手

客戶端接收到服務端的關閉請求,發送一個ACK確認包,進入TIME_WAIT狀態,等待可能出現的要求重傳的ACK包

服務端接受到這個確認包後,關閉連接,進入CLOSED狀態。

客戶端等待了某個固定時間之後,沒有收到服務器端的ACK,認爲服務器端已經正常關閉連接,於是自己也關閉連接,進入CLOSED狀態。

爲什麼需要三次握手和四次揮手?

根本原因就是因爲TCP是全雙工通信的,雙方都需要確保自己能被對方連接,以揮手爲例:

(1)第一次揮手的FIN包,只代表主動方不會再發送數據報文,但是仍可以接受報文

(2)第二次揮手,被動方可能還有數據報文沒發送完成,所以先發送ACK包,告訴對方“我已經知道想要斷開連接的請求了”,這樣主動方就不會再繼續發送斷開連接的請求(即FIN包)

(3)第三次揮手,被動方處理完數據報文了,發送FIN包,告訴主動方自己已經可以關閉了,發送FIN包後進入超時等待

(4)第四次揮手,如果主動方發送ACK報文,確認連接斷開,雙方釋放連接。

之所以是四次,而不是三次,就是因爲多了第二次揮手,這是被動方還沒有做好斷開連接的準備,還有數據要繼續發送。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章