TCP報頭,建立,釋放過程詳解--筆面試

TCP報頭

傳輸層有兩大作用:分段和提供端口號。
提供兩種服務:面向連接服務TCP和無連接服務UDP
TCP協議是面向連接的,可靠的:確認,重傳,排序,流控
TCP的報文格式:如圖1
在這裏插入圖片描述
    圖1:TCP報頭格式

源端口,標識哪個應用程序發送。 16bit 故端口範圍爲【0,2^16-1】
	0-1023爲系統端口
	1024-49151 登記端口
	49152-65535 客戶端使用端口(客戶端動態使用)
	
目的端口,標識哪個應用程序接收。 
序號字段。TCP鏈接中傳輸的數據流中每個字節都編上一個序號。序號字段的值指的是本報文段所發送的數據的第一個字節的序號。 
確認號,是期望收到對方的下一個報文段的數據的第1個字節的序號,即上次已成功接收到的數據字節序號加1。只有ACK標識爲1,此字段有效。 
數據偏移,即首部長度,指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠,以32比特(4字節)爲計算單位。最多有60字節的首部,若無選項字段,正常爲20字節。 
保留,必須填0。 
URG 1比特 緊急指針有效標識。它告訴系統此報文段中有緊急數據,應儘快傳送(相當於高優先級的數據)。 
ACK 1比特 確認序號有效標識。只有當ACK=1時確認號字段纔有效。當ACK=0時,確認號無效。 
PSH 1比特 標識接收方應該儘快將這個報文段交給應用層。接收到PSH = 1的TCP報文段,應儘快的交付接收應用進程,而不再等待整個緩存都填滿了後再向上交付。 
RST 1比特 重建連接標識。當RST=1時,表明TCP連接中出現嚴重錯誤(如由於主機崩潰或其他原因),必須釋放連接,然後再重新建立連接。 
SYN 1比特 同步序號標識,用來發起一個連接。SYN=1表示這是一個連接請求或連接接受請求。 
FIN 1比特 發端完成發送任務標識。用來釋放一個連接。FIN=1表明此報文段的發送端的數據已經發送完畢,並要求釋放連接。 
窗口:TCP的流量控制,窗口起始於確認序號字段指明的值,這個值是接收端正期望接收的字節數。窗口最大爲65535字節。 
校驗字段,包括TCP首部和TCP數據,是一個強制性的字段,一定是由發端計算和存儲,並由收端進行驗證。在計算檢驗和時,要在TCP報文段的前面加上12字節的僞首部。 
緊急指針,只有當URG標誌置1時緊急指針纔有效。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。緊急指針指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)。 
Options 可變 選項字段。TCP協議最初只規定了一種選項,即最長報文段長度(數據字段加上TCP首部),又稱爲MSS。MSS告訴對方TCP“我的緩存所能接收的報文段的數據字段的最大長度是MSS個字節”。
新的RFC規定有以下幾種選型:選項表結束,無操作,最大報文段長度,窗口擴大因子,時間戳。
	窗口擴大因子:3字節,其中一個字節表示偏移值S。新的窗口值等於TCP首部中的窗口位數增大到(16+S),相當於把窗口值向左移動S位後獲得實際的窗口大小。
	時間戳:10字節,其中最主要的字段是時間戳值(4字節)和時間戳回送應答字段(4字節)。
	選項確認選項: 
填充字段,用來補位,使整個首部長度是4字節的整數倍。 
data 可變 TCP負載。 

TCP三次握手

TCP(傳輸控制協議)的面向連接,是通過三次握手來完成的。
雙方通信之前均處於CLOSED狀態。

  1. 第一次握手:源主機向目標主機發起連接,同步標誌位SYN = 1,以及初始序號SEQ(這是隨時間變化的隨機值),即SYN = 1,seq = X,源主機進入SYN_SENT狀態。
  2. 第二次握手:目標主機收到源主機的連接請求,回覆ACK = 1,以及確認序列號ack = X+1(表示前一個數據段已收到無錯誤),同時向源主機發起連接請求,SYN = 1 ,seq = Y。即第二次握手發送ACK = 1,確認序列號ack = X +1 ,請求SYN = 1,自身序列號seq = Y。目標主機進入SYN_RCVD,源主機收到回覆進入ESTAB_LISHED(TCP連接成功)
  3. 第三次握手:源主機向目標主機回覆ACK = 1 ,回覆確認序列號ack = Y+1,和自身序號seq = X + 1,目標主機接收後進入ESTAB_LISHED狀態。

