TCP 技術白皮書
摘 要:
本文介紹了 TCP 工作原理與幀格式細節。
關鍵詞:
TCP, UDP, 客戶端, 服務器
TCP:Transmission Control Protocol 傳輸控制協議
UDP :User Data Protocol 用戶數據報協議
MSS:Maximum Segment Size 最大報文段長度
ISN:Initial Sequence Number 初始序號
AIMD :Additive Increase Multiplicative Decrease 加性增,乘性減
RTT:Round-Trip Time 往返時延
MTU:Maximum Transmission Unit 最大傳輸單元
ASAP:As Soon As Possible 盡快
IANA:Internet Assigned Numbers Authority 互聯網數字分配機構
DDOS:Distributed Denial of service 分布式拒絕服務
1.概述
TCP( Transmission Control Protocol),即傳輸控制協議。TCP 是一種面向連接(連接導向)的、可靠的、基于字節流的運輸層通信協議。在簡化的計算機網絡 OSI 模型中,它完成第四層傳輸層所指定的功能, UDP 是同一層內另一個重要的傳輸協議。
面向連接是指一次正常的 TCP 傳輸需要通過在 TCP 客戶端和 TCP 服務器建立特定的虛電路連接來完成,該過程通常被稱為“三次握手”。可靠性可以通過很多種方法來提供保證,在這里我們關心的是數據序列和確認。TCP 通過數據分段( Segment)中的序列號保證所有傳輸的數據可以在遠端按照正常的次序進行重組,而且通過確認保證數據傳輸的完整性。總之,要通過 TCP 傳輸數據,必須在兩端主機之間建立連接。
1.1 技術特點
①面向連接的傳輸;
②端到端的通信;
③高可靠性,確保傳輸數據的正確性,不出現丟失或亂序;
④全雙工方式傳輸;
⑤采用字節流方式,即以字節為單位傳輸字節序列;
⑥緊急數據傳送功能。
2.TCP 介紹
2.1 TCP 的工作原理
圖 1 因特網協議族示意圖
在因特網協議族( Internet protocol suite)中, TCP 層是位于 IP 層之上,應用層之下的傳輸層。不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是 IP 層不提供這樣的流機制,而是提供不可靠的包交換。
應用層向 TCP 層發送用于網間傳輸的、用 8 位字節表示的數據流,然后 TCP 把數據流分割成適當長度的報文段( 長度通常受該計算機連接的網絡的數據鏈路層的最大傳送單元—MTU 的限制)。之后 TCP 把結果包傳給 IP 層,由它來通過網絡將包傳送給接收端實體的 TCP層。TCP 為了保證不發生丟包,就給每個字節一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的字節發回一個相應的確認( ACK);如果發送端實體在合理的往返時延( RTT)內未收到確認,那么對應的數據(假設丟失了)將會被重傳。
2.2 TCP 幀格式
中間的標志位就是用于協議的一些機制的實現的比特位, 有 6 比特,它們依次如下:URG、ACK、 PSH、 RST、 SYN、 FIN
①URG 表示緊急指針字段有效;
②ACK 置位表示確認號字段有效;
③PSH 表示當前報文需要請求推( push)操作;
④RST 置位表示復位 TCP 連接;
⑤SYN 用于建立 TCP 連接時同步序號;
⑥FIN 用于釋放 TCP 連接時標識發送方比特流結束
A.源端口和目的端口:各為 16 比特,用于表示應用層的連接。源端口表示產生數據包的應用層進程,而目的端口則表示數據包所要到達的目的進程。
B.序列號:為 32 比特,表示數據流中的字節數。序列號為首字節在整個數據流中的位置。初始序列號隨機產生,并在連接建立階段予以同步。
C.確認號:表示序號為確認號減去 1 的數據包及其以前的所有數據包已經正確接收,也就是說他相當于下一個準備接收的字節的序號。
D.頭部信息:4 比特,用于指示數據起始位置。由于 TCP 包頭中可選項的長度可變,因此整個包頭的長度不固定。如果沒有附加字段,則 TCP 數據包基本長度為 20 字節。
E.窗口:16 位,表示源端主機在請求接收端等待確認之前需要接收的字節數。它用于流量控制,窗口大小根據網絡擁塞情況和資源可用性進行增減。
F.校驗位:16 位。用于檢查 TCP 數據包頭和數據的一致性。
G.緊急指針:16 位。當 URG 碼有效時只向緊急數據字節。
H.可選項:存在時表示 TCP 包頭后還有另外的 4 字節數據。TCP 常用的選項為最大數據包(并非整個 TCP 報文) MSS, MSS 默認值是 536。每一個 TCP 段都包含一個固定的 20 字節的段頭。TCP 段頭由 20 字節固定頭和一些可選項組成。實際數據部分最多可以有 65495 ( 65535-20-20=65495)字節。
2.3 TCP 連接的建立與終止
TCP 協議通過三個報文段完成連接的建立,這個過程稱為三次握手(three-way handshake),過程如圖 3 所示,而終止一個連接要經過四次握手,這是由 TCP 的半關閉造成的,具體過程如圖 4 所示。
2.4 相關術語
2.4.1 滑動窗口協議
TCP 滑動窗口技術通過動態改變窗口大小來調節兩臺主機間數據傳輸。每個 TCP/IP 主機支持全雙工數據服務, 因此 TCP 有兩個滑動窗口:一個用于接收數據,另一個用于發送數據。該協議允許發送方在停止并等待確認前可以連續發送多個分組。由于發送方不必每發一個分組就停下來等待確認,因此該協議可以加速數據的傳輸。
滑動窗口機制為端到端設備間的數據傳輸提供了可靠的流量控制機制。然而, 它只能在源端設備和目的端設備起作用, 當網絡中間設備(如路由器)發生擁塞時, 滑動窗口機制將不起作用。此時我們可以用ICMP的源抑制機制進行擁塞管理。
圖 5 滑動窗口示意圖
滑動窗口流量控制的實現方法:
假定發送方向接收方發送一定數量(如窗口大小為 3,就發送 3 個)的數據包,接收方收到數據包,向源設備發送確認報文;發送方收到確認報文, 向接收方發送同樣數量的數據包。
如果接收方由于某種原因(例如緩沖區數據溢出等)沒有收到全部或部分數據包, 則不向發送方發送后續的確認報文, 發送方通過調節窗口大小, 降低數據傳送速率, 重發數據包。當接收方設備要求窗口大小為 0, 表明接收方已經接收了全部數據, 或者接收方應用程序沒有時間讀取數據, 要求暫停發送。發送接收到攜帶窗口大小為 0 的確認, 停止這一方向的數據傳輸。
2.4.2 AIMD
AIMD 是 TCP/IP 模型中,運輸層為解決擁塞控制的一個方法,即:加性增,乘性減,或者叫做“和式增加,積式減少”。
當 TCP 發送方感受到端到端路徑無擁塞時就線性的增加其發送速度,當察覺到路徑擁塞時就乘性減小其發送速度。
2.4.3 端口號
TCP 段結構中端口地址都是 16 比特,可以有在 0~65535 范圍內的端口號。對于這 65536個端口號有以下的使用規定:
①端口號小于 256 的定義為常用端口,服務器一般都是通過常用端口號來識別的。任何TCP/IP 實現所提供的服務都用 1~1023 之間的端口號,是由 IANA 來管理的;
②客戶端只需保證該端口號在本機上是惟一的就可以了。客戶端口號因存在時間很短暫又稱臨時端口號;
③大多數 TCP/IP 實現給臨時端口號分配 1024~5000 之間的端口號。大于 5000 的端口號是為其他服務器預留的。
2.4.4 TCP半開連接數
半開 TCP 連接,簡單地說就是發送了 TCP 連接請求,但還沒有得到對方應答的狀態(實際上要復雜些),也就是連接尚未完全建立起來,雙方還無法進行通信交互的狀態。TCP 半開連接數最好不超過 50。沒有必要設置得太大, 每一個半開連接都會讓系統引入額外的開銷,如果半開連接數設置過大,將導致系統崩潰還有其它很多 DDoS 攻擊手段。限制 TCP 半開連接數,可以有效地防止 DDoS 攻擊。
2.5 TCP 協議和 UDP 協議的區別
①TCP 協議面向連接, UDP 協議面向非連接;
②TCP 協議傳輸速度慢, UDP 協議傳輸速度快;
③TCP 協議保證數據順序, UDP 協議不保證;
④TCP 協議保證數據正確性, UDP 協議可能丟包;
⑤TCP 協議對系統資源要求多, UDP 協議要求少