挑戰408——一週網絡——運輸層(3)

TCP協議

TCP協議的主要特點

對比UDP協議,TCP協議就要複雜很多了。對比UDP協議,TCP協議有以下幾點不同:

  1. TCP是面向連接的傳輸層協議。也就是說,使用TCP協議的通信雙方事先就要建立連接,在整個連接過程當中控制個管理連接,並在通信之後釋放整個連接。
  2. TCP連接只能是一對一的。也就是每一條TCP連接只能是兩個端點。
  3. TCP提供的是可靠交付服務。也就是通過TCP連接傳輸的數據,無差錯,不丟失,不重複,並按序到達。
  4. TCP提供全雙工通信。即允許通信雙方的進程,在任何時候都可以發送數據。這就要求通信雙方要有自己的發送和接收緩衝區,用來臨時存放雙方通信的數據。
  5. TCP是面向字節流的。這部分後面再說

TCP的連接

每一條TCP連接有兩個端點,這個端點叫套接字,其表示方法是IP地址 + 端口號。
在這裏插入圖片描述
這樣,同一個IP可以有多個不同的TCP連接(IP相同,端口號不一致),同一個端口號也可以出現在多個TCP連接當中。

TCP首部

TCP的首部前20字節是固定的,後面有4n個字節是可選的。也就是說,TCP的首部最短是20字節。
在這裏插入圖片描述

  • 源端口和目的端口:略。哥佔2個字節(一個字節8位)。
  • 序號:在TCP傳送的每一個字節流中的字節都按順序編號,佔4個字節,範圍爲[0 - (2^32)-1]。上一篇中的連續ARQ協議中,窗口數據的序號就是這樣編的。
  • 確認號即期望收到對方下一個報文段的第一個數據字節序號。即若發送方收到確認號 =N的確認號,則表明N-1之前的數據都已經正常被對方接收,接下來發送N-1之後的報文。一般的,當序列號被重複使用的時候,可以認爲舊的報文段早已經通過網絡到達終點了。
  • 數據偏移:即TCP報文的數據起始處距離TCP報文起始處的距離(也就是TCP首部的長度)。數據偏移的長度是以4字節爲單位的,因此數據偏移的最大能表示的十進制數是15,也就是說TCP首部最大長度爲60字節
  • 緊急URG:當URG爲1的時候,表示此報文有緊急數據,需要優先傳送。於是發送方就把緊急數據插入到本報文段數據的最前面。需要與緊急指針配合使用。
  • 確認ACK:當且僅當ACK =1的時候確認有效,ACK = 0時無效。TCP規定,連接建立後,TCP的所有ack確認報文都應該置爲1.
  • PUSH位:略
  • 復位RST:當RST = 1的時候,表示這TCP連接過程出現錯誤,需要重置連接。
  • 同步SYN:在建立連接時用來同步序號。當SYN = 1,且ACK = 0的時候,表明這是一個請求連接的報文。若對方同意連接,則回覆響應保衛SYN=1,ACK = 1. 總之,SYN=1,表明這是一個請求連接或者接受連接的報文。
  • 終止FIN:當FIN = 1的時候,表明要求釋放連接。
  • 窗口:表明現在允許對方發送的數據量,窗口值在時刻動態變化。

其他字段略過。

TCP的連接管理

TCP是面向連接的協議,而TCP運輸連接的建立都需要建立和釋放連接。對於TCP連接而言,運輸過程需要下面三個過程:建立連接數據傳送釋放連接。TCP連接採用C/S模式,發起連接建立的客戶端稱爲客戶,而被動等待連接的稱爲服務器。

三次握手

TCP建立連接的過程稱爲握手。建立連接的過程需要客戶端與服務端之間交換三次TCP報文段(這就是所謂的三次握手)。
在這裏插入圖片描述
初始狀態,雙方都處於關閉狀態。現在模擬A向B發送TCP連接請求的過程:

  1. A主動打開連接,B被動打開連接。(此時B處於Listen,監聽狀態)
  2. A打算與B 建立TCP連接,於是向B發出請求連接報文段。根據剛剛學習的首部,這個時候SYN = 1,Seq = x。此報文不攜帶任何數據,但消耗一個序號。同時爲TCP連接分配緩存空間和變量
  3. B收到後,若同意連接,於是向A 發送連接確認。此時SYN = 1 ,ACK = 1,seq=y,ack = x + 1. 注意,這裏的ACK是TCP首部字段的確認ACK,而ack是確認號,也就是下次要發送的序號。此報文不攜帶任何數據,但消耗一個序號。同時爲TCP連接分配緩存空間和變量
  4. A收到B的確認後,還要給B 發送對B確認的確認。此時ACK = 1,ack = y+1.seq = Y+1.此時連接建立。可以正常傳輸數據。不帶數據可以不消耗一個序號

以上步驟除去1,就是TCP三次握手的過程。
考慮這樣一種情況,如果A發送給B的請求連接的報文超過一段時間都還沒有收到B的確認(即走到步驟2這一步走不下去了),根據我們之前的停止等待協議,我們就認爲這個報文丟失了,這裏應該再次給B發送連接請求。這是AB建立正常的TCP連接,然後傳輸數據,釋放連接。倘若此時,A的請求連接不是丟失,而是遲到了,當A的請求到達B的時候,AB早已完成通信,此時,B會認爲A再次請求連接,並且B給A發送了確認。但是A此時並沒有請求通信,如果此時A不在向B發送確認的確認(也就是不要第4步),這樣服務器只能苦苦等待A的請求,白白浪費服務器資源

四次握手

TCP連接的釋放需要進行4次的握手。這裏有個概念,TCP是全雙工通信,可以看成一條TCP連接上有兩條數據通路
通信結束後通信雙方都可以結束通信。這裏模擬一下A主動結束通信的過程。
在這裏插入圖片描述

  1. 通信結束,A主動向B發送連接釋放報文。並停止發送信息,主動關閉TCP連接(由於全雙工通信,對方仍可以給A發送信息)。此時 FIN = 1,seq = u,其中u的值是等於之前發過的數據最後一個字節的序號 + 1.TCP規定,FIN報文要消耗掉一個序號。
  2. 服務器收到A發來的關閉連接的報文,於是向A發出確認。此時確認號ack = u+1,報文段自己的序號seq = v(這個值等於服務器之前傳送過的最後一個數值序號+1)。然後B進入 close -Wait狀態(半關閉狀態)。此時客戶端到服務器這個方向的連接關閉了。(但是服務器到客戶端的仍未關閉,服務器還是可以向客戶端發送數據)。
  3. 若此時B已經沒有要向A發送的數據了,此時,B發出釋放連接報文。置FIN = 1.(此步驟跟1相似,不贅述)。
  4. 客戶端收到B發來的釋放連接時,還必須發出確認。具體參數的值見圖。此時服務器進入TIME-WAIT狀態。這個狀態表明連接還沒完全釋放,必須等候一段時間,這個時間爲時間等待計時器2MSL。A才進入關閉連接狀態。

關於序號的分析,個人感覺還是自己分析一遍。填寫一遍纔會印象深刻。

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