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