TCP

傳輸控制協議

傳輸控制協議(TCP,Transmission Control Protocol)是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議,由IETF的RFC 793 定義。

TCP旨在適應支持多網路應用的分層協議層次結構。連接到不同但互連的計算機通信網路的主計算機中的成對進程之間依靠TCP提供可靠的通信服務。TCP假設它可以從較低級別的協議獲得簡單的,可能不可靠的數據報服務。原則上,TCP應該能夠在從硬線連接到分組交換或電路交換網路的各種通信系統之上操作。

簡介


傳輸控制協議(TCP,Transmission Control Protocol)是為了在不可靠的網際網路路上提供可靠的端到端位元組流而專門設計的一個傳輸協議。
網際網路路與單個網路有很大的不同,因為網際網路路的不同部分可能有截然不同的拓撲結構、帶寬、延遲、數據包大小和其他參數。TCP的設計目標是能夠動態地適應網際網路路的這些特性,而且具備面對各種故障時的健壯性。
不同主機的應用層之間經常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。
應用層向TCP層發送用於網間傳輸的、用8位位元組表示的數據流,然後TCP把數據流分區成適當長度的報文段(通常受該計算機連接的網路的數據鏈路層的最大傳輸單元(MTU)的限制)。之後TCP把結果包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層。TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據包就被假設為已丟失將會被進行重傳。TCP用一個校驗和函數來檢驗數據是否有錯誤;在發送和接收時都要計算校驗和。
每台支持TCP的機器都有一個TCP傳輸實體。TCP實體可以是一個庫過程、一個用戶進程,或者內核的一部分。在所有這些情形下,它管理TCP流,以及與IP層之間的介面。TCP傳輸實體接受本地進程的用戶數據流,將它們分割成不超過64KB(實際上去掉IP和TCP頭,通常不超過1460數據位元組)的分段,每個分段以單獨的IP數據報形式發送。當包含TCP數據的數據報到達一台機器時,它們被遞交給TCP傳輸實體,TCP傳輸實體重構出原始的位元組流。為簡化起見,我們有時候僅僅用“TCP”來代表TCP傳輸實體(一段軟體)或者TCP協議(一組規則)。根據上下文語義你應該能很消楚地推斷出其實際含義。例如,在“用戶將數據交給TCP”這句話中,很顯然這裡指的是TCP傳輸實體。
IP層並不保證數據報一定被正確地遞交到接收方,也不指示數據報的發送速度有多快。正是TCP負責既要足夠快地發送數據報,以便使用網路容量,但又不能引起網路擁塞:而且,TCP超時后,要重傳沒有遞交的數據報。即使被正確遞交的數據報,也可能存在錯序的問題,這也是TCP的責任,它必須把接收到的數據報重新裝配成正確的順序。簡而言之,TCP必須提供可靠性的良好性能,這正是大多數用戶所期望的而IP又沒有提供的功能。

發展歷程


TCP的正式定義由1981年9月的RFC793 給出。隨著時間的推移,已經對其做了許多改進,各種錯誤和不一致的地方逐漸被修復。
為了讓你感受到TCP的擴展歷程,現在重要的RFC有:RFC793plus澄清了說明,RFC1122 修復了bug、RFC1323 做了高性能擴展,RFC2018 定義了選擇性確認,RFC2581說明了擁塞控制、RFC2873定義了為服務質量而重用的頭欄位,RFC2988 改進了重傳計時器,RFC3168 定義了顯式擁塞通知。完整的協議集合很大,因而專門發布了一個針對許多RFC的指南,它就是作為另一個RFC文檔公布的RFC4614。

主要功能