三次握手具體過程圖如圖2所示。
在這裏插入圖片描述
    圖2:三次握手過程圖
補充知識:未連接隊列
在三次握手協議中,服務器維護一個未連接隊列,該隊列爲每個客戶端的SYN包(syn=j)開設一個條目,該條目表明服務器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在服務器處於SYN_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。

q1 :爲什麼需要三次握手?

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

如果TCP的握手是兩次

  1. 如果client發給server的SYN報文因爲網絡原因,延遲發送。由於client沒有收到server對SYN的確認報文,會重發SYN報文,服務器和回覆ACK,連接建立。數據發送完畢,這條連接被正常關閉。這時,延遲的SYN報文發到了server,server誤以爲這是client重新發送的同步報文,又回覆了一個ACK,和client建立了連接。導致之前連接斷開。如圖3所示
    在這裏插入圖片描述
        圖3:二次握手中發起數據報文延遲

  2. 如果server給client發送的ACK報文因爲網絡原因,報文被丟棄,此時server認爲已經建立好連接,但是client沒有收到確認報文,認爲沒有建立好連接。client會重發SYN報文,此時server已經處於就緒狀態,認爲已經建立好連接。二者掌握信息不匹配。如圖4所示。
    在這裏插入圖片描述
        圖4:二次握手回覆超時情況

如果TCP的握手是四次

–1.client給server發送SYN同步報文; 
–2.server收到SYN後,給client回覆ACK確認報文; 
–3.server給client發送SYN同步報文; 
–4.client給server發送ACK確認報文。 

第2.3步之間,server和client沒有任何的數據交互,分開發送相當於多發了一次TCP報文段,SYN和ACK標識只是TCP報頭的一個標識位。很明顯,這兩步可以合併,從而提高連接的速度和效率。

TCP四次揮手(連接釋放)

雙方通信之前均處於ESTABLISHED狀態。

  1. 源主機向目標主機發送斷開連接請求FIN=1,序列號seq = X。源主機進入FIN_WAIT狀態。
  2. 目標主機收到報文後發出確認報文(ACK = 1,確認序列號ack = X +1,自身序列號seq = y),目標主機進入CLOSE_WAIT狀態。此時,源主機收到回覆後源主機停止發送數據,等待目標主機發送FIN報文,但是目標主機仍然可以發送數據,TCP連接爲半關閉狀態(HALF-CLOSE)。
  3. 目標主機確認無數據發送,向源主機發送釋放報文(FIN = 1,ACK = 1,確認序列號ack = X + 1,自身序列號seq = Z),目標主機進入LAST_ACK狀態。
  4. 源主機接收到釋放報文後,向目標主機回覆確認報文(ACK = 1,確認序列號ack = Z + 1,自身序列號seq = X + 1),發送後,等待一段時間進入CLOSED狀態,目標主機收到回覆後,同樣今天CLOSED狀態。

四次揮手如圖5所示。
在這裏插入圖片描述
    圖5:四次揮手過程圖

q2:爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?

答:因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

q3:爲什麼是四次?

TCP是全雙工的連接,必須兩端同時關閉連接,連接纔算真正關閉。 如果一方已經準備關閉寫,但是它還可以讀另一方發送的數據。發送給FIN結束報文給對方對 方收到後,回覆ACK報文。當這方也已經寫完了準備關閉,發送FIN報文,對方回覆ACK。兩端都關閉,TCP連接正常關閉。

q4:爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

對於TIME_WAIT,則四次揮手應詳細如圖6所示。
在這裏插入圖片描述
    圖6四次揮手詳細過程圖
確保對方收到自己發送的最後一個ACK(因爲對方發送了FIN),如果對方沒有收到自己發送的ACK必定會重新發送FIN,這樣保證4次斷開的完整性。
可以確保每成功建立一個TCP連接時,來自該連接先前化身的老的重複分組都已經在網絡中消逝。

TCP和SCTP的區別

