TCP
傳輸控制協(xié)議(TCP,Transmission Control Protocol)是為了在不可靠的互聯(lián)網(wǎng)絡上提供可靠的端到端字節(jié)流而專門設計的一個傳輸協(xié)議。 [2] 互聯(lián)網(wǎng)絡與單個網(wǎng)絡有很大的不同,因為互聯(lián)網(wǎng)絡的不同部分可能有截然不同的拓撲結構、帶寬、延遲、數(shù)據(jù)包大小和其他參數(shù)。TCP的設計目標是能夠動態(tài)地適應互聯(lián)網(wǎng)絡的這些特性,而且具備面對各種故障時的健壯性。 [2] 不同主機的應用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。 [3] 應用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)?、?位字節(jié)表示的數(shù)據(jù)流,然后TCP把數(shù)據(jù)流分區(qū)成適當長度的報文段(通常受該計算機連接的網(wǎng)絡的數(shù)據(jù)鏈路層的最大傳輸單元(MTU)的限制)。之后TCP把結果包傳給IP層,由它來通過網(wǎng)絡將包傳送給接收端實體的TCP層。TCP為了保證不發(fā)生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的包發(fā)回一個相應的確認(ACK);如果發(fā)送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數(shù)據(jù)包就被假設為已丟失將會被進行重傳。TCP用一個校驗和函數(shù)來檢驗數(shù)據(jù)是否有錯誤;在發(fā)送和接收時都要計算校驗和。
每臺支持TCP的機器都有一個TCP傳輸實體。TCP實體可以是一個庫過程、一個用戶進程,或者內核的一部分。在所有這些情形下,它管理TCP流,以及與IP層之間的接口。TCP傳輸實體接受本地進程的用戶數(shù)據(jù)流,將它們分割成不超過64KB(實際上去掉IP和TCP頭,通常不超過1460數(shù)據(jù)字節(jié))的分段,每個分段以單獨的IP數(shù)據(jù)報形式發(fā)送。當包含TCP數(shù)據(jù)的數(shù)據(jù)報到達一臺機器時,它們被遞交給TCP傳輸實體,TCP傳輸實體重構出原始的字節(jié)流。為簡化起見,我們有時候僅僅用“TCP”來代表TCP傳輸實體(一段軟件)或者TCP協(xié)議(一組規(guī)則)。根據(jù)上下文語義你應該能很消楚地推斷出其實際含義。例如,在“用戶將數(shù)據(jù)交給TCP”這句話中,很顯然這里指的是TCP傳輸實體。 [2] IP層并不保證數(shù)據(jù)報一定被正確地遞交到接收方,也不指示數(shù)據(jù)報的發(fā)送速度有多快。正是TCP負責既要足夠快地發(fā)送數(shù)據(jù)報,以便使用網(wǎng)絡容量,但又不能引起網(wǎng)絡擁塞:而且,TCP超時后,要重傳沒有遞交的數(shù)據(jù)報。即使被正確遞交的數(shù)據(jù)報,也可能存在錯序的問題,這也是TCP的責任,它必須把接收到的數(shù)據(jù)報重新裝配成正確的順序。簡而言之,TCP必須提供可靠性的良好性能,這正是大多數(shù)用戶所期望的而IP又沒有提供的功能。
當應用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)?、?位字節(jié)表示的數(shù)據(jù)流,TCP則把數(shù)據(jù)流分割成適當長度的報文段,最大傳輸段大小(MSS)通常受該計算機連接的網(wǎng)絡的數(shù)據(jù)鏈路層的最大傳送單元(MTU)限制。之后TCP把數(shù)據(jù)包傳給IP層,由它來通過網(wǎng)絡將包傳送給接收端實體的TCP層。 [3] TCP為了保證報文傳輸?shù)目煽浚徒o每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的字節(jié)發(fā)回一個相應的確認(ACK);如果發(fā)送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數(shù)據(jù)(假設丟失了)將會被重傳。
在數(shù)據(jù)正確性與合法性上,TCP用一個校驗和函數(shù)來檢驗數(shù)據(jù)是否有錯誤,在發(fā)送和接收時都要計算校驗和;同時可以使用md5認證對數(shù)據(jù)進行加密。
在保證可靠性上,采用超時重傳和捎帶確認機制。
在流量控制上,采用滑動窗口協(xié)議,協(xié)議中規(guī)定,對于窗口內未經(jīng)確認的分組需要重傳。
在擁塞控制上,采用廣受好評的TCP擁塞控制算法(也稱AIMD算法)。該算法主要包括四個主要部分:(1)慢啟動每當建立一個TCP連接時或一個TCP連接發(fā)生超時重傳后,該連接便進入慢啟動階段。進入慢啟動后,TCP實體將擁塞窗口的大小初始化為一個報文段,即:cwnd=1。此后,每收到一個報文段的確認(ACK),cwnd值加1,即擁塞窗口按指數(shù)增加。當cwnd值超過慢啟動闡值(ssthresh)或發(fā)生報文段丟失重傳時,慢啟動階段結束。前者進入擁塞避免階段,后者重新進入慢啟動階段。(2)擁塞避免在慢啟階段,當cwnd值超過慢啟動闡值(ssthresh)后,慢啟動過程結束,TCP連接進入擁塞避免階段。在擁塞避免階段,每一次發(fā)送的cwnd個報文段被完全確認后,才將cwnd值加1。在此階段,cwnd值線性增加。(3)快速重傳快速重傳是對超時重傳的改進。當源端收到對同一個報文的三個重復確認時,就確定一個報文段已經(jīng)丟失,因此立刻重傳丟失的報文段,而不必等到重傳定時器(RTO)超時。以此減少不必要的等待時間。(4)快速恢復快速恢復是對丟失恢復機制的改進。在快速重傳之后,不經(jīng)過慢啟動過程而直接進入擁塞避免階段。每當快速重傳后,置ssthresh=cwnd/2、ewnd=ssthresh+3。此后,每收到一個重復確認,將cwnd值加1,直至收到對丟失報文段和其后若干報文段的累積確認后,置cwnd=ssthresh,進入擁塞避免階段。