TCP協議三次握手四次揮手

2021-09-25 06:45:30 字數 3441 閱讀 4351

tcp有哪些過程?

a. 建立連線

b. 資料傳輸

c. 終止連線

tcp三次握手和四次揮手的過程?

syn,ack是什麼?

syn:請求建立連線(含有同步序列號的標誌位的資料,tcp建立連線時,將這個「位」置1)

ack:針對syn的確認應答

fin是什麼?

fin:傳送端完成傳送任務「位」,當tcp完成資料傳輸需要斷開時,提出斷開的一方將這「位」置1

三次握手的過程?

為什麼是三次次握手?

tcp 為什麼是三次握手,而不是兩次或四次?

原創: 車小胖談網路 車小胖談網路 2018-09-13

記得第一次看tcp握手連線的時候,有同樣的疑問,我的疑問是,為何不是兩次呢?

後來隨著對網路的理解深入,明白tcp報文是交由ip網路來負責運輸,ip網路並不能保證tcp報文到達目的地,既然ip網路是指望不上了,那tcp就自力更生吧,tcp必須依賴自身的努力來保證資料傳輸的可靠。

tcp看似複雜,其實可以歸納為以下5種報文:

(1) syn

(2) data (唯一攜帶使用者資料)

(3) fin

(4) reset

(5) ack

其中1、2、3分別為建立連線、資料傳輸、斷開連線,這三種報文對方接收到一定要ack確認,為何要確認,因為這就是可靠傳輸的依賴的機制。如果對方在超時時間內不確認,傳送方會一直重傳,直到對方確認為止、或到達重傳上限次數而reset連線。

4、5 為重置連線報文、確認ack報文,這兩種報文對方接收到要ack確認吧?不需要!自然傳送方也不會重傳這2種型別的報文。

為何reset報文不需要ack確認?

因為傳送reset報文的一端,在傳送完這個報文之後,和該tcp session有關的記憶體結構體瞬間全部釋放,無論對方收到或沒有收到,關係並不大。

如果對方收到reset報文,也會釋放該tcp session 的相關記憶體結構體。

如果對方沒有收到reset 報文,可能會繼續傳送讓接收方彈射出reset報文的報文,到最後對方一樣會收到reset 報文,並最終釋放記憶體。

為何ack報文不需要ack確認?

這裡的ack報文,是指沒有攜帶任何資料的裸ack報文,對方收到這樣的ack報文,自然也不需要ack。否則,對方為了ack己方的ack,那己方收到對方的ack,也要ack對方的ack,這就是乙個死迴圈,永無止息。

所以為了避免這個死迴圈,一律不允許ack對方的裸ack報文。

有同學會說,按照這麼說,tcp連線應該是四次訊息互動啊。

1.a 傳送syn 報文給b,這是第一次報文互動。

2.b傳送ack確認a的syn報文,這是第二次報文互動

3.b傳送自己的syn報文給a,這是第三次報文互動

4.a需要ack確認b的syn報文,這是第四次報文互動

以上的演繹沒有問題,但是報文2、3為何要分開傳送呢?增加了延遲不說,同時還白白浪費了網路的頻寬,完全可以將報文2、3合併起來,不就是在報文2的ack狀態位的位置置「1」就結了嗎?

這就是三次訊息互動的由來!

原文:

tcp作為一種可靠傳輸控制協議,其核心思想:既要保證資料可靠傳輸,又要提高傳輸的效率,而用三次恰恰可以滿足以上兩方面的需求!

tcp可靠傳輸的精髓:tcp連線的一方a,由作業系統動態隨機選取乙個32位長的序列號(initial sequence number),假設a的初始序列號為1000,以該序列號為原點,對自己將要傳送的每個位元組的資料進行編號,1001,1002,1003…,並把自己的初始序列號isn告訴b,讓b有乙個思想準備,什麼樣編號的資料是合法的,什麼編號是非法的,比如編號900就是非法的,同時b還可以對a每乙個編號的位元組資料進行確認。如果a收到b確認編號為2001,則意味著位元組編號為1001-2000,共1000個位元組已經安全到達。

