首先對(duì)計(jì)算機(jī)網(wǎng)絡(luò)有一定基礎(chǔ)的同學(xué)一定知道OSI的網(wǎng)絡(luò)七層架構(gòu),這是一個(gè)理想化的網(wǎng)絡(luò)架構(gòu)模型。它既復(fù)雜也不實(shí)用,從上至下分別是:應(yīng)用層,表示層,會(huì)話(huà)層,運(yùn)輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層和物理層,而現(xiàn)實(shí)真正得到廣泛應(yīng)用的其實(shí)是基于 TCP/IP的四層網(wǎng)絡(luò)結(jié)構(gòu):應(yīng)用層,運(yùn)輸層,網(wǎng)際層(用網(wǎng)際層這個(gè)名字是為了強(qiáng)調(diào)這一層是解決不同網(wǎng)絡(luò)的互聯(lián)問(wèn)題),網(wǎng)絡(luò)接口層。從實(shí)質(zhì)上講TCP/IP只有最上面的三層,因?yàn)樽钕旅娴木W(wǎng)絡(luò)層接口基本上和一般的通信鏈路沒(méi)有什么區(qū)別,對(duì)于計(jì)算機(jī)網(wǎng)絡(luò)來(lái)說(shuō)沒(méi)有特別的新的東西,在我們學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)時(shí)通常結(jié)合OSI七層模型和TCP/IP四層模型進(jìn)行綜合學(xué)習(xí),結(jié)合兩者的優(yōu)點(diǎn),采用一種五層模型進(jìn)行學(xué)習(xí),既:應(yīng)用層,運(yùn)輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層,物理層,今天這篇文章將要學(xué)習(xí)和分析的是位于運(yùn)輸層的TCP協(xié)議。
運(yùn)輸層:運(yùn)輸層的主要任務(wù)就是負(fù)責(zé)兩個(gè) 主機(jī)進(jìn)程 間的通信提供通用的數(shù)據(jù)傳輸服務(wù),運(yùn)輸層向它的上層應(yīng)用層提供服務(wù),應(yīng)用進(jìn)程 利用該服務(wù)傳送應(yīng)用層報(bào)文。 (注意:通信的不是主機(jī),而是主機(jī)中的進(jìn)程)
TCP: 傳輸控制協(xié)議(Transmission Cotrol Protol),是一個(gè)面向連接的,可靠的端到端的傳輸協(xié)議,其數(shù)據(jù)傳輸單位是:報(bào)文段
TCP的主要特點(diǎn):
1 .面向連接的運(yùn)輸層協(xié)議
2 . 每一條tcp連接只能有兩個(gè)端點(diǎn),每條tcp連接只能是點(diǎn)對(duì)點(diǎn)的
3 .TCP提供 可靠交付 服務(wù),通過(guò)TCP傳輸?shù)臄?shù)據(jù)無(wú)差錯(cuò),無(wú)丟失,無(wú)重復(fù),并且按序到達(dá)
4 .TCP提供全雙工通信,允許通信雙方的進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù),TC連接的兩端都設(shè)有發(fā)送緩沖和接收緩沖,用來(lái)臨時(shí)存放數(shù)據(jù)(發(fā)送時(shí),將數(shù)據(jù)發(fā)送到緩沖,應(yīng)用就可做自己的事,TCP在合適的時(shí)候把數(shù)據(jù)發(fā)出,同理接收時(shí),數(shù)據(jù)先放入緩存,上層的應(yīng)用進(jìn)程合適時(shí)讀取緩存)
5 .面向字節(jié)流,TCP中流入到進(jìn)程和進(jìn)程流出的都是字節(jié)序列,TCP把應(yīng)用程序傳遞下來(lái)的數(shù)據(jù)看成是一連串無(wú)結(jié)構(gòu)的字節(jié)流,并不知道字節(jié)流的含義,TCP不保證數(shù)據(jù)發(fā)送方發(fā)送到數(shù)據(jù)塊數(shù)量和接收方接收接收的數(shù)據(jù)塊數(shù)量一致,因?yàn)榘l(fā)送方可能發(fā)送10個(gè)數(shù)據(jù)塊,但接收方用4個(gè)數(shù)據(jù)塊來(lái)接受全部信息,但是數(shù)接收方接收到的字節(jié)流必須和發(fā)送方發(fā)送的字節(jié)流完全一樣, TCP不關(guān)心應(yīng)用程序一次寫(xiě)入多少數(shù)據(jù)到緩存,而是根據(jù)對(duì)方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞程度,來(lái)決定一個(gè)報(bào)文段應(yīng)包含多少字節(jié)
什么是面向連接?
是指在傳輸數(shù)據(jù)前必須先建立連接(邏輯連接:并非水平方向上的直接連接),數(shù)據(jù)傳輸結(jié)束后再釋放連接
什么是連接?
連接 是TCP中最基本的抽象,我們上文有提到說(shuō),TCP的 每條連接 都是點(diǎn)對(duì)點(diǎn)的,一條連接對(duì)著兩個(gè)端點(diǎn),那這個(gè)端點(diǎn)是什么?其實(shí)也就是我們常說(shuō)的 套接字(Socket) ,套接字是什么?根據(jù)RFC793的定義: 套接字(socket)=(IP地址+端口號(hào)) ,所以說(shuō)兩個(gè)通信的套接字可以確定一條連接,而 連接 其實(shí)就是通信的兩個(gè)端點(diǎn)(套接字)之間的一個(gè)邏輯抽象。
TCP協(xié)議是基于網(wǎng)絡(luò)層的IP協(xié)議的,IP協(xié)議是不可靠的,為什么說(shuō)TCP是可靠的?
因?yàn)樵诓豢煽康木W(wǎng)絡(luò)層之上,TCP是實(shí)現(xiàn)了停止等待協(xié)議和ARQ等協(xié)議,來(lái)保證數(shù)據(jù)報(bào)文傳輸?shù)目煽啃?/p>
可靠傳輸原理
我們知道,TCP發(fā)送的報(bào)文段,會(huì)交給IP層進(jìn)行傳遞,而IP層只能提供最大努力通知服務(wù),也就是說(shuō)TCP下面的網(wǎng)絡(luò)層傳輸是不可靠的的,所以TCP需要采取比必要的措施來(lái)保證運(yùn)輸層中的通信可靠。
停止等待協(xié)議
全雙工通信,雙發(fā)既可以是發(fā)送方也可以是接收方,為理解方便,我們定義A發(fā)送數(shù)據(jù)給B, A為發(fā)送方,B為接收方,我們把傳送的數(shù)據(jù)單元成為分組(不考慮具體是在哪層傳輸?shù)模煌瑢拥慕蟹ú煌?/strong>,停止等待就是每發(fā)送完一個(gè)分組,就等待對(duì)方的的確認(rèn),收到確認(rèn)后再發(fā)送下一個(gè)分組。 正常情況: A發(fā)送一個(gè)分組,B確認(rèn)一個(gè)分組,以此下去直到發(fā)送完畢。 但是一直無(wú)差錯(cuò)是不可能的,數(shù)據(jù)包傳輸?shù)倪^(guò)程中可能丟失,也可能B收到后檢測(cè)錯(cuò)誤直接丟棄,對(duì)于B來(lái)說(shuō),沒(méi)收到分組,或者分組檢測(cè)有誤丟棄,是不會(huì)給A報(bào)告信息的。所以可靠的傳輸協(xié)議就是如下設(shè)計(jì)的,A如果一段時(shí)間內(nèi)沒(méi)有接收到B的確認(rèn),就認(rèn)為剛才的分組丟失了,所以就重傳前面發(fā)過(guò)的分組,這就是 超時(shí)重傳,要實(shí)現(xiàn)超時(shí)重傳,就必須設(shè)置一個(gè)超時(shí)計(jì)時(shí)器,如果規(guī)定時(shí)間內(nèi)收到確認(rèn),就撤銷(xiāo)該計(jì)時(shí)器,否則就重傳。
重傳細(xì)節(jié)
1.A發(fā)送完分組后,必須暫時(shí)保留一個(gè)分組的副本或者備份,防止重傳,只有收到確認(rèn)后才清除。
2 .分組和確認(rèn)分組都必須編號(hào),這樣才能明確哪一個(gè)發(fā)出的分組得到了確認(rèn)。
3 .超時(shí)計(jì)時(shí)器設(shè)置的重傳時(shí)間應(yīng)當(dāng)比分組傳輸平均往返時(shí)間長(zhǎng)一些
確認(rèn)丟失和確認(rèn)遲到
B發(fā)送的確認(rèn)分組丟失了,那么A在超時(shí)重傳的時(shí)間內(nèi)沒(méi)有收到確認(rèn)就會(huì)重新發(fā)送,但是A無(wú)法確認(rèn)是自己發(fā)出的分組丟失出錯(cuò),還是B發(fā)送的確認(rèn)丟失了,如果是B的確認(rèn)丟失了,此時(shí)A重傳的分組已經(jīng)收到,那么B需要進(jìn)行一下兩個(gè)處理:
1 . 丟棄接收到的A重傳的分組
2 .向A發(fā)送確認(rèn),防止A繼續(xù)重傳。
B對(duì)分組的確認(rèn)延遲,這樣就會(huì)導(dǎo)致A收到重復(fù)的確認(rèn),對(duì)重讀的去人處理比較簡(jiǎn)單,收下后丟棄,B任然回收到重復(fù)的分組,同樣丟棄分組,重傳確認(rèn)分組即可。
使用上述的確認(rèn)和重傳機(jī)制,就可以實(shí)現(xiàn)在不可靠的網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的通信,上述的這種可靠的傳輸協(xié)議被成武自動(dòng)重傳請(qǐng)求ARQ(Automatic Repeat reQuest)。
停止等待協(xié)議簡(jiǎn)單,但是缺點(diǎn)也明顯,信道利用率太低,所以為了提高發(fā)送速率,發(fā)送方可以不使用抵消的停止等待協(xié)議,而是采用 流水線傳輸
流水線傳輸:發(fā)送方可以連續(xù)發(fā)送多個(gè)分組,不必發(fā)完一個(gè)分組就停下來(lái)等待確認(rèn),這樣可以使得信道上一直有數(shù)據(jù)不間斷的傳送。這種方式可以獲得很高的信道利用率。使用流水線傳輸時(shí)需要使用 連續(xù)ARQ協(xié)議和滑動(dòng)窗口協(xié)議
待續(xù)。。。。。