TCP

TCP

傳輸控制協議
傳輸控制協議是一個 TCP/IP 組中能夠實現可靠數據傳送的傳輸層協議,并通過順序響應能實現對應用程序的的虛拟連接服務,在必要的時候進行包轉發。與 IP 協議相結合,TCP 代表了網絡協議的核心。大多數網絡應用程序是在相同的機器上運行的,計算機上必須能确保目的地的正确軟件應用程序從源地址處獲得數據包,以及源計算機上的正确應用程序的回複獲得選擇路經。這一過程是通過使用 TCP 的“端口号”完成的。網絡IP地址和端口号的連接要達到唯一的标識,我們稱之為“套接字”或“端點”。為了可靠通信,TCP 在端點間建立了連接或虛拟電路。TCP 服務提供了數據流傳輸、可靠行、有效流控制、全雙工操作和多路複用技術等。關于數據流傳輸,TCP 發送一個由序列号定義的無結構的字節流。這對應用程序有利,因為在被送出 TCP 之前應用程序不需要劃分成塊,TCP 可以将字節整合成字段,然後發送給IP.TCP 是面向連接的端到端的可靠協議,并保證傳送數據包的順序,而順序是用一個響應序号來保證的,這個響應序号告訴接收者發送者期望的下一個包。如果在規定時間内,沒有收到關于這個包的确認響應,則需要重新發送此包。TCP 的可靠機制允許設備處理丢失、删除及讀錯的包。暫停機制允許設備監測丢失包并請求重發。TCP 提供了有效流控制。當向發送者返回發送确認響應,接收 TCP 進程就會暗示最高序列号,它能接收并保證不會發生溢出。[1]
    網站名稱: 别名: 創始人: 總部地點: 主辦單位: 網站類型: 網站口号: ICP備案号: 中文名:傳輸控制協議 外文名:Transmission Control Protocol 簡稱:TCP 行業标準:IETF RFC 793 應用範圍I:nternet

網絡協議

功能

當應用層向TCP層發送用于網間傳輸的、用8位字節表示的數據流,TCP則把數據流分割成适當長度的報文段,最大傳輸段大小(MSS)通常受該計算機連接的網絡的數據鍊路層的最大傳送單元(MTU)限制。之後TCP把數據包傳給IP層,由它來通過網絡将包傳送給接收端實體的TCP層。

TCP為了保證報文傳輸的可靠,就給每個包一個序号,同時序号也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的字節發回一個相應的确認(ACK);如果發送端實體在合理的往返時延(RTT)内未收到确認,那麼對應的數據(假設丢失了)将會被重傳。

在數據正确性與合法性上,TCP用一個校驗和函數來檢驗數據是否有錯誤,在發送和接收時都要計算校驗和;同時可以使用md5認證對數據進行加密。

在保證可靠性上,采用超時重傳和捎帶确認機制。

在流量控制上,采用滑動窗口協議,協議中規定,對于窗口内未經确認的分組需要重傳。

在擁塞控制上,采用廣受好評的TCP擁塞控制算法(也稱AIMD算法)。該算法主要包括三個主要部分:1)加性增、乘性減;2)慢啟動;3)對超時事件做出反應。

實行标準

TCP/IP(Transmission Control Protocol/Internet Protocol) 即傳輸控制協議/網間協議,是一個工業标準的協議集,它是為廣域網(WAN)設計的。它是由ARPANET網的研究機構發展起來的。

TCP/IP的标準在一系列稱為RF

C的文檔中公布。文檔由技術專家、特别工作組、或RFC編輯修訂。公布一個文檔時,該文檔被賦予一個RFC編号,如RFC959(FTP的說明文檔)、RFC793(TCP的說明文檔)、RFC791(IP的說明文檔)等。最初的RFC一直保留而從來不會被更新,

如果修改了該文檔,則該文檔又以一個新号碼公布。因此,重要的是要确認你擁有了關于某個專題的最新RFC文檔。通常在RFC的開頭部分,有相關RFC的更新(update)、排錯(errata)、作廢(obsolete)信息,提示讀者信息的時效性。

