TCP 和 UDP 都使用相同的網絡層 IP,可是與 UDP 不一樣的是,TCP 是面向鏈接的、可靠的字節流協議。所以,在傳輸數據以前通訊雙方必須創建一個 TCP 鏈接。TCP 經過檢驗和、序列號、確認應答、重發機制、鏈接管理以及窗口控制等機制實現可靠性傳輸。html
TCP經過如下方式提供可靠性:算法
1. 應用數據被分割成 TCP 認爲最合適發送的數據塊,即進行TCP 分段。這點與 UDP 徹底不一樣,應用程序產生的UDP 數據報長度將保持不變,在 IP 層將 UDP 數據報加上IP 首部後,必要時對其進行 IP 分片。緩存
2. 當 TCP 發出一個報文段後,它會啓動一個定時器,等待目的端確認收到這個報文段,若是沒能及時收到該確認信息,則將重發這個報文段。即超時重傳。網絡
3. 當 TCP 接收端收到鏈接另外一端的 TCP 報文段時,它將發送一個確認,這個確認不是當即發送的,一般會推遲幾分之一秒。即確認應答(ACK)。函數
4. TCP 將保持它首部和數據的校驗和。這是一個端到端的校驗和,目的是檢查數據在傳輸過程當中的任何變化。若是收到的報文段的校驗和有差錯,TCP 將丟棄該報文段,同時不發送確認收到的消息,從而使發送端超時重發。post
5. 因爲 TCP 報文段做爲 IP 數據報來傳輸,IP 數據報的到達可能會失序,所以 TCP 報文段的到達也可能失序,若是必要,TCP 將對收到的數據進行重排序,將收到的數據以正確的順序交給應用層。 性能
6. 因爲 IP 數據報有可能發生重複,TCP 的接收端必須丟棄重複的數據。flex
7. TCP 能提供流量控制。TCP 鏈接的每一方都有固定大小的緩衝空間,TCP 的接受端只容許另外一端發送接收端緩衝區所能接納的數據,這將防止較快主機導致較慢主機的緩衝區溢出。即流量控制。spa
TCP數據被封裝在一個IP數據報中,如圖所示:.net
TCP 首部,不如不計任選字段,它一般是20個字節。以下圖所示:
TCP 首部比 UDP 首部複雜不少,而且沒有表示包長度和數據長度的字段,可由 IP 層獲取 TCP 的包長度,並由 TCP 包長度可知數據的長度。下面對 TCP 首部的個字段進行簡單介紹:
源端口號:表示發送端端口號,字段長 16 位;
目標端口號:表示接收端端口號,字段長 16 位;
每一個 TCP段都包含源端和目的端的端口號,用於尋找發端和收端應用進程。這兩個值加上IP首部中的源端 IP地址和目的端 IP地址惟一肯定一個 TCP鏈接。
序列號:字段長 32 位,佔4個字節,序號的範圍爲[0,4284967296]。因爲TCP是面向字節流的,在一個TCP鏈接中傳送的字節流中的每個字節都按順序編號,首部中的序號字段則是指本報文段所發送的數據的第一個字節的序號。另外,序號是循環使用的,當序號增長到最大值時,下一個序號就又回到了0。
確認應答:字段長 32 位,當ACK標誌位爲1時有效,表示指望收到的下一個報文段的第一個數據字節的序號。確認號爲N,則代表到序號N-1爲止的全部數據字節都已經被正確地接收到了。
首部長度(數據偏移):該字段表示 TCP 所傳輸的數據部分應該從 TCP 包的哪一個位置開始計算,能夠把它看做是 TCP 首部的長度。該字段長 4 位,單位是 4 字節(即 32 位)。不包括選項字段的話,TCP 首部長度爲 20 個字節,所以,數據偏移字段可設置爲 5。反之,若該字段值爲 5,那麼說明從 TCP 包的一開始到 20 字節爲止都是 TCP 首部,餘下的部分爲 TCP 數據;
保留:該字段主要是爲了之後擴展時使用,其長度爲 4 位,通常設置爲 0,但即便收到的包在該字段不爲 0,此包也不會被丟棄;
控制位:字段長爲 8 位,每一位從左到右分別爲 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。這些控制標誌也叫作控制位。當他們的對應位上值爲 1 時,具體含義以下:
CWR:CWR 標誌與後面的 ECE 標誌都用於 IP 首部的 ECN 字段,ECE 標誌爲 1 時,則通知對方已將擁塞窗口縮小;
ECE:若其值爲 1 則會通知對方,從對方到這邊的網絡有阻塞。在收到數據包的 IP 首部中 ECN 爲 1 時將 TCP 首部中的 ECE 設爲 1.;
URG:該位設爲 1,表示包中有須要緊急處理的數據,對於須要緊急處理的數據,與後面的緊急指針有關;
ACK:該位設爲 1,確認應答的字段有效,TCP規定除了最初創建鏈接時的 SYN 包以外該位必須設爲 1;
PSH:該位設爲 1,表示須要將收到的數據馬上傳給上層應用協議,若設爲 0,則先將數據進行緩存;
RST:該位設爲 1,表示 TCP 鏈接出現異常必須強制斷開鏈接;
SYN:用於創建鏈接,該位設爲 1,表示但願創建鏈接,並在其序列號的字段進行序列號初值設定;
FIN:該位設爲 1,表示從此再也不有數據發送,但願斷開鏈接。當通訊結束但願斷開鏈接時,通訊雙方的主機之間就能夠相互交換 FIN 位置爲 1 的 TCP 段。每一個主機又對對方的 FIN 包進行確認應答以後能夠斷開鏈接。不過,主機收到 FIN 設置爲 1 的 TCP 段以後沒必要立刻回覆一個 FIN 包,而是能夠等到緩衝區中的全部數據都由於已成功發送而被自動刪除以後再發 FIN 包;
窗口大小:該字段長 16 位,用於通知從相同 TCP 首部的確認應答號所指位置開始可以接收的數據大小(8 位字節)。TCP 不容許發送超過該窗口大小的數據。若窗口爲 0,則表示能夠發送窗口探測,以瞭解最新的窗口大小,但這個數據必須是 1 個字節;
檢驗和:TCP 的檢驗和與 UDP 檢驗和同樣,也是採用僞首部,可是 TCP 的檢驗和沒法關閉。TCP 僞首部的信息和 UDP 同樣,包括:源 IP 地址、目的 IP 地址、填充、協議號以及 TCP 包長度;
緊急指針:該字段爲 16 位。只有在 URG 控制位爲 1 時有效。該字段的數值表示本報文段中緊急數據的指針。從數據部分的首位到緊急指針所在的位置爲止是緊急數據。所以,緊急指針是指出了緊急數據的末尾在報文段中的位置;
在TCP中,當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知。這個消息叫作確認應答(ACK)。
TCP經過確定的確認應答(ACK)實現可靠的數據傳輸。當發送端將數據發出以後會等待對端的確認應答。若是有確認應答,說明數據已經成功大道對端。反之,則數據丟失的可能性很大。
未收到確認應答並不意味着數據必定丟失。也有多是數據對方已經收到,只是返回的確認應答在途中丟失。這種狀況也會致使發送端因沒有收到確認應答,而認爲數據沒有達到目的地,從而進行重發。
此外,也有可能由於一些其餘緣由致使確認應答延遲到達,在源主機重發數據之後纔到達的狀況也家常便飯。此時,源發送主機只要按照機制重發數據便可。可是目標主機這時會反覆收到相同的數據。而爲了對上層應用提供可靠的傳輸,必須的放棄重複的數據包。爲此,就必須引入一種機制,它可以識別是否已經接收到數據,又能判斷是否須要接收。
上述這些確認應答處理、重發機制以及重發控制等功能均可以經過序列號實現。序列號是按順序給發送數據的每個字節(8位字節)都標上號碼的編號。接收端查詢接收數據TCP首部中的序列號和數據長度,將本身下一步應該接收的序列號做爲確認應答返送回去。就這樣經過序列號和確認應答號,TCP能夠實現可靠傳輸。
重發超時是指在重發數據以前,等待確認應答到來的那個特定時間間隔。若是超過了這個時間仍未收到確認應答,發送端將進行數據重發。重發超時通常都是0.5秒的整數倍,因爲最初的數據包還不知道往返時間,因此其重發超時通常設置爲6秒左右。數據被重發以後若仍是收不到確認應答,則進行再次發送。此時,等待確認應答的時間將會以2倍、4倍的指數函數延長。此外,數據也不會被無限、反覆地重發。達到必定重發次數之後,若是仍沒有任何確認應答返回,就會判斷爲網絡或對端主機發生了異常,強制關閉鏈接。而且通知應用通訊異常強行終止。
TCP提供面向有鏈接的通訊傳輸。面向有鏈接是指在數據通訊開始以前先作好通訊兩端之間的準備工做。
UDP是一種面向無鏈接的通訊協議,所以不檢查對端是否能夠通訊,直接將UDP包發送出去。TCP與此相反,它會在數據通訊以前,經過TCP首部發送一個SYN包做爲創建鏈接的請求等待確認應答。若是對端發來確認應答,則認爲能夠進行數據通訊。若是對端的確認應答未能到達,就不會進行數據通訊。此外,在通訊結束時會進行斷開鏈接的處理。
可使用TCP首部用於控制的字段來管理TCP鏈接。一個鏈接的創建與斷開,正常過程至少須要來回發送7個包才能完成。
TCP 傳輸數據是以 1 個段爲單位,每發送一個段進行一次確認應答的處理,這樣使通訊時包的往返時間很長致使下降通訊性能。爲了解決這個問題,TCP 引入了窗口控制,確認應答再也不是以每一個分段,而是以更大的單位進行確認,這樣縮短轉發時間,也就是說,發送端主機在發送了一個段以後沒必要要一直等待確認應答,而是繼續發送數據段。窗口大小是指無需等待確認應答而能夠發送數據的最大值。
採用窗口控制機制必須實現緩衝區,在圖 4 中,窗口內的數據即使是沒有收到確認應答也能夠發送出去。此外從該窗口中能看到的數據是因其某種數據已在傳輸中丟失,因此發送端才能接收到確認應答,這種狀況下須要進行重發。爲此,發送端主機在等到確認應答返回以前,必須在緩衝區中保留這部分的數據。在滑動窗口之外的部分包括還沒有發送的數據和已經確認對端已經收到的數據。當數據發出後若如期收到確認應答就能夠不用進行重發,此時數據能夠從緩衝區中刪除。收到確認應答後,將窗口滑到確認應答中的序列號的位置,這樣能夠順序地將多個段同時發送提供通訊性能。這種機制也稱爲滑動窗口機制。
流量控制可讓發送端根據接收端的實際接受能力控制發送的數據量。它的具體操做是,接收端主機向發送端主機通知本身能夠接收數據的大小,因而發送端會發送不會超過該大小的數據,該限制大小即爲窗口大小,即窗口大小由接收端主機決定。TCP 首部中,專門有一個字段來通知窗口大小,接收主機將本身能夠接收的緩衝區大小放在該字段中通知發送端。當接收端的緩衝區面臨數據溢出時,窗口大小的值也是隨之改變,設置爲一個更小的值通知發送端,從而控制數據的發送量,這樣達到流量的控制。
通常來講,計算機網絡都處在一個共享的環境。所以,有可能由於其餘主機之間的通訊使得網絡擁堵。在網絡出現擁堵時,若是忽然發送一個較大量的數據,極有可能會致使整個網絡癱瘓。TCP爲了防止網絡擁塞,TCP 採用了一種慢啓動算法,對發送數據量進行控制。爲了調節發送端的數據發送量,引入了擁塞窗口,在慢啓動時,將這個擁塞窗口設爲 1 個數據段發送數據,以後每收到一次確認應答,擁塞窗口的值就加 1。在發送數據包時,將擁塞窗口的大小與接收端主機通知的窗口大小進行比較,而後選擇較小的值來控制數據量的發送。