流控制傳輸協議(SCTP,Stream Control Transmission Protocol)是一種在網絡連接兩端之間同時傳輸多個數據流的協議。

SCTP是面向連接、端到端、全雙工、帶有流量和擁塞控制的可靠傳輸協議。
SCTP的連接稱爲關聯。SCTP的關聯通過4次握手建立。相對於TCP的3次握手建立連接,SCTP的關聯能夠抵禦拒絕服務(DoS)攻擊,從而提高了安全性。數據只有在關聯建立之後與關聯關閉之前纔可發送。SCTP的關聯通過3次握手關閉,不支持類似TCP的半關閉連接。也就是在任何一方關閉關聯後,對方即不再發送數據。
SCTP的特點:

  1. 面向消息的傳輸
    SCTP是一種面向消息的傳輸協議,從上層應用傳遞下來的數據以消息的形式傳輸。SCTP提供消息的定界功能。在接收端,數據以消息的形式遞交。爲便於傳輸,SCTP提供消息的拆分和組裝,以及消息的捆綁傳輸功能。SCTP的數據傳輸基本單位是塊。
  2. 支持多穴主機。
    SCTP關聯的每個端點都可以擁有多個網絡層地址。SCTP可以支持不同的網絡層協議,爲描述方便,本文以IP作爲網絡層協議來說明,即每個SCTP端點可以擁有多個IP地址用於數據傳輸。對多穴主機的支持是爲了在網絡級提高容錯能力。
  3. 多流
    SCTP消息在不同的流內發送,這也是流傳輸控制協議名稱的由來。從發送端到接收端可以有多個流,在同一流內發送的消息有序,而不同流之間的消息無序,因此不同流之間的消息傳輸是相對獨立的。在某一個流內由於數據傳輸失敗而引起的阻塞不會影響其他流的消息遞交。
  4. 流量、擁塞和錯誤的控制
    SCTP仍然採用類似TCP的流量控制和擁塞控制機制,但又有所增強。整個傳輸分爲慢啓動階段和擁塞避免階段。與TCP不同的是,SCTP的擁塞窗口初始值可以是2個MTU,可以比TCP獲得更快的窗口增長。SCTP的擁塞控制採用了選擇確認(SACK)快速重傳和快速恢復機制,是TCP各種主流改進機制的集成。但是由於SCTP採用了塊結構和控制塊機制,可以比TCP更大地提升傳輸性能。

q5:TPC的syn攻擊的過程,怎麼防禦?

過程:syn攻擊是基於TCP連接的三次握手的半連接,屬於DOS攻擊。攻擊者發送完第一次握手後,服務器維護一個未連接隊列併發送回復,但是攻擊者不發送第三次握手的ack,造成服務器會等待,浪費CPU和內存,在半連接存活時間內有大量的半連接就會造成服務器無法服務現象。
防禦:減小超時時間;SYN網關和SYN代理;增大最大半連接數;SYN cookies技術
SYN Cookie是對TCP服務器端的三次握手協議作一些修改,專門用來防範SYN Flood攻擊的一種手段。它的原理是,在TCP服務器收到TCP SYN包並返回TCP SYN+ACK包時,不分配一個專門的數據區,而是根據這個SYN包計算出一個cookie值。在收到TCP ACK包時,TCP服務器在根據那個cookie值檢查這個TCP ACK包的合法性。如果合法,再分配專門的數據區進行處理未來的TCP連接。

q6:TCP協議在數據傳輸過程中收發雙方是如何保證數據包的可靠性的?

1.爲了保證數據包的可靠傳遞,發送方必須把已發送的數據包保留在緩衝區;
2.併爲每個已發送的數據包啓動一個超時定時器;
3.如在定時器超時之前收到了對方發來的應答信息(可能是對本包的應答,也可以是對本包後續包的應答),則釋放該數據包占用的緩衝區;
4.否則,重傳該數據包,直到收到應答或重傳次數超過規定的最大次數爲止。
5.接收方收到數據包後,先進行CRC校驗,如果正確則把數據交給上層協議,然後給發送方發送一個累計應答包,表明該數據已收到,如果接收方正好也有數據要發給發送方,應答包也可放在數據包中捎帶過去。

