tcp協議總結

  • tcp頭部

seq(序列號):表示該數據包第一個數據的字節的序號.例如,第一個包(序號爲1)的長度爲4個字節,第二個包的序號就爲5.

ack(確認號):表示之前的數據包已經接收,需要接收該序號的數據包.例如收到第一個包後,再請求下一個包,這個請求的seq就爲5.

ACK(確認號標識位):爲0時表示ack無效,爲1時表示確認號有效.

SYN:請求同步,請求建立連接,並在其序列號的字段進行序列號的初始值設定。建立連接,設置爲1.

FIN:請求斷開連接

  • 三次握手

第一次握手:客戶端發送(SYN=1,ACK=0,seq=x(x表示任意))SYN數據包,進入SYN_SENT狀態

第二次握手:服務端接收客戶端,響應(SYN=1,ACK=1,seq=y(y表示任意),ack=x+1)SYN+ACK數據包,進入SYN_RECV狀態.

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送(ACK=1,ack=y+1,seq:x+1)的數據包,客戶端進入ESTAB_LISHED(TCP連接成功)狀態,服務器接收後也進入ESTAB_LISHED,完成三次握手。

未連接隊列:   在三次握手協議中,服務器維護一個未連接隊列,該隊列爲每個客戶端的SYN包(syn=j)開設一個條目,該條目表明服務器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包時,刪除該條目,服務器進入ESTAB_LISHED狀態。

  • 四次揮手

第一次揮手:客戶端示意關閉連接,發送(FIN=1,seq=u(u表示任意))數據包,進入FIN-wait-1

第二次揮手:  服務器確認,收到後發送(ACK=1,ack=u+1,seq=v)ACK包.

第三次揮手:服務器示意關閉連接,發送(FIN=1,ACK=1,ack=u+1,seq=w)數據包

第四次揮手:客戶端確認,發送(ACK=1,seq=u+1,ack=w+1)數據包,進入半關閉狀態,需要等待2MSL的時間,才能徹底關閉。(等待一段時間的原因:客戶端確認包可能丟失,如果此時關閉後,服務器可能繼續發送,而客戶端已經關閉).

  • 滑動窗口

客戶端與服務器都有接收與發送窗口,並且服務器的發送窗口與客戶端接收窗口大小需要一致,才能保證雙方傳輸速率一致,滑動窗口根據tcp緩衝區大小決定,並且在建立連接的時候已經協商好了.發送端將滑動窗口裏的多個數據包發送出去,接收端接收後,發送確認接收下一個數據包,然後發送端的滑動窗口開始移動,並將之前的緩存清除,發送下一個數據包.

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