tcp協議三次握手、四次揮手及其他

tcp是傳輸層協議,爲上層應用層提供可靠地、端到端的數據傳輸。可靠是因爲tcp是有連接、有重傳機制的;端到端是指tcp只處理端口之間的通信,ip尋址是網絡層和鏈路層負責的。

tcp建立連接,三次握手
(1)client發送一個tcp報文,請求建立連接,報文裏包含如下信息:SYN位置1,seq序號x,表示當前client端發送報文編號爲x;發送以後,client進入SYN_SEND狀態;
(2)server收到client請求建立連接的報文,發送一個響應報文,包含如下信息:SYN位置爲1,ACK位置爲1,ack序號爲x+1,seq序號爲y,ack序號的意思,是說收到了x號報文,可以發送x+1號報文了;seq序號的意思,是當前server端發送報文的編號爲y。發送以後,server進入SYN_RECV狀態;
(3)client收到server的確認連接響應報文,再發送一個確認響應報文,包含如下信息:ACK位置爲1,ack序號y+1,表示收到了server的y號報文,可以發送y+1號報文了。之後雙方都進入ESTIBLISHED狀態。;

一種攻擊方式就是僞造client,給server發送大量的SYN請求,導致server創建大量的SYN_RECV狀態的連接。解決方法是檢查請求建立連接的ip。

tcp斷開連接,四次揮手
client和server都可以主動斷開連接。假設主動斷開連接方爲a,另一方爲b。
(1)a發送一個終止報文,FIN位置爲1,之後就進入FIN_WAIT1狀態。
(2)b收到a的終止報文,發送確認收到FIN的報文,之後a進入FIN_WAIT2狀態,b進入CLOSE_WAIT狀態。
(3)b也處理完成,發送終止報文給a,然後進入LAST_ACK狀態,等待a迴應。
(4)a收到b的終止報文,發送確認報文給b,並進入TIME_WAIT狀態,b收到後變成CLOSED狀態

TIME_WAIT狀態
主動發起斷開連接的一方,在最後會進入TIME_WAIT狀態,等待2MSL時間之後再斷開連接。MSL是報文在網絡中存活的最大存活時間。之所以要等待2MSL,是因爲如果第4步的報文丟失,b會發送重傳請求給a,即再發送一個FIN報文給a,如果此時a已經關閉,就不能正確響應b。更危險的是,如果這個端口被重新建立了連接,會造成狀態錯亂。

大量TIME_WAIT狀態
之前見到別人做壓力測試,導致服務器上出現大量的TIME_WAIT狀態,端口號被用盡。windows上2msl大概是4分鐘。如果快速創建多個短連接又很快關閉,就會出現TIME_WAIT狀態飽和的問題。解決方案就是減少TIME_WAIT的等待時間。

tcp報文
tcp報文頭包括源端口(16bit),目標端口(16bit),seq(32bit),ack_seq(32bit),SYN/ACK/FIN等標記位,窗口長度。

tcp的擁塞控制
發送方的發送窗口大小,不是固定的,而是動態的,基於擁塞控制算法:初始窗口尺寸爲cwd,如果按時收到了接收方響應,則窗口尺寸擴大兩倍;當窗口尺寸達到閾值時,不再成倍增長,轉爲線性增長,即一次擴大1。一旦發生重傳,則立刻把當前窗口減半。
重傳有兩種:超時重傳和快重傳。超時重傳很容易理解,如果發送方長時間沒有收到接收方的響應報文,則重新範松。快重傳:接收方如果收到一個亂序的報文,則發送上一個報文的確認ack。發送方收到三條同樣的確認ack時,即認爲有報文丟失,立刻重傳,不等超時。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章