TCP連接握手爲什麼3次?斷開爲什麼是4次?TCP的優化-SCTP協議

TCP

TCP(Transmission Control Protocol)傳輸控制協議,是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。

目錄:

TCP報頭

TCP的三次握手

TCP的四次斷開

SCTP協議

TCP報頭

在這裏插入圖片描述
在這裏插入圖片描述

  • 16Bit-源端口:用來標識計算機中不同的應用進程
  • 16Bit-目標端口:接收方的應用程序接口
  • 32Bit-序列號:序列號是本報文段發送數據組的第一個字節的序號,每一個字節一個序號,如果說一個報文的序列號爲100,此報文的數據部分有200字節,下一個報文段的序列號就爲300,序列號保證了TCP傳輸的有序性
  • 32Bit-確認號:只有當控制位中ack=1時,該確認號才生效,它指明下一個期待收到的字節序列號,表明該序列號之前的數據已經收到
  • 4Bit-頭部長度:TCP的長度時不確定的,報頭不包含任何選項字段長度爲20byte,4Bit的頭部長度是做數據偏移,指示了數據區在報文段中的起始偏移值
  • 6Bit-resv:爲QOS做預留,TCP排隊機制
  • 6Bit-控制字段
    1. URG:緊急指針標誌,爲1時表示TCP報頭中緊急指針有效,爲0時忽略緊急指針,沒有意義
    2. ACK:確認序列號標誌,爲1時確認號有效,爲0時報文中不含確認信息
    3. PSH:緊急數據標誌,爲1時表示帶有緊急標誌的數據,指接收方接收到該報文後,儘快交給應用程序
    4. RST:重新連接標誌,用於重置主機崩潰,錯誤連接,拒絕非法的報文段,拒絕連接
    5. SYN:同步序號,用於建立連接的過程,在請求中,SYN=1和ACK=0表示,沒有ACK確認,SYN=1和ACK=1,表示有ACK的確認
    6. FIN:Finish標誌,用於釋放TCP連接,爲1時,本地沒有數據發送,即將終止本地數據流
  • 16Bit-滑動窗口:滑動窗口大小,用來告知發送端的cache大小,控制數據發送的速率,做流量控制,最大65535
  • 16Bit-校驗和:做奇偶校驗,此校驗和針對於整個TCP報文段,包括頭部和數據
  • 16Bit-指針:控制位UGR=1時,該指針生效,是一個偏移量,和序列號字段中的值相加表示緊急數據的最後一個字節的序號,用於在發送緊急數據時
  • 32Bit-選項填充字段:最常見的爲MSS最大段長度,每個連接方通常在第一個報文段中指出該選項,表示本端能接受的最大段長度

TCP連接的三次握手

在這裏插入圖片描述

  • 第一次握手: 客戶端發出連接請求消息到服務端,SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀態
    1. 服務端:此時服務端收到客戶端的SYN,服務端知道自己與客戶端是可以連接成功的
    2. 客戶端:此時客戶端並不知道服務端是否收到自己的請求連接消息->第二次握手
  • 第二次握手: 第二次握手是服務端發出確認包ACK,來確認收到客戶端的請求連接消息,SYN(SEQ=y)ACK(ACK=x+1),服務端進入SYN_RECV狀態
  • 第三次握手: 客戶端收到服務端的SYN報文,迴應一個ACK(ACK=y+1)報文,進入Established狀態,服務器接收到客戶端的ACK,進入Established狀態

第一次是發出請求,第二次是應答,只有當客戶端確定了自己能與服務端連接上才能開始收發數據,服務端只有收到客戶端的請求才能進行信息的傳遞,這是最基本的

第三次是爲了防止已經失效的連接請求報文突然又傳到服務端(由於網絡卡頓的原因),當服務端再次收到SYN時,會認爲客戶端沒有收到自己的ACK+SYN,會再次發送ACK+SYN,回造成資源的浪費,所以第三次是很有必要的,是客戶端對服務端的再次確認。

TCP的可靠的傳輸控制協議,三次握手能保證數據可靠,又能提高傳輸效率

TCP爲什麼要三次握手?

  • 爲什麼不是兩次握手?

    首先客戶端與服務端建立TCP連接,客戶端發出請求,服務端進行應答,這已經是兩次握手了,如果通過這兩次握手就直接連接TCP連接的話,會存在以下問題

    當網絡卡頓時,客戶端發送給服務端的SYN報文延遲發送時,客戶端沒有收到服務端的ACK報文,此時會認爲沒有收到,客戶端重新發出SYN報文,服務端回覆ACK,TCP建立連接完成,但是之後客戶端延遲的SYN報文會再次到達服務端,服務端會再次回覆一個ACK,又建立一次連接

    當服務端發送的ACK報文,由於網絡原因,不能到達客戶端,但是服務端會認爲已經建立TCP連接,進入就緒狀態等待數據傳輸,此時客戶端沒有收到服務端的ACK報文,會再次發送SYN,但是此時服務端已經進入就緒狀態,那麼服務端會斷開連接,重新再去發送ACK報文,與客戶端重新建立連接

  • 爲什麼不是四次握手?

    如果是4次握手的話,會通過以下的方式:

    第一次握手: 客戶端給服務端發送SYN同步報文。
    第二次握手: 服務端收到SYN後,給客戶端回覆ACK確認報文。
    第三次握手: 服務端給客戶端發送SYN同步報文。
    第四次握手: 客戶端給服務端發送ACK確認報文。

    SYN和ACK只是TCP報頭中的一個標識位,所以SYN和ACK可以在一個報頭中定義,也就是說,第二步服務端的ACK,和第三步的ACK可以合爲一步,SYN+ACK發送給客戶端,這樣就省了一步,提高效率