首部格式

TCP的首部格式圖右圖所示:

---Source Port是源端口,16位。

---Destination Port是目的端口,16位。

---Sequence Number是發送數據包中的第一個字節的序列号,32位。

---Acknowledgment Number是确認序列号,32位。

---Data Offset是數據偏移,4位,該字段的值是TCP首部(包括選項)長度除以4。

---标志位:6位,URG表示Urgent Pointer字段有意義:

ACK表示Acknowledgment Number字段有意義

PSH表示Push功能,RST表示複位TCP連接

SYN表示SYN報文(在建立TCP連接的時候使用)

FIN表示沒有數據需要發送了(在關閉TCP連接的時候使用)

Window表示接收緩沖區的空閑空間,16位,用來告訴TCP連接對端自己能夠接收的最大數據長度。

---Checksum是校驗和,16位。

---Urgent Pointers是緊急指針,16位,隻有URG标志位被設置時該字段才有意義,表示緊急數據相對序列号(Sequence Number字段的值)的偏移。

連接建立

TCP是因特網中的傳輸層協議,使用三次握手協議建立連接。當主動方發出SYN連接請求後,等待對方回答

SYN+ACK,并最終對對方的 SYN 執行 ACK 确認。這種建立連接的方法可以防止産生錯誤的連接,TCP使用的流量控制協議是可變大小的滑動窗口協議。

TCP三次握手的過程如下:

客戶端發送SYN(SEQ=x)報文給服務器端,進入SYN_SEND狀态。

服務器端收到SYN報文,回應一個SYN(SEQ=y)ACK(ACK=x+1)報文,進入SYN_RECV狀态。

客戶端收到服務器端的SYN報文,回應一個ACK(ACK=y+1)報文,進入Established狀态。

三次握手完成,TCP客戶端和服務器端成功地建立連接,可以開始傳輸數據了。

連接終止

建立一個連接需要三次握手,而終止一個連接要經過四次握手,這是由TCP的半關閉(half-close)造成的。具體過程如下圖所示。

(1)某個應用進程首先調用close,稱該端執行“主動關閉”(active close)。該端的TCP于是發送一個FIN分節,表示數據發送完畢。

(2)接收到這個FIN的對端執行“被動關閉”(passive close),這個FIN由TCP确認。

注意:FIN的接收也作為一個文件結束符(end-of-file)傳遞給接收端應用進程,放在已排隊等候該應用進程接收的任何其他數據之後,因為,FIN的接收意味着接收端應用進程在相應連接上再無額外數據可接收。

(3)一段時間後,接收到這個文件結束符的應用進程将調用close關閉它的套接字。這導緻它的TCP也發送一個FIN。

(4)接收這個最終FIN的原發送端TCP(即執行主動關閉的那一端)确認這個FIN。

既然每個方向都需要一個FIN和一個ACK,因此通常需要4個分節。

注意:

(1)“通常”是指,某些情況下,步驟1的FIN随數據一起發送,另外,步驟2和步驟3發送的分節都出自執行被動關閉那一端,有可能被合并成一個分節。

(2)在步驟2與步驟3之間,從執行被動關閉一端到執行主動關閉一端流動數據是可能的,這稱為“半關閉”(half-close)。

(3)當一個Unix進程無論自願地(調用exit或從main函數返回)還是非自願地(收到一個終止本進程的信号)終止時,所有打開的描述符都被關閉,這也導緻仍然打開的任何TCP連接上也發出一個FIN。

無論是客戶還是服務器,任何一端都可以執行主動關閉。通常情況是,客戶執行主動關閉,但是某些協議,例如,HTTP/1.0卻由服務器執行主動關閉。

服務類型

不管怎樣,TCP/IP是一個協議集。為應用提供一些"低級"功能,這些包括IP、TCP、UDP。其它是執行特定任務的應用協議,如計算機間傳送文件、發送電子郵件、或找出誰注冊到另外一台計算機。因此,最重要的"商業"TCP/IP服務有:

