一 TCP傳輸?shù)奶攸c(diǎn):
1 TCP是面向連接的傳輸層協(xié)議。與UDP不同的是,TCP在發(fā)送數(shù)據(jù)的時(shí)候,需要進(jìn)行連接葱弟,在TCP傳輸完數(shù)據(jù)后,必須要對(duì)連接進(jìn)行釋放
2 TCP連接只能提供點(diǎn)對(duì)點(diǎn)的連接
3 TCP提供可靠的交付服務(wù)猜丹。通過TCP傳輸?shù)臄?shù)據(jù)可以保證無差錯(cuò)芝加、無丟失、不重復(fù)射窒、按序到達(dá)
4 TCP提供全雙工通訊藏杖。在同一條TCP連接上的兩個(gè)點(diǎn)可以互相傳輸數(shù)據(jù)
5 TCP是面向字節(jié)流的傳輸,應(yīng)用程序與TCP的交互式一次一個(gè)數(shù)據(jù)塊脉顿,但是對(duì)于TCP來說蝌麸,數(shù)據(jù)只是一連串無結(jié)構(gòu)的字節(jié)流,TCP并不知道傳輸?shù)淖止?jié)流的含義艾疟。
二 什么是可靠的傳輸来吩?
1 簡(jiǎn)介:
我們知道,IP層只能提供最大努力的服務(wù)蔽莱,所以弟疆,IP層的傳輸是不可靠的,所以TCP必須采用某種措施盗冷,才能讓傳輸變得可靠怠苔。可靠傳輸有兩個(gè)特點(diǎn)正塌,分別是:
(1)傳輸信道不產(chǎn)生差錯(cuò)
(2)不管發(fā)送方傳輸數(shù)據(jù)的速度有多快嘀略,接收方都必須跟上發(fā)送方的節(jié)奏,及時(shí)處理傳輸過來的數(shù)據(jù)乓诽。
2 如何保證可靠傳輸帜羊?
2.1 停止等待協(xié)議
發(fā)送方發(fā)送一段數(shù)據(jù)后,就停止傳輸數(shù)據(jù)鸠天,等待接收方接受完數(shù)據(jù)后讼育,返回確認(rèn)指令,然后發(fā)送方繼續(xù)發(fā)送接下來的一段數(shù)據(jù)稠集。這個(gè)時(shí)候奶段,如果接收方檢測(cè)發(fā)送方數(shù)據(jù)的時(shí)候出錯(cuò),或者發(fā)送方自己丟失了數(shù)據(jù)剥纷,導(dǎo)致接收方什么都接受不到痹籍,那么,發(fā)送方這個(gè)時(shí)候是不會(huì)接收到任何接收方的確定指令的晦鞋。如果發(fā)送方持續(xù)等待蹲缠,就會(huì)造成資源的浪費(fèi)。所以悠垛,停止等待協(xié)議提出了超時(shí)重傳機(jī)制:發(fā)送方每發(fā)送一次數(shù)據(jù)的時(shí)候线定,都會(huì)開啟一個(gè)計(jì)時(shí)器,如果在規(guī)定時(shí)間內(nèi)接到接收方的確定确买,那么就發(fā)送數(shù)據(jù)斤讥,同時(shí)把計(jì)時(shí)器重置;如果在規(guī)定時(shí)間內(nèi)湾趾,未能接收到接收方的確定指令芭商,那么,就重新發(fā)送這段數(shù)據(jù)搀缠,同時(shí)重置數(shù)據(jù)蓉坎,這個(gè)就是超時(shí)重傳機(jī)制。
超時(shí)重傳需要注意:
(1)發(fā)送方在發(fā)送完數(shù)據(jù)后胡嘿,必須保留數(shù)據(jù)的副本蛉艾,以備超時(shí)重傳;
(2)發(fā)送方和接收方對(duì)數(shù)據(jù)發(fā)送和確認(rèn)必須進(jìn)行編號(hào)衷敌,這樣發(fā)送方才知道勿侯,需要重新發(fā)送的是哪段數(shù)據(jù);
(3)超時(shí)時(shí)間不能設(shè)置過短缴罗,這樣會(huì)導(dǎo)致資源浪費(fèi)助琐,同時(shí)不能設(shè)置過長(zhǎng),長(zhǎng)時(shí)間處于等待確認(rèn)狀態(tài)也是會(huì)耗費(fèi)大量的網(wǎng)絡(luò)資源面氓。超時(shí)重傳時(shí)間應(yīng)該比平均往返時(shí)間還要略長(zhǎng)一點(diǎn)兵钮。
確認(rèn)丟失和確認(rèn)遲到處理:
在傳輸過程中蛆橡,還有兩種情況,那就是掘譬,接收方確實(shí)是接到了發(fā)送方的數(shù)據(jù)泰演,但是在給發(fā)送方的確認(rèn)丟失了,或者遲到了葱轩。由于超時(shí)重連機(jī)制睦焕,發(fā)送方會(huì)繼續(xù)發(fā)送認(rèn)為丟失的數(shù)據(jù)。這個(gè)時(shí)候靴拱,接收方接收到這個(gè)數(shù)據(jù)垃喊,應(yīng)該做出以下動(dòng)作:
1 丟棄接收到的重復(fù)數(shù)據(jù),不傳輸給應(yīng)用層袜炕;
2 發(fā)送確認(rèn)報(bào)文本谜,通知發(fā)送方這段數(shù)據(jù)已經(jīng)收到,不用繼續(xù)發(fā)送偎窘。
到此耕突,我們已經(jīng)可以讓網(wǎng)絡(luò)進(jìn)行可靠的數(shù)據(jù)傳輸了,但是停止等待協(xié)議會(huì)讓信道利用率降低數(shù)據(jù)傳輸?shù)耐岛徒邮辗綌?shù)據(jù)梳處理都需要耗費(fèi)大量的時(shí)間评架,因此需要停止等待協(xié)議進(jìn)行改進(jìn)眷茁,于是,一種新的停止等待協(xié)議就誕生了:流水線傳輸纵诞。流水線傳輸就是讓發(fā)送方可以連續(xù)傳輸多個(gè)分組上祈,不必等到發(fā)送方一個(gè)一個(gè)確定才發(fā)送數(shù)據(jù),這樣可以使信道上一直有數(shù)據(jù)在傳輸
2.2 連續(xù)ARQ協(xié)議
ARQ協(xié)議的全名是Automatic Repeat reQuest浙芙。也就是我們所說的滑動(dòng)窗口協(xié)議登刺。滑動(dòng)窗口協(xié)議的精髓是嗡呼,發(fā)送方維持一個(gè)發(fā)送窗口纸俭,這個(gè)窗口可以發(fā)送5個(gè)分組。發(fā)送方每次的發(fā)送動(dòng)作南窗,其實(shí)就是把這個(gè)發(fā)送窗口往前移動(dòng)揍很。比如發(fā)送方把1-5的分組發(fā)送到接收方,接收方接收到1后万伤,對(duì)1進(jìn)行確認(rèn)窒悔,那么發(fā)送窗口就可以繼續(xù)遷移到6的分組處宛徊,然后繼續(xù)發(fā)送數(shù)據(jù)迅矛。
為了提高速度,一般接受方不會(huì)一條條對(duì)分組進(jìn)行確認(rèn)惭墓,而是累計(jì)起來虹钮,一次性對(duì)數(shù)據(jù)進(jìn)行確認(rèn)聋庵。但這個(gè)的問題是膘融,不能向發(fā)送方反饋已經(jīng)接收到的所有分組的信息。比如發(fā)送方已經(jīng)發(fā)送了1-5的數(shù)據(jù)分組祭玉,但是接收方由于第3的分組丟失氧映,導(dǎo)致接收方只能返回第2分組的確認(rèn)。發(fā)送方無法確認(rèn)4 5分組是否已經(jīng)發(fā)送成功攘宙,只能繼續(xù)傳輸3-5的分組屯耸。這樣也會(huì)造成資源的浪費(fèi)拐迁。
三 TCP的可靠性傳輸
3.1 TCP發(fā)送窗口
在前面的連續(xù)ARQ協(xié)議中蹭劈,我們知道,在沒有收到接收方的確認(rèn)時(shí)线召,A可以連續(xù)把窗口內(nèi)的數(shù)據(jù)都發(fā)送出去铺韧,在未收到確認(rèn)前,發(fā)送方都必須要保留發(fā)送數(shù)據(jù)的副本缓淹,以備超時(shí)重傳哈打。發(fā)送窗口具有以下幾個(gè)特點(diǎn):
(1)發(fā)送窗口的前沿?cái)?shù)據(jù)表示不允許發(fā)送的數(shù)據(jù),后沿?cái)?shù)據(jù)表示已經(jīng)發(fā)送并且受到確認(rèn)的數(shù)據(jù)讯壶;
(2)發(fā)送窗口內(nèi)的部分=已經(jīng)發(fā)送待確定數(shù)據(jù)+允許發(fā)送的數(shù)據(jù)(可用窗口)料仗。
(3)發(fā)送窗口的位置由前沿和后沿的位置決定,發(fā)送窗口后沿的變化有兩種伏蚊,一是不動(dòng)立轧,而是前移(受到確認(rèn))
3.2 TCP緩存
發(fā)送方的應(yīng)用進(jìn)程把字節(jié)流寫入TCP發(fā)送緩存中,而接收方的應(yīng)用進(jìn)程從TCP的接受緩存中讀取字節(jié)流躏吊。那么氛改,TCP發(fā)送緩存中,存放著以下緩存:
(1)發(fā)送方應(yīng)用程序準(zhǔn)備發(fā)送的數(shù)據(jù)比伏;
(2)發(fā)送方已經(jīng)發(fā)送胜卤,但是還沒有被確認(rèn)的數(shù)據(jù)。
而接收方緩存赁项,存放著以下的數(shù)據(jù):
(1)按序到達(dá)的葛躏,但是沒有被接收方應(yīng)用程序讀取的數(shù)據(jù);
(2)未按序到達(dá)的數(shù)據(jù)悠菜。
如果接收應(yīng)用程序來不及讀取收到的數(shù)據(jù)紫新,那么接收緩存就會(huì)被填滿,而接收窗口就會(huì)被減少到0李剖,反之芒率,如果應(yīng)用程序可以及時(shí)從接受緩存中接收到數(shù)據(jù),那么接收窗口就可以增大篙顺,但最大不能超過緩存的大小偶芍。同時(shí)充择,我們還應(yīng)該注意:
(1)發(fā)送窗口不一定和接收窗口一樣大,在一般情況下匪蟀,發(fā)送窗口應(yīng)該比接收窗口要小椎麦,甚至在網(wǎng)絡(luò)不暢的情況下,發(fā)送窗口還會(huì)自己減小發(fā)送窗口的大胁谋搿观挎;
(2)TCP對(duì)不按序到達(dá)的數(shù)據(jù),都是先臨時(shí)存放在接收窗口中段化,等字節(jié)流所缺少的字節(jié)到達(dá)后嘁捷,才交付給應(yīng)用程序;
(3)TCP要求接收方必須要累積確認(rèn)的功能显熏,這樣可以減少傳輸開銷雄嚣。接收方不可以過分推遲發(fā)送確認(rèn),因?yàn)檫@樣會(huì)導(dǎo)致發(fā)送方不必要的重傳喘蟆。一般缓升,推遲時(shí)間不能超過0.5s。
四 TCP流量控制
流量控制蕴轨,指的是讓發(fā)送方的發(fā)送速率不要太快港谊,要讓接收方來得及接收。
4.1 利用滑動(dòng)窗口
滑動(dòng)窗口總結(jié)來說橙弱,就是由接收方?jīng)Q定發(fā)送方發(fā)送多大的發(fā)送窗口rwnd歧寺。接收方發(fā)送數(shù)據(jù)格式 = ACK=1,ack=序號(hào)(100、200...),rwnd=XXX膘螟。
滑動(dòng)窗口有一個(gè)問題成福,就是接收方給發(fā)送方的確認(rèn),在傳輸過程中荆残,如果丟棄了奴艾,那么接收方在等待發(fā)送方的發(fā)送數(shù)據(jù),而發(fā)送方一直在等待接收方返回的rwnd非0的通知内斯,這樣就會(huì)造成死鎖的產(chǎn)生蕴潦。
TCP為了解決這個(gè)問題,設(shè)計(jì)了持續(xù)計(jì)時(shí)器俘闯。在TCP接到對(duì)方的零窗口通知后潭苞,就啟動(dòng)一個(gè)計(jì)時(shí)器,如果計(jì)時(shí)器事件到達(dá)后真朗,接收方還沒有返回rwnd此疹,那么探測(cè)器就會(huì)發(fā)送一個(gè)零窗口刺探報(bào)文,如果窗口依然是0,那么接到這個(gè)報(bào)文段后蝗碎,計(jì)時(shí)器重置為0湖笨;如果窗口不為0,那么死鎖的局面就可以被打破蹦骑。
五 TCP的擁塞控制
所謂擁塞控制慈省,就是防止過多的數(shù)據(jù)注入網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或者鏈路不導(dǎo)致過載眠菇,擁塞控制是全局性的過程边败,設(shè)計(jì)所有的主機(jī)、路由器以及降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素捎废。
5.1 擁塞控制的方法:
1 慢開始和擁塞避免
(1)慢開始:有小到大逐漸增大發(fā)送窗口笑窜,也就是說,有小到大逐漸增加擁塞窗口的數(shù)據(jù)缕坎,每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后怖侦,就把擁塞窗口增加一個(gè)mss的數(shù)量篡悟,逐漸增大發(fā)送方的擁塞窗口cwnd谜叹。
慢開始算法不可能無限制的增大擁塞窗口的大小,過大的擁塞窗口也會(huì)引起網(wǎng)絡(luò)擁塞搬葬,因此還需要設(shè)置一個(gè)慢開始門限荷腊。
當(dāng)擁塞窗口<慢開始門限時(shí):使用慢開始算法;
當(dāng)擁塞窗口>慢開始門限時(shí):使用擁塞避免算法急凰;
當(dāng)擁塞窗口=慢開始門限時(shí):兩個(gè)算法都可以女仰。
(2)擁塞避免算法:讓擁塞窗口緩慢的增大,每次把擁塞窗口+1而不是翻倍抡锈,這樣可以使擁塞窗口呈線性規(guī)律緩慢的增長(zhǎng)疾忍。
無論是慢開始算法還是擁塞避免算法,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞床三,那么就要把慢開始門限限制為出現(xiàn)擁塞時(shí)發(fā)送窗口的一半一罩。然后把擁塞窗口重新賦值為1,執(zhí)行慢開始算法撇簿,這樣做的目的是快速的減少網(wǎng)絡(luò)中的分組數(shù)聂渊,使發(fā)生擁塞的路由器有足夠的時(shí)間把隊(duì)列中的分組處理完畢。
2 快重傳和快恢復(fù)
(1)快重傳算法要求接收方每收到一個(gè)失序的報(bào)文段后立即發(fā)出重復(fù)確認(rèn)而不要等待自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn)四瘫『核裕快重傳算法規(guī)定,發(fā)送方一旦重復(fù)收到三次某個(gè)報(bào)文段的確認(rèn)找蜜,就需要立即重傳對(duì)方尚未接收到的報(bào)文段饼暑,而不必繼續(xù)等待重傳計(jì)時(shí)器到期。
(2)快恢復(fù)算法一般配合快重傳算法一起使用,當(dāng)發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)的時(shí)候弓叛,就執(zhí)行算法減小算法迈着,把慢開始門限減半,防止網(wǎng)絡(luò)擁塞邪码。接著裕菠,把擁塞窗口的值設(shè)置為慢開始門限減半后的數(shù)值,然后開始執(zhí)行擁塞避免算法闭专,使擁塞窗口緩慢的線性增大奴潘。
六 TCP的運(yùn)輸連接管理
6.1 TCP連接的建立(三次握手)
過程:
發(fā)送方發(fā)送:SYN=1,seq=x給接收方
接收方接到數(shù)據(jù)影钉,返回:SYN=1画髓,ack=x+1,seq=y平委,ACK=1奈虾;
發(fā)送方接到數(shù)據(jù),返回:SYN=1廉赔,ack=y+1,seq=x+1;
經(jīng)過這三個(gè)步奏肉微,我們就可以確認(rèn)已經(jīng)建立了連接了。那么蜡塌,問題來了碉纳,為什么TCP需要多一次的連接確定呢?這個(gè)是主要為了防止已經(jīng)失效的連接請(qǐng)求報(bào)文又突然傳送給了B馏艾,因此產(chǎn)生錯(cuò)誤劳曹。主要表現(xiàn)為:A向B發(fā)出了連接請(qǐng)求,但是這個(gè)時(shí)候琅摩,這個(gè)請(qǐng)求被滯留在了網(wǎng)絡(luò)中铁孵,這個(gè)時(shí)候由于超時(shí)重傳機(jī)制,A又重新發(fā)送了一個(gè)連接請(qǐng)求房资,B重新給與確定蜕劝,這個(gè)時(shí)候AB連接成功,A發(fā)送完數(shù)據(jù)后志膀,斷開了請(qǐng)求熙宇。這個(gè)時(shí)候,網(wǎng)絡(luò)中A的第一次請(qǐng)求又到了B出溉浙,B又重新給A確定連接的應(yīng)答烫止,但是A已經(jīng)發(fā)送完了數(shù)據(jù),因此不會(huì)去理會(huì)這個(gè)B的應(yīng)答戳稽,而B確認(rèn)為A需要傳輸數(shù)據(jù)馆蠕,這樣B的資源就被浪費(fèi)了期升。
6.2 TCP連接的斷開(四次揮手)
過程:
A發(fā)送FIN=1,seq=u給B互躬;(FIN-WAIT-1)
B接收到數(shù)據(jù)播赁,返回:ACK=1,seq=v吼渡,ack=u+1容为;(FIN-WAIT-2)
這個(gè)階段,表面A不再向B發(fā)送數(shù)據(jù)寺酪,但是B如果又?jǐn)?shù)據(jù)放回個(gè)A的話坎背,那么A還是必須接收到的
B發(fā)送 FIN=1,ACK=1寄雀,seq=w,ack=u+1;
A發(fā)送 ACK=1,ack=w+1,seq=u+1;
這個(gè)時(shí)候得滤,B接收到A的應(yīng)答,那么服務(wù)端就會(huì)斷開這次的TCP請(qǐng)求盒犹,而接收端并不會(huì)馬上斷開連接懂更,而是要等待2個(gè)msl后,才會(huì)真正斷開tcp連接急膀,這是為什么呢沮协?
(1)A發(fā)送給B的應(yīng)答報(bào)文可能會(huì)丟失。這個(gè)時(shí)候脖阵,B會(huì)發(fā)生超時(shí)重傳皂股,因此墅茉,A總會(huì)在兩個(gè)msl內(nèi)接收到B的請(qǐng)求斷開報(bào)文命黔;
(2)防止已失效的連接請(qǐng)求報(bào)文出現(xiàn)在本連接中。
我們可以注意到就斤,B斷開TCP連接的時(shí)間悍募,要比A快~~
七 總結(jié)
至此,TCP的介紹已經(jīng)結(jié)束洋机,篇幅很長(zhǎng)坠宴,還是需要好好研究呀~~