TCP連接的四次斷開

在這裏插入圖片描述
是TCP的半關閉造成的,客戶端和服務端都要進行關閉,才能徹底斷開連接。

  • 第一次揮手: 第一次揮手是客戶端完成數據傳送後,要與服務端斷開TCP連接,此時會發送一個FIN報文,向服務端請求斷開連接
  • 第二次揮手: 第二次揮手是服務端收到客戶端的FIN請求斷開報文後,對客戶端的請求的確認,向客戶端發送ACK報文,表明自己已經收到客戶端的消息
  • 第三次揮手: 此時服務端知道客戶端已經不會主動發送數據過來了,但是服務端自己還能主動發送消息,如果服務端此時沒有數據要向客戶端發送,會向客戶端發送FIN請求報文,表明自己也要斷開連接
  • 第四次揮手: 第四次揮手是客戶端對服務端FIN請求斷開報文的確認,客戶端向服務端進行確認,表名自己受到服務端的消息,此時四次揮手完畢,徹底斷開連接

TCP是全雙工的,客戶端和服務端都可以向對象發送消息,所以斷開需要雙方都要發出請求,請求之後雙方都要進行確認

SCTP協議

SCTP(Stream Control Transmission Protocol)是一種傳輸層的協議,與TCP/IP協議棧中與TCP和UDP類似,兼有兩者特徵

SCTP特性

SCTP是後來引入的一種新的協議,提供了和TCP一樣的可靠、有序的數據傳輸功能,同時又能和UDP一樣面對消息的方式來進行操作,保護消息邊界

  • 多宿主
  • 多流
  • 初始化保護
  • 消息分幀
  • 可配置的無序發送
  • 平滑關閉

SCTP傳輸問題-多宿主

我們都知道TCP是以字節爲單位來傳輸數據的,但SCTP是 以數據塊爲單位來傳輸數據的,這種數據塊(DATA CHUNK)通常攜帶應用的一個數據包,或者是應用要發送的一個消息

SCTP是將應用程序的每次調用sendmsg()發送的數據當做一個整體,放到一個稱爲DATA CHUNK的數據塊裏面,接收端也是以數據塊爲單位來接收,並重新組包,通知應用程序接收,通常應用程序通過recvmesg()都會受到一條完整的消息.

SCTP多路徑傳輸
在這裏插入圖片描述
TCP的兩端都只能用一個IP來建立TCP連接,連接之後就能用這一對IP來相互收發消息,如果這一對IP之間的路徑出現了問題,那麼這條TCP連接就不可用了

SCTP,兩端都可以綁定在多個IP上,只要其中一對IP能通,這條SCTP連接就還可以用

SCTP傳輸問題-多流&無序發送

一條SCTP連接裏面,可以區分多條不同的流(stream),不同的流之間的數據傳輸互不干擾,如果某一條流由於丟包阻塞,其他的流通常也會丟包,被阻塞,最後導致所有的流都被阻塞,SCTP連接中斷。
在這裏插入圖片描述
在同一條stream裏面,SCTP支持有序/無序兩種傳輸方式,應用程序在調用sendmsg()的時候,需要指定用哪一條stream傳輸,以及指定這條要發送的消息是需要有序傳輸還是無序傳輸的。如果在傳輸過程中丟包,則有序傳遞模式可能會在接收端被阻塞,而無序傳輸模式不會在接收端被阻塞。

SCTP四次握手-初始化保護

TCP中的三次握手機制會被利用來進行DoS攻擊,通過發送大量的SYN報文最終耗盡服務器的資源
在這裏插入圖片描述
SCTP通過引入4次握手機制來避免這種場景:

  • 服務器的INIT-ACK中會包含cookie(標識這個連接的唯一上下文);
  • 客戶端使用這個cookie來進行響應。服務器收到這個響應後,才爲這個連接分配資源;
  • 爲了解決4次握手機制帶來的時延,SCTP協議還允許在COOKIE-ECHO和COOKIE-ACK報文中傳輸數據包

SCTP採用UDP方法-消息分幀

在這裏插入圖片描述
UDP使用的是消息分幀,發端多大的數據包,收端收到的數據包也是這麼大,SCTP也提供了這種分幀的機制

SCTP的三次斷開-平滑關閉

在這裏插入圖片描述

  • TCP和SCTP都是基於連接的協議,完成傳輸後都需要有一個拆除連接的過程。
  • TCP中連接的刪除是半關閉的,服務的某一端可以關閉自己這端的socket,但是可以繼續接受數據。

SCTP協議設計的時候考慮這種半關閉的狀態實際上很少使用,所以簡化了關閉的過程,一旦某一端發起了連接拆除,對等的兩端都關閉。

SCTP協議總結參考鏈接:
SCTP協議詳解 https://blog.csdn.net/wuxing26jiayou/article/details/79743683
SCTP通信協議簡介 https://www.jianshu.com/p/08cba3d3eb9f

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