FTP文件傳送

(File Transfer)

文件傳送協議FTP(File TransferProtocol)允許用戶從一台計算機到另一台取得文件,或發送文件到另外一台計算機。從安全性方面考慮,需要用戶指定一個使用其它計算機的用戶名和口令。它不同于NFS(Network File System)和Netbios協議。一旦你要訪問另一台系統中的文件,任何時刻都要運行FTP。而且你隻能拷貝文件到自己的機器中去來使用它。RFC 959中有關于FTP的詳盡說明。

RLogin遠程登錄

(Remote login)

網絡終端協議TELNET允許用戶登錄到網絡上任一計算機上。你可啟動一個遠程進程連接到指定的計算機,直到進程結束,期間你所鍵入的内容被送到所指定的計算機。值得注意的是,這時你實際上是與你的計算機進行對話。TELENET程序使得你的計算機在整個過程中不見了,所敲的每一個字符直接送到所登錄的計算機系統。一般的說,這種遠程連接是通過類式撥号連接的,也就是,撥通後,遠程系統提示你輸入注冊名和口令,退出遠程系統,TELNET程序也就退出,你又與自己的計算機對話了。微電腦中的TELNET工具一般含有一個終端仿真程序。

SMTPPOP3電子郵件

(Mail)

允許你發送消息給其它計算機的用戶。通常,人們趨向于使用指定的一台或兩台計算機。計算機郵件系統隻需你簡單地往另一用戶的郵件文件中添加信息,但随之産生問題,使用的微電腦的環境不同,還有重要的是宏(MACRO)不适合于接受計算機郵件。為了發送電子郵件,郵件軟件希望連接到目的計算機,如果是微電腦,也許它已關機,或者正在運行另一個應用程序呢?出于這種原因,通常由一個較大的系統來處理這些郵件,也就是一個一直運行着的郵件服務器。郵件軟件成為用戶從郵件服務器取回郵件的一個界面。

任何一個的TCP/IP工具提供上述這些服務。這些傳統的應用功能在基于TCP/IP的網絡中一直扮演非常重要的角色。目前情況有點變化,這些功能使用也發生變化,如老系統的改造,計算機的發展等,出現了各種安裝版本,如:微電腦、工作站、小型機、和巨型機等。

這些計算機好像在一起完成指定的任務,盡管有時看來像是隻用到某個指定的計算機,但它是通過網絡得到其它計算機系統的服務。服務器Server是為網絡上其它提供指定服務的系統,客戶Client是得到這種服務的另外計算機系統。(值得注意的是,服務/客戶機不一定是不同的計算機,有可能是同一計算機中的不同運行程序)。以下是幾種目前計算機上典型的一些服務,這些服務可在TCP/IP網絡上調用。

NFS網絡文件系統

(Network File System)

這種訪問另一計算機的文件的方法非常接近于流行的FTP。網絡文件系統提供磁盤或設備服務,而無需特定的網絡實用程序來訪問另一系統的文件。可以簡單地認為它是一個外加的磁盤驅動器。這種額外"虛拟"磁盤驅動器就是其它計算機系統的磁盤。這非常有用。你隻需加大幾台計算機的磁盤容量,就可使網絡上其他用戶訪問它,且不說所帶來的經濟效益,它還能夠讓幾台工作的計算機共享相同的文件。它也使得系統維護和備份易如反掌,因為再不必為大量的不同機器上的文件的升級和備份而擔心。

遠程打印

(Remote Printing)

允許你使用其它計算機上的打印機,好像這些打印機直接連到你的計算機上。

遠程執行

(Remote Execution)

允許你請求運行在不同計算機上的特殊程序。當你在一個很小的計算機上運行一個需要大機系統資源的程序時,這時候遠程執行非常有用。

名字服務器

(Name Servers)