當應用層向TCP層發送用於網間傳輸的、用8位位元組表示的數據流,TCP則把數據流分割成適當長度的報文段,最大傳輸段大小(MSS)通常受該計算機連接的網路的數據鏈路層的最大傳送單元(MTU)限制。之後TCP把數據包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層。
TCP為了保證報文傳輸的可靠,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的位元組發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的數據(假設丟失了)將會被重傳。
● 在數據正確性與合法性上,TCP用一個校驗和函數來檢驗數據是否有錯誤,在發送和接收時都要計算校驗和;同時可以使用md5認證對數據進行加密。
● 在保證可靠性上,採用超時重傳和捎帶確認機制。
● 在流量控制上,採用滑動窗口協議,協議中規定,對於窗口內未經確認的分組需要重傳。
在擁塞控制上,採用廣受好評的TCP擁塞控制演演算法(也稱AIMD演演算法)。該演演算法主要包括四個主要部分:
(1)慢啟動
每當建立一個TCP連接時或一個TCP連接發生超時重傳后,該連接便進入慢啟動階段。進入慢啟動后,TCP實體將擁塞窗口的大小初始化為一個報文段,即:cwnd=1。此後,每收到一個報文段的確認(ACK),cwnd值加1,即擁塞窗口按指數增加。當cwnd值超過慢啟動闡值(ssthresh)或發生報文段丟失重傳時,慢啟動階段結束。前者進入擁塞避免階段,後者重新進入慢啟動階段。
(2)擁塞避免
在慢啟階段,當cwnd值超過慢啟動闡值(ssthresh)后,慢啟動過程結束,TCP連接進入擁塞避免階段。在擁塞避免階段,每一次發送的cwnd個報文段被完全確認后,才將cwnd值加1。在此階段,cwnd值線性增加。
(3)快速重傳
快速重傳是對超時重傳的改進。當源端收到對同一個報文的三個重複確認時,就確定一個報文段已經丟失,因此立刻重傳丟失的報文段,而不必等到重傳定時器(RTO)超時。以此減少不必要的等待時間。
(4)快速恢復
快速恢復是對丟失恢復機制的改進。在快速重傳之後,不經過慢啟動過程而直接進入擁塞避免階段。每當快速重傳后,置ssthresh=cwnd/2、ewnd=ssthresh+3。此後,每收到一個重複確認,將cwnd值加1,直至收到對丟失報文段和其後若干報文段的累積確認后,置cwnd=ssthresh,進入擁塞避免階段。

主要特點


TCP是一種面向廣域網的通信協議,目的是在跨越多個網路通信時,為兩個通信端點之間提供一條具有下列特點的通信方式:
(1)基於流的方式;
(2)面向連接;
(3)可靠通信方式;
(4)在網路狀況不佳的時候盡量降低系統由於重傳帶來的帶寬開銷;
(5)通信連接維護是面向通信的兩個端點的,而不考慮中間網段和節點。
為滿足TCP協議的這些特點,TCP協議做了如下的規定:
①數據分片:在發送端對用戶數據進行分片,在接收端進行重組,由TCP確定分片的大小並控制分片和重組;
②到達確認:接收端接收到分片數據時,根據分片數據序號向發送端發送一個確認;
③超時重發:發送方在發送分片時啟動超時定時器,如果在定時器超時之後沒有收到相應的確認,重發分片;
④滑動窗口:TCP連接每一方的接收緩衝空間大小都固定,接收端只允許另一端發送接收端緩衝區所能接納的數據,TCP在滑動窗口的基礎上提供流量控制,防止較快主機致使較慢主機的緩衝區溢出;
⑤失序處理:作為IP數據報來傳輸的TCP分片到達時可能會失序,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層;
⑥重複處理:作為IP數據報來傳輸的TCP分片會發生重複,TCP的接收端必須丟棄重複的數據;
⑦數據校驗:TCP將保持它首部和數據的檢驗和,這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到分片的檢驗和有差錯,TCP將丟棄這個分片,並不確認收到此報文段導致對端超時並重發。

首部格式


TCP的首部格式如圖1所示:
圖1 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欄位的值)的偏移。

工作方式


建立連接
圖2 TCP的三次握手
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客戶端和伺服器端成功地建立連接,可以開始傳輸數據了。
連接終止
圖3 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 是面向連接的傳輸控制協議,而UDP 提供了無連接的數據報服務;TCP 具有高可靠性,確保傳輸數據的正確性,不出現丟失或亂序;UDP 在傳輸數據前不建立連接,不對數據報進行檢查與修改,無須等待對方的應答,所以會出現分組丟失、重複、亂序,應用程序需要負責傳輸可靠性方面的所有工作;UDP 具有較好的實時性,工作效率較 TCP 協議高;UDP 段結構比 TCP 的段結構簡單,因此網路開銷也小。TCP 協議可以保證接收端毫無差錯地接收到發送端發出的位元組流,為應用程序提供可靠的通信服務。對可靠性要求高的通信系統往往使用 TCP 傳輸數據。比如 HTTP 運用 TCP 進行數據的傳輸。

網路協議


功能

當應用層向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的首部格式圖右圖所示:
TCP首部
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的三次握手
TCP的三次握手
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連接的終止
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

修改建立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)發現功能是按RF
C1191實現的,這個功能可以提高網路帶寬的利用率。當用戶使用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達到MS
S的值,或者用戶停止這個定時器,這個探測過程才會停止。停止這個定時器,使用age-timer infinite參數。
使用no ip tcp path-mtu-discovery命令關閉PMTU發現功能。
設置介面收發SYN報文的MSS選項值
TCP[傳輸控制協議]
TCP[傳輸控制協議]
當客戶端發起一個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選項被改為這兩個口配置值的較小者。

狀態機


在TCP操作過程中,會經歷一些狀態的改變,這些變化如下圖所示: