TCP詳解(1):簡介與數據包

簡介:
  傳輸控制協議(英語:Transmission Control Protocol, TCP)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能,用戶數據報協議(UDP)是同一層內另一個重要的傳輸協議。
  
  
  
  在因特網協議族(Internet protocol suite)中,TCP層是位於IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像渠道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。

  應用層向TCP層發送用於網間傳輸的、用8位字節表示的數據流,然後TCP把數據流分區成適當長度的報文段(通常受該計算機連接的網絡的數據鏈路層的最大傳輸單元(MTU)的限制)。之後TCP把結果包傳給IP層,由它來通過網絡將包傳送給接收端實體的TCP層。TCP爲了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據包就被假設爲已丟失將會被進行重傳。TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。

  TCP的連接並不是指一條實際的或虛擬的鏈路存在於數據交換的兩端,而是指連接的雙方都維護了一些資源(如輸入輸出緩衝區、多種定時器)以及鏈路狀態的信息,並通過雙方的控制報文交互管理狀態、向用戶提供接口修改這些資源的分配。

  TCP提供了可靠的數據傳輸服務,其採取的措施是對控制報文和數據報文進行確認、並在超時之後進行重傳;並利用滑動窗口協議解決數據數傳亂序、收發雙方進行流量控制。具體來說就是,對於發送方,TCP按照其認爲最合適的長度發送數據報文,並在發出報文之後,啓動一個定時器,等待數據的確認報文,若定時器超時後仍沒有收到確認報文,則重傳該報文;對於接收方,收到數據後,首先檢查報文校驗和,錯誤則直接丟棄該報文,不確認(發送端會注意到這個事實,從而重傳);收到重複報文,丟棄,不確認;通過雙方維護的滑動窗口,TCP會將亂序報文排好序後才提交給上層應用程序。
  需要注意的是,流量控制與擁塞控制並不是同一回事,流量控制的目的在於防止發送端發送大量數據,超過接收端的處理能力,從而導致丟包等;擁塞控制則在於防止網絡中發生擁堵,中間路由器或交換機丟棄報文的情況。

  TCP提供數據流服務,上層應用傳給TCP的數據,TCP並不加以區分,僅僅是按照自己的需求組合、拆分數據,然後傳送給對端,對端TCP協議棧再將數據以發送的順序遞交給上層應用。TCP的數據傳送仍然是以IP報文的方式發送到對端的,每次盡力發送MSS大小的報文,Nagle算法、TCP_CORK等都是爲了對流中報文進行控制。

  TCP本身並不提供報文邊界之類的東西,但提供了緊急數據、PUSH標誌(並沒有提供對外接口)等方式可以模擬報文。通常,TCP數據流的劃分是應用程序的事,應用程序定義好格式,並自己解析。

數據包結構:
  在TCP首部的圖中,我們主要關注以下幾個字段:序號、首部長度、6個標誌位、選項,窗口大小、緊急指針都是以字節單位,這裏並不關注。

  不含選項的TCP首部爲20字節,在首部選項中指明瞭首部有多少個4字節,由於其佔了4位,因此首部最多爲60字節。

  序號字段用來標識TCP數據流中的數據字節流,在建立連接時會以一個ISN進行初始化,每個SYN、FIN等都會消耗掉一個序號。我們並不用太關心這個字段,只是需要知道序號爲32位,在長肥管道(容量較大的網絡中)序號可能會出現迴繞,TCP需要識別。TCP對該字段也進行了相應的擴充(增加選項)。
  
  

  注意上圖中的四個非常重要的東西:
  Sequence Number:包的序號,用來解決網絡包亂序(reordering)問題。
  Acknowledgement Number:ACK序號——用於確認收到,用來解決不丟包的問題。
  Window:又叫Advertised-Window,也就是著名的滑動窗口(Sliding Window),用於解決流量控制。
  Control Bits:包的類型,主要是用於控制TCP的狀態機。

  TCP首部中定義了6個字段,在一個報文中,通常只會出現一個標誌,但也允許多個標誌同時出現。
  URG:緊急指針標誌位。
  ACK:確認序號標誌位,關於ACK有幾點需要注意:a) ACK是累積的,表示接收方已經正確收到了一直到確認序號減一的所有字節;b) TCP通常並不會對每個數據包進行確認,而是採用了捎帶確認和延遲確認的技術,捎帶確認是指將ACK報文合併到數據報文中去,而延遲確認是TCP維持了一個200ms的定時器,在定時器過期前,若有多個數據需要確認,則一塊進行確認,通常是兩個報文確認一次,若200ms到了,仍沒有新數據需要確認,則不再等待,直接確認該報文;c) ACK報文本身並不會被確認,當ACK丟失時,需要依靠對端超時機制發現(後文詳述)。
  PSH:該標誌由TCP自動設置(曾經允許通過接口進行設置,當前多數實現不提供),多數實現在發送者將清空發送緩衝區時設置該標誌,即發送者一次將當前發送緩衝區的數據都發送出去了。
  RST:連接重置標誌位。
  SYN:同步標誌位,用來發起一個新建連接。
  FIN:發送端已經完成了所有的數據發送,不會再發送新的數據,關閉了其發送端,若對端也發送該標誌,則完全關閉連接。

其他:

  

參考:
https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE
technet.microsoft.com
http://www.tcpipguide.com/free/t_TCPConnectionTermination-4.htm
http://www.kuqin.com/shuoit/20141018/342719.html
http://nmap.org/book/tcpip-ref.html

發佈了89 篇原創文章 · 獲贊 9 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章