在一個大的系統安裝過程中,需要用到大量的各種名字,包括用戶名、口令,姓名、網絡地址、帳号等,管理這些是非常令人乏味的。因此将這些數據形成數據庫,放到一個小系統中去,其它系統通過網絡來訪問這些數據。

終端服務器

(Terminal Servers)

很多的終端連接安裝不再直接将終端連到計算機,取而代之的是,将他們連接到終端服務器上。終端服務器是一個小的計算機,它隻需知道怎樣運行TELNET(或其它一些完成遠程登錄的協議)。如果你的終端想連上去,隻用鍵入要連的計算機名就可。通常有可能同時有幾個這種連接,這時終端服務器采用快速開關技術來切換。

上述所描述的一些協議是由Berkeley,Sun,或其它組織定義的。因此,它們不是互聯網協議集(InternetProtocol Suite)的一部分,隻是使用到TCP/IP的工具,如同一般的TCP/IP應用協議。因為協議的定義不一緻,并且商業支持的TCP/IP工具廣泛應用,也許會把這些協議作為互聯協議集中的一部分。上述列出的隻是基于TCP/IP部分服務的一些簡單例子,但包含了一些"主要"的應用。

首部圖

下圖展示了TCP首部的數據格式。如果不計任選(Options)字段,那麼,它的大小是20個字節。

可靠性實現

可靠性

TCP提供一種面向連接的、可靠的字節流服務。面向連接意味着兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數據包之前必須先建立一個TCP連接。這一過程與打電話很相似,先撥号振鈴,等待對方摘機說“喂”,然後才說明是誰。在一個TCP連接中,僅有兩方進行彼此通信。廣播和多播不能用于TCP。

TCP通過下列方式來提供可靠性:

1.應用數據被分割成TCP認為最适合發送的數據塊。這和UDP完全不同,應用程序産生的數據長度将保持不變。由TCP傳遞給IP的信息單位稱為報文段或段(segment)。

2.當TCP發出一個段後,它啟動一個定時器,等待目的端确認收到這個報文段。如果不能及時收到一個确認,将重發這個報文段。當TCP收到發自TCP連接另一端的數據,它将發送一個确認。TCP有延遲确認的功能,在此功能沒有打開,則是立即确認。功能打開,則由定時器觸發确認時間點。

3.TCP将保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP将丢棄這個報文段和不确認收到此報文段(希望發端超時并重發)。

4.既然TCP報文段作為IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP将對收到的數據進行重新排序,将收到的數據以正确的順序交給應用層。

5.既然IP數據報會發生重複,TCP的接收端必須丢棄重複的數據。

6.TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端隻允許另一端發送接收端緩沖區所能接納的數據。這将防止較快主機緻使較慢主機的緩沖區溢出。

兩個應用程序通過TCP連接交換8bit字節構成的字節流。TCP不在字節流中插入記錄标識符。我們将這稱為字節流服務(bytestreamservice)。如果一方的應用程序先傳10字節,又傳20字節,再傳50字節,連接的另一方将無法了解發方每次發送了多少字節。隻要自己的接收緩存沒有塞滿,TCP接收方将有多少就收多少。一端将字節流放到TCP連接上,同樣的字節流将出現在TCP連接的另一端。

另外,TCP對字節流的内容不作任何解釋。TCP不知道傳輸的數據字節流是二進制數據,還是ASCⅡ字符、EBCDIC字符或者其他類型數據。對字節流的解釋由TCP連接雙方的應用層解釋。

這種對字節流的與Unix操作系統對文件的處理方式很相似。Unix的内核對一個應用讀或寫的内容不作任何解釋,而是交給應用程序處理。對Unix的内核來說,它無法區分一個二進制文件與一個文本文件。

重傳策略

TCP協議用于控制數據段是否需要重傳的依據是設立重發定時器。在發送一個數據段的同時啟動一個重傳,如果在重傳超時前收到确認(Acknowlegement)就關閉該重傳,如果重傳超時前沒有收到确認,則重傳該數據段。在選擇重發時間的過程中,TCP必須具有自适應性。它需要根據互聯網當時的通信情況,給出合适的重發時間。