同理b也是類似的操作,假設b的初始序列號isn為2000,以該序列號為原點,對自己將要傳送的每個位元組的資料進行編號,2001,2002,2003…,並把自己的初始序列號isn告訴a,以便a可以確認b傳送的每乙個位元組。如果b收到a確認編號為4001,則意味著位元組編號為2001-4000,共2000個位元組已經安全到達。

一句話概括,tcp連線握手,握的是啥?

通訊雙方資料原點的序列號!

以此核心思想我們來分析

二、三、四次握手的過程。

a b

四次握手的過程:

1.1 a 傳送同步訊號syn + a』sinitial sequence number

1.2 b 確認收到a的同步訊號,並記錄a』s isn 到本地,命名 b』s ack sequence number

1.3 b傳送同步訊號syn + b』s initial sequence number

1.4 a確認收到b的同步訊號,並記錄b』s isn 到本地,命名 a』s ack sequence number

很顯然1.2和1.3 這兩個步驟可以合併,只需要三次握手,可以提高連線的速度與效率。

二次握手的過程:

2.1 a 傳送同步訊號syn + a』sinitial sequence number

2.2 b傳送同步訊號syn + b』sinitial sequence number + b』s ack sequence number

這裡有乙個問題,a與b就a的初始序列號達成了一致,這裡是1000。但是b無法知道a是否已經接收到自己的同步訊號,如果這個同步訊號丟失了,a和b就b的初始序列號將無法達成一致。

於是tcp的設計者將syn這個同步標誌位syn設計成占用乙個位元組的編號(fin標誌位也是),既然是乙個位元組的資料,按照tcp對有資料的tcp segment 必須確認的原則,所以在這裡a必須給b乙個確認,以確認a已經接收到b的同步訊號。

有童鞋會說,如果a發給b的確認丟了,該如何?

a會超時重傳這個ack嗎?不會!tcp不會為沒有資料的ack超時重傳。

那該如何是好?b如果沒有收到a的ack,會超時重傳自己的syn同步訊號,一直到收到a的ack為止。

補充閱讀

第乙個包,即a發給b的syn 中途被丟,沒有到達b

a會週期性超時重傳,直到收到b的確認

第二個包,即b發給a的syn +ack 中途被丟,沒有到達a

b會週期性超時重傳,直到收到a的確認

第三個包,即a發給b的ack 中途被丟,沒有到達b

a發完ack,單方面認為tcp為 established狀態,而b顯然認為tcp為active狀態:

a. 假定此時雙方都沒有資料傳送,b會週期性超時重傳,直到收到a的確認,收到之後b的tcp 連線也為 established狀態,雙向可以發包。

b. 假定此時a有資料傳送,b收到a的 data + ack,自然會切換為established 狀態,並接受a的data。

c. 假定b有資料傳送,資料傳送不了,會一直週期性超時重傳syn + ack,直到收到a的確認才可以傳送資料。

四次揮手的過程?

tcp資料丟失時處理機制

tcp協議三次握手 四次揮手

起初,伺服器和客戶端都為closed狀態。在通訊開始前,雙方都得建立各自的傳輸控制塊 tcb 伺服器建立完tcb後遍進入listen狀態,此時準備接收客戶端發來的連線請求。第一次握手 客戶端向服務端傳送連線請求報文段。該報文段的頭部中syn 1,ack 0,seq x。請求傳送後,客戶端便進入syn...

TCP協議三次握手四次揮手

1.什麼是tcp協議 tcp協議是作用在傳輸層的傳輸控制協議 tcp 提供一種面向連線的 可靠的位元組流服務 在乙個 tcp 連線中,僅有兩方進行彼此通訊。廣播和多播不能用於 tcp tcp 使用校驗和,確認和重傳機制來保證可靠傳輸 tcp 給資料分節進行排序,並使用累積確認保證資料的順序不變和非重...

TCP協議三次握手,四次揮手

乙個tcp連線的建立是通過三次握手來實現的 假如伺服器b和客戶機a通訊。當a要和b通訊時,首先a先向b傳送乙個syn標記的包,seq x為這個包的序列號 x一般為1 以此為這個包進行乙個標識,a告訴b請求建立連線。注意 乙個syn包就是僅syn標記設為1的tcp包,只有當b受都a發來的syn包,才可...