q7:TCP是如何通過滑動窗口協議實現流量控制和擁塞控制的?

在擁塞控制上,採用廣受好評的TCP擁塞控制算法(也稱AIMD算法)。該算法主要包括四個主要部分:
(1)慢啓動
每當建立一個TCP連接時或一個TCP連接發生超時重傳後,該連接便進入慢啓動階段。進入慢啓動後,TCP實體將擁塞窗口的大小初始化爲一個報文段,即:cwnd=1。此後,每收到一個報文段的確認(ACK),cwnd值加1,即擁塞窗口按指數增加。當cwnd值超過慢啓動闡值(sshterhs)或發生報文段丟失重傳時,慢啓動階段結束。前者進入擁塞避免階段,後者重新進入慢啓動階段。
(2)擁塞避免
在慢啓階段,當cwnd值超過慢啓動闡值(ssthresh)後,慢啓動過程結束,TCP連接進入擁塞避免階段。在擁塞避免階段,每一次發送的cwnd個報文段被完全確認後,纔將cwnd值加1。在此階段,cwnd值線性增加。
(3)快速重傳
快速重傳是對超時重傳的改進。當源端收到對同一個報文的三個重複確認時,就確定一個報文段已經丟失,因此立刻重傳丟失的報文段,而不必等到重傳定時器(RTO)超時。以此減少不必要的等待時間。
(4)快速恢復
快速恢復是對丟失恢復機制的改進。在快速重傳之後,不經過慢啓動過程而直接進入擁塞避免階段。每當快速重傳後,置sshtesrh=cwnd/2、ewnd=ssthresh+3。此後,每收到一個重複確認,將cwnd值加1,直至收到對丟失報文段和其後若干報文段的累積確認後,置cwnd=ssthesrh,進入擁塞避免階段。

q8. 描述TCP和UDP的區別?

1.TCP是基於連接的,提供可靠傳輸;而UDP是基於無連接的,不提供可靠傳輸;
2.UDP報文是面向數據報文的,TCP是面向數據流的;
3.UDP的報文簡單,因此傳輸效率高;
4.TCP只能提供點到點通信,但是UDP支持單播、組播和廣播.

q9.TCP有哪些計時器?

  1. 重傳計時器:Retransmission Timer
    重傳定時器:爲了控制丟失的報文段或丟棄的報文段,也就是對報文段確認的等待時間。當TCP發送報文段時,就創建這個特定報文段的重傳計時器,可能發生兩種情況:若在計時器超時之前收到對報文段的確認,則撤銷計時器;若在收到對特定報文段的確認之前計時器超時,則重傳該報文,並把計時器復位;

  2. 堅持計時器:persistent timer
    專門爲對付零窗口通知而設立的。當發送端收到零窗口的確認時,就啓動堅持計時器,當堅持計時器截止期到時,發送端TCP就發送一個特殊的報文段,叫探測報文段,這個報文段只有一個字節的數據。探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他部分數據的確認時這個序號也被忽略。探測報文段提醒接收端TCP,確認已丟失,必須重傳。
    堅持計時器的截止期設置爲重傳時間的值,但若沒有收到從接收端來的響應,則發送另一個探測報文段,並將堅持計時器的值加倍和並復位,發送端繼續發送探測報文段,將堅持計時器的值加倍和復位,知道這個值增大到閾值爲止(通常爲60秒)。之後,發送端每隔60s就發送一個報文段,直到窗口重新打開爲止;

  3. 保活計時器:keeplive timer
    每當服務器收到客戶的信息,就將keeplive timer復位,超時通常設置2小時,若服務器超過2小時還沒有收到來自客戶的信息,就發送探測報文段,若發送了10個探測報文段(沒75秒發送一個)還沒收到響應,則終止連接。

  4. 時間等待計時器:Time_Wait Timer
    在連接終止期使用,當TCP關閉連接時,並不認爲這個連接就真正關閉了,在時間等待期間,連接還處於一種中間過度狀態。這樣就可以時重複的fin報文段在到達終點後被丟棄,這個計時器的值通常設置爲一格報文段壽命期望值的兩倍。

今天的分享就到這裏,對你有幫助請你給博主點個贊把,關注博主,看見更多!

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