這種重傳策略的關鍵是對定時器初值的設定。采用較多的算法是Jacobson于1988年提出的一種不斷調整超時時間間隔的動态算法。其工作原理是:對每條連接TCP都保持一個

變量RTT(Round Trip Time),用于存放當前到目的端往返所需要時間最接近的估計值。當發送一個數據段時,同時啟動連接的定時器,如果在定時器超時前确認到達,則記錄所需要的時間(M),并修正

RTT的值,如果定時器超時前沒有收到确認,則将RTT的值增加1倍。通過測量一系列的RTT(往返時間)值,TCP協議可以估算數據包重發前需要等待的時間。在估計該連接所需的當前延遲時通常利用一些統計學的原理和算法(如Karn算法),從而得到TCP重發之前需要等待的時間值。

窗口确認

TCP的一項功能就是确保每個數據段都能到達目的地。位于目的主機的TCP服務對接受到的數據進行确認,并向源應用程序發送确認信息。

使用數據報頭序列号以及确認号來确認已收到包含在數據段的相關的數據字節。

TCP在發回源設備的數據段中使用确認号,指示接收設備期待接收的下一字節。這個過程稱為期待确認。

源主機在收到确認消息之前可以傳輸的數據的大小稱為窗口大小。用于管理丢失數據和流量控制。這些變化如右圖所示。

配置TCP

修改建立TCP連接的超時時間

建立TCP連接需要經過三次握手:主動端先發送SYN報文,被動放回應SYN+ACK報文,然後主動端再回應ACK。

l在主動端發送SYN後,如果被動端一直不回應SYN+ACK報文,主動端會不斷的重傳SYN報文直到超過一定的重傳次數或超時時間。

l在主動端發送SYN後,被動端回應SYN+ACK報文,但主動端不再回複ACK,被動端也會一直重傳直到超過一定的重傳次數或超時時間。(SYN報文攻擊會出現這種情況)

可以通過以下命令配置SYN報文的超時時間(發送SYN報文到三次握手成功的最大時間),也就是建立TCP連接的超時時間。

命令

作用

R(config)# ip tcp syntime-out seconds

修改建立TCP連接的超時時間。

單位秒,取值範圍5-300,缺省值20

使用no ip tcp syntime-out命令恢複參數缺省值。

修改緩沖區大小

TCP的接收緩沖區是用來緩存從對端接收到的數據,這些數據後續會被應用程序讀取。一般情況下,TCP報文的窗口值反映接收緩沖區的空閑空間的大小。對于帶寬比較大、有大批量數據的連接,增大接收緩沖區的大小可以顯着提供TCP傳輸性能。TCP的發送緩沖區是用來緩存應

用程序的數據,發送緩沖區的每個字節都有序列号,被應答确認的序列号對應的數據會從發送緩沖區删除掉。增大發送緩沖區可以提高TCP跟應用程序的交互能力,也因此會提高性能。但是增大接收和發送緩沖區會導緻TCP占用比較多的内存。

命令

作用

R (config)# ip tcp window-size size

修改TCP連接的接收和發送緩沖區大小。

單位字節,取值範圍0-65535,缺省值4096。

使用no ip tcp window-size命令恢複接收和發送緩沖區大小為缺省值。

禁止端口不可達時的重置報文

TCP模塊在分發TCP報文時,如果找不到該報文所屬的TCP連接會主動回複一個reset報文以終止對端的TCP連接。攻擊者可能利用大量的端口不可達的TCP報文對設備進行攻擊。

可以使用以下命令禁止/恢複在收到端口不可達的TCP報文時發送reset報文。

命令

作用

R (config)# ip tcp not-send-rst

禁止在接收到端口不可達的TCP報文時發送reset報文。

使用no ip tcp not-send-rst命令恢複發送reset報文。

限制TCP連接的MSS的最大值

MSS是最大傳輸段大小的縮寫,指一個TCP報文的數據載荷的最大長度,不包括TCP選項。

在TCP建立連接的三次握手中,有一種很重要的工作那就是進行MSS協商。連接的雙方都在SYN報文中增加MSS選項,其選項值表示本端

最大能接收的段大小,即對端最大能發送的段大小。連接的雙方取本端發送的MSS值和接收對端的MSS值的較小者作為本連接最大傳輸段大小。

發送SYN報文時的MSS選項值的計算方法如下。

l非直連網絡中:mss=默認值536。l直連網絡中:mss=對端ip地址對應的出口的MTU-20字節ip頭-20字節tcp頭。

一般來說如果出口配置的某些應用影響了接口的mtu,那麼該應用會相應的設置mtu,如隧道口,vpn口等。

到這裡得到的rmss值就是要發送的syn報文mss選項的值。舉例:一般情況下在直連網絡中建立bgp鄰居,那麼該連接的發送的mss為1500–20–20–20 = 1440。

ip tcp mss命令的作用是限制即将建立的TCP連接的MSS的最大值。任何新建立的連接協商的MSS值不能超過配置的值。

命令

作用

R (config)# ip tcp mss max-segment-size

限制TCP連接的MSS的最大值。

單位為字節,取值範圍68-10000。

使用no ip tcp mss命令取消此限制。

啟用PMTU發現功能

TCP的路徑最大傳輸單元(PMTU)發現功能是按RFC1191實現的,這個功能可以提高網絡帶寬的利用率。當用戶使用TCP來批量傳輸大塊數據時,該功能可以使傳輸性能得到明顯提升。

命令

作用

R(config)# ip tcp path-mtu-discovery [ age-timer minutes | age-timer infinite ]

啟用PMTU發現功能。

age-timer minutes :TCP在發現PMTU後,重新進行探測的時間間隔。單位分鐘,取值範圍10-30。缺省值10。

age-timer infinite :TCP在發現PMTU後,不重新探測。

按RFC1191的描述,TCP在發現PMTU後,隔一段時間可以使用更大的MSS來探測新的PMTU。這個時間間隔就是使用參數age-timer來指定。當設備發現的PMTU比TCP連接兩端協商出來的MSS小時,設備就會按上述配置時間間隔,去嘗試發現更大的PMTU。直到PMTU達到MSS的值,或者用戶停止這個定時器,這個探測過程才會停止。停止這個定時器,使用age-timer infinite參數。

使用no ip tcp path-mtu-discovery命令關閉PMTU發現功能。

設置接口收發SYN報文的MSS選項值

當客戶端發起一個TCP連接時,它通過TCP SYN報文中的MSS選項字段協商TCP報文數據載荷的最大值,客戶端SYN報文的MSS值表示後續服務器端發送TCP報文數據載荷的最大值,反之同理。

如右圖的拓撲,PC用http訪問服務器可能會出現無法訪問的情況。因為PC與服務器端建立的連接MSS協商的都會是1460,但1460的MSS無法通過R1和R2,R1和R2用隧道相連,MTU小于1500。

這時可以通過在R2的(1)口和(2)口上配置如下命令,修改SYN報文中的MSS選項值。從而修改經過(1)口和(2)口的TCP連接協商的MSS值。

命令

作用

R (config-if)# ip tcp adjust-mss max-segment-size

設置接口收發SYN報文的MSS選項值。

單位為字節,取值範圍500-1460。

使用no ip tcp adjust-mss命令取消此項設置,則接口收發SYN報文時,不會修改報文的MSS選項值。

在接口上配置本命令會使得該接口接收或發送SYN報文的MSS選項都被改為接口上配置的MSS值。建議出口和入口配置相同的值。如果SYN報文的入口和出口配置了不同的MSS值,經過該設備後,SYN報文的MSS選項被改為這兩個口配置值的較小者。

相關詞條

相關搜索

其它詞條