04741 計算機網(wǎng)絡(luò)原理第三章
傳輸層為網(wǎng)絡(luò)應(yīng)用進程之間的通信提供了端到端的報文傳輸服務(wù)。在五層參考模型中,傳輸層位于應(yīng)用層和網(wǎng)絡(luò)層之間,向下使用網(wǎng)絡(luò)層提供的分組傳輸服務(wù),向上為各種網(wǎng)絡(luò)應(yīng)用提供端到端的報文傳輸服務(wù)。傳輸層是除應(yīng)用層外唯一的端到端層,是支持應(yīng)用進程之間的端到端通信的重要一層,絕大多數(shù)網(wǎng)絡(luò)應(yīng)用都直接使用傳輸層提供的端到端報文傳輸服務(wù)。
第一節(jié)?傳輸層的基本服務(wù)
一、傳輸層功能
傳輸層的核心任務(wù)是為應(yīng)用進程之間提供端到端的邏輯通信服務(wù)。為此,傳輸層主要實現(xiàn)如下功能:傳輸層尋址;對應(yīng)用層報文進行分段和重組;對報文進行差錯檢測;實現(xiàn)進程
間端到端可靠數(shù)據(jù)傳輸控制;面向應(yīng)用層實現(xiàn)復(fù)用與分解;實現(xiàn)端到端的流量控制;擁塞
控制等。當(dāng)然,并不是所有傳輸層協(xié)議都要實現(xiàn)所有這些功能,通常大部分傳輸層協(xié)議只
實現(xiàn)其中一部分功能。不同傳輸層協(xié)議提供的服務(wù)也不同,例如,Internet 的傳輸層主要有
兩個協(xié)議:面向連接的 TCP 和無連接的 UDP,前者提供可靠數(shù)據(jù)傳輸服務(wù),而后者則不提
供可靠數(shù)據(jù)傳輸服務(wù)。
???傳輸層協(xié)議為運行在不同主機或不同端系統(tǒng)上的進程提供了邏輯通信服務(wù)。
???作為向上層應(yīng)用提供端到端邏輯通信服務(wù)的傳輸層協(xié)議,只需要在端系統(tǒng)中實現(xiàn),而在路由器等網(wǎng)絡(luò)設(shè)備中理論上無需實現(xiàn)傳輸層協(xié)議。因此,當(dāng)網(wǎng)絡(luò)邊緣中的兩臺主機通過網(wǎng)絡(luò)核心進行端到端的通信時,只有主機的協(xié)議棧中才有傳輸層協(xié)議,而在網(wǎng)絡(luò)核心部分中的路由器在轉(zhuǎn)發(fā)分組時只用到下三層的功能,即不需要使用傳輸層協(xié)議。
???從傳輸層的角度看,通信的真正端點并不是主機,而是主機中運行的應(yīng)用程序,也就是說,端到端的通信是在【應(yīng)用進程】之間的通信。
???大部分計算機網(wǎng)絡(luò)的傳輸層都設(shè)計實現(xiàn)了多種傳輸層協(xié)議,實現(xiàn)不同功能,提供不同類型或不同性能的服務(wù),滿足不同網(wǎng)絡(luò)應(yīng)用對不同傳輸服務(wù)質(zhì)量(Qos)的需求。例如,Internet網(wǎng)絡(luò)有兩種傳輸層協(xié)議,即TCP和UDP,TCP提供面向連接的、可靠的、有序的字節(jié)流服務(wù),UDP則提供無連接、不可靠的數(shù)據(jù)包傳輸服務(wù)。
二、傳輸層尋址與端口
???傳輸層為應(yīng)用進程之間提供端到端的邏輯通信服務(wù)。
???傳輸層為了支持運行在不同主機、不同操作系統(tǒng)上的應(yīng)用進程之間的通信,必須用統(tǒng)一的尋址方法對應(yīng)用進程進行標識。TCP/IP 體系結(jié)構(gòu)網(wǎng)絡(luò)的解決方法就是在傳輸層使用協(xié)議端口號(protocol port number),通常簡稱為端口(port),在全網(wǎng)范圍內(nèi)利用“IP 地址+端口 ?號”唯一標識一個通信端點。IP 地址唯一標識進程運行在哪個主機上,同一主機上傳輸層協(xié)議端口號則可以唯一對應(yīng)一個應(yīng)用進程。
???傳輸層端口號為16位整數(shù),其中0?1023為熟知端口號;1024?49151為登記端口號,為沒有熟知端口號的應(yīng)用程序(服務(wù)器)使用,必須在互聯(lián)網(wǎng)數(shù)字分配結(jié)構(gòu)(The Internet
Assigned Numbers Authority, IANA)登記,以防止重復(fù);49152~65535為客戶端口號或短暫端口號,留給客戶進程或用戶開發(fā)的非標準服務(wù)器暫時使用。另外,端口號只本地有效,只是標識了本計算機應(yīng)用層中的各應(yīng)用進程在與傳輸層交互時的層間接口,在 Internet 不同計算機中運行的網(wǎng)絡(luò)應(yīng)用進程可能使用相同的端口號。
????基于上述機制,兩臺計算機中的網(wǎng)絡(luò)應(yīng)用進程要相互通信,不僅必須知道對方的IP地址(標識對方運行的計算機),而且還要知道對方的端口號(標識對方計算機中的傳輸層與應(yīng)用進程的接口)。Internet上的網(wǎng)絡(luò)應(yīng)用通信基本過程是客戶/服務(wù)器通信方式,客戶在發(fā)起通信請求時,必須知道服務(wù)器的IP地址和端口號。傳輸層的端口號又分為服務(wù)器端使用的端口號與客戶端使用的端口號兩大類。服務(wù)器端使用的端口號包括上面提到過的熟知端口號與登記端口號,IANA將熟知端口號指派給TCP/IP最重要的一些應(yīng)用程序(通常也稱為標準服務(wù)),作為這些應(yīng)用的服務(wù)器默認端口號,便于用戶熟記,如FTP服務(wù)器默認端口號是21,HTTP服務(wù)器默認端口號80,SMTP服務(wù)器默認端口號是25,DNS服務(wù)器默認端口號是53。
???客戶端使用的端口號僅在客戶進程運行時才動態(tài)選擇,具有臨時性,通常在客戶進程運行時由操作系統(tǒng)隨機選取唯一的未被使用的端口號。在客戶/服務(wù)器通信中,通信總是由客戶發(fā)起,當(dāng)服務(wù)器進程接收到客戶端進程的報文時,就可以獲得客戶進程所使用的端口號,因而可以把數(shù)據(jù)發(fā)送給客戶進程。當(dāng)通信結(jié)束后,剛才已使用過的客戶端端口號就可以釋放了,這個端口號就可以供其他客戶進程以后使用。
三、無連接服務(wù)與面向連接服務(wù)
傳輸層提供的服務(wù)可以分為無連接服務(wù)和面向連接服務(wù)兩大類。無連接服務(wù)是指數(shù)據(jù)傳輸之前無需與對端進行任何信息交換(即“握手”),直接構(gòu)造傳輸層報文段并向接收端發(fā)
送;面向連接服務(wù)是指在數(shù)據(jù)傳輸之前,需要雙方交換一些控制信息,建立邏輯連接,然
后再傳輸數(shù)據(jù),數(shù)據(jù)傳輸結(jié)束后還需要再拆除連接。無連接服務(wù)類似于郵政系統(tǒng)的信件通
信, ?郵寄信件之前無需跟收件人交換任何信息,直接寫好信件,交給郵遞員投遞就可以了;
面向連接服務(wù)類似于電話通信,必須首先撥號,建立電話連接,對方接起電話后,才可以
進行語音交互通信,通信結(jié)束后還需要掛斷電話,拆除連接。當(dāng)然,電話通信建立的是電
路連接,傳輸層提供面向連接服務(wù)時,建立的是邏輯連接。Internet網(wǎng)絡(luò)提供無連接服務(wù)的
傳輸層協(xié)議是UDP,提供面向連接服務(wù)的傳輸層協(xié)議是TCP。
第二節(jié)?傳輸層的復(fù)用與分解
支持眾多應(yīng)用進程共用同一個傳輸層協(xié)議,并能夠?qū)⒔邮盏降臄?shù)據(jù)準確交付給不同的應(yīng)用進程,是傳輸層需要實現(xiàn)的一項基本功能,稱為傳輸層的多路復(fù)用與多路分解,簡稱為復(fù)
用與分解,也稱為復(fù)用與分用。
事實上,復(fù)用與分解不僅在傳輸層進行,在他層協(xié)議(比如IP等)也需要完成這一功能。
在同一主機上,多個應(yīng)用進程同時利用一個傳輸層協(xié)議(比如UDP或TCP)進行網(wǎng)絡(luò)通信,此時該傳輸層協(xié)議就被多個應(yīng)用進程【復(fù)用】;另外,傳輸層協(xié)議接收到的報文段中,可能封裝了不同應(yīng)用進程的數(shù)據(jù),傳輸協(xié)議需要(通過正確的端口)將數(shù)據(jù)交付給正確的應(yīng)用進程,即實現(xiàn)【分解】。
實現(xiàn)復(fù)用與分解的關(guān)鍵是傳輸層協(xié)議能夠唯一標識一個套接字。
一個網(wǎng)絡(luò)應(yīng)用進程通過一個或多個套接字,實現(xiàn)傳輸層之間的數(shù)據(jù)傳遞,即發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。
Internet傳輸層協(xié)議的報文段中都有源端口號和目的端口號字段。在接收端,傳輸層協(xié)議讀取報文段中的這些字段,標識出接收套接字,進而通過該套接字,將傳輸層報文段中的數(shù)據(jù)交付給正確的套接字,這一過程就是多路分解。在源主機,傳輸層協(xié)議從不同套接字收集應(yīng)用進程(可能時不同的網(wǎng)絡(luò)應(yīng)用)發(fā)送的數(shù)據(jù)塊,并為每個數(shù)據(jù)塊封裝上首部信息(包括用于分解的信息)構(gòu)成報文段,然后將報文段傳遞給網(wǎng)絡(luò)層,這一過程就是多路復(fù)用。?
一、無連接的多路復(fù)用與多路分解
Internet傳輸層提供無連接服務(wù)的傳輸層協(xié)議是UDP。
簡述為UDP套接字分配端口號的兩種方法
一種方法是創(chuàng)建一個UDP套接字時,傳輸層自動地為該套接字分配一個端口號(通常從1024~65535分配一個端口號),該端口號當(dāng)前未被該主機中任何其他UDP套接字使用;另一種方法是,在創(chuàng)建一個UDP套接字后,通過調(diào)用bind()函數(shù)為該套接字綁定一個特定的端口號。
?
UDP套接字的端口號是UDP實現(xiàn)【復(fù)用與分解】的重要依據(jù)。
二、面向連接的多路復(fù)用與多路分解
Internet傳輸層提供面向連接服務(wù)的是TCP。TCP套接字與UDP套接字不同,TCP套接字是由一個四元組:<源IP地址,源端口號,目的IP地址,目的端口號>來唯一標識的。實質(zhì)上,TCP通過這樣一個四元組唯一標識一條TCP連接。當(dāng)一個TCP報文段從網(wǎng)絡(luò)層到達一臺主機時,該主機使用全部4個值來將報文段分解到相應(yīng)的套接字。特別的,當(dāng)TCP接收到兩個具有不同的源IP地址或者源端口號的TCP報文段時,即使兩個報文段的目的IP地址和目的端口號相同,TCP也會將兩個報文段分解到兩個不同的套接字。顯然,這與UDP完全不同。
TCP 服務(wù)器可以同時支持多個 TCP 套接字,每個套接字與一個進程(或線程)相關(guān)聯(lián),并由一個四元組來標識每個套接字。當(dāng)一個 TCP報文段到達主機時,4 個字段都被用來將報文段分解到相應(yīng)的套接字。需要再次說明的是,四元組中的源端口號和目的端口號是TCP 報文段首部字段,而源IP地址和目的IP地址則是封裝TCP報文段的IP數(shù)據(jù)報的首部字段。
?
簡述在Internet網(wǎng)絡(luò)中如何通過套接字實現(xiàn)精確分解?
概括來說,在 Internet 網(wǎng)絡(luò)中,唯一標識套接字的基本信息是 IP 地址和端口號。UDP基于目的IP地址和目的端口號二元組唯一標識一個UDP套接字,從而可以實現(xiàn)精確分解; ?TCP則需要基于源IP地址、目的IP地址、源端口號和目的端口號四元組唯一標識一個 TCP ?套接字(即一個 TCP 連接),從而實現(xiàn)精確分解。
第三節(jié)?停-等協(xié)議與滑動窗口協(xié)議
Internet 傳輸層主要有兩個協(xié)議:UDP和TCP,其中TCP就可以提供可靠數(shù)據(jù)傳輸服務(wù)。但是,TCP發(fā)送的報文段都是交給IP傳送的,而IP只能提供“盡力”服務(wù),也就是不可靠的數(shù)據(jù)包傳輸服務(wù)。顯然,TCP必須采取適當(dāng)?shù)拇胧┎拍苁蛊湓诨诓豢煽康木W(wǎng)絡(luò)層的基礎(chǔ)上,實現(xiàn)可靠數(shù)據(jù)傳輸,為應(yīng)用層提供可靠報文傳輸服務(wù)。
一、可靠數(shù)據(jù)傳輸基本原理
理想傳輸信息不產(chǎn)生差錯(即比特跳變),并提供按序交付服務(wù)的理想或邏輯信道。大部分傳輸信道,例如實際的網(wǎng)絡(luò)傳輸服務(wù),都不是理想傳輸信道。需要特別注意的是,這里所說的傳輸信道可以是網(wǎng)絡(luò)層提供的主機到主機的邏輯通信服務(wù),可以是傳輸層提供的進程到進程的端到端的邏輯通信服務(wù),也可以是提供信號傳輸?shù)奈锢礞溌贩?wù)等,因此可靠數(shù)據(jù)傳輸基本原理、停-等協(xié)議以及滑動窗口協(xié)議等,不僅適用于指導(dǎo)設(shè)計支持可靠數(shù)據(jù)傳輸?shù)膫鬏攲訁f(xié)議,也適用于指導(dǎo)設(shè)計其他層的可靠傳輸協(xié)議,如數(shù)據(jù)鏈路層協(xié)議等。
簡述不可靠傳輸信道的不可靠性主要表現(xiàn)
首先,不可靠傳輸信道在傳輸數(shù)據(jù)的過程中,可能發(fā)生比特差錯。也就是說,交付給這樣的信道傳輸?shù)臄?shù)據(jù)可能出現(xiàn)比特跳變,即0錯成1或1錯成0的現(xiàn)象。
其次,不可靠傳輸信道在傳輸數(shù)據(jù)的過程中,可能出現(xiàn)亂序,即先發(fā)的數(shù)據(jù)包后到達,后發(fā)的數(shù)據(jù)包先到達。
最后,不可靠傳輸信道在傳輸數(shù)據(jù)的過程中,可能出現(xiàn)數(shù)據(jù)丟失,即部分數(shù)據(jù)會在中途丟失,不能到達目的地。
?
簡述傳輸層實現(xiàn)可靠數(shù)據(jù)傳輸?shù)闹饕胧?/p>
1、差錯檢測:利用差錯編碼實現(xiàn)數(shù)據(jù)包傳輸過程中的比特差錯檢測(甚至糾正)。
2、確認:接收方向發(fā)送方反饋接收狀態(tài)。
3、重傳:發(fā)送方重新發(fā)送接收方?jīng)]有正確接收的數(shù)據(jù)。
4、序號:確保數(shù)據(jù)按序提交。
5、計時器:解決數(shù)據(jù)丟失問題。?
有效、合理地綜合應(yīng)用上述措施,就可以設(shè)計出實現(xiàn)可靠數(shù)據(jù)傳輸?shù)膮f(xié)議。基于這些措施設(shè)計的、具有代表性的可靠數(shù)據(jù)傳輸協(xié)議當(dāng)屬停-等協(xié)議和滑動窗口協(xié)議。
二、停-等協(xié)議
基于重傳機制的可靠數(shù)據(jù)傳輸協(xié)議稱為自動重傳請求(Automatic Repeat reQuest, ARQ)協(xié)議。最簡單的ARQ協(xié)議就是停-等協(xié)議。
簡述停-等協(xié)議的特點和基本工作過程
停-等協(xié)議的主要特點就是每發(fā)送一個報文段后就停下來等待接收方的確認,這也是該協(xié)議
名稱的基本含義。停-等協(xié)議的基本工作過程是:發(fā)送方發(fā)送經(jīng)過差錯編碼和編號的報文段,
等待接收方的確認;接收方如果正確接收報文段,即差錯檢測無誤且序號正確,則接收報
文段,并向發(fā)送方發(fā)送ACK,否則丟棄報文段,并向發(fā)送方發(fā)送NAK;發(fā)送方如果收ACK,則繼續(xù)發(fā)送后續(xù)報文段,否則重發(fā)剛剛發(fā)送的報文段。
???停-等協(xié)議雖然簡單,但在應(yīng)用實現(xiàn)可靠數(shù)據(jù)傳輸?shù)母鞣N措施時,仍然存在許多的變化或細節(jié)需要討論。
1、關(guān)于差錯檢測。對于底層傳輸信道可能產(chǎn)生比特差錯的情況下,不僅報文段的傳輸可能
發(fā)生比特差錯,ACK或NAK數(shù)據(jù)包在通過底層信道傳輸時同樣可能會發(fā)生比特差錯,因
此對報文段和ACK或NAK數(shù)據(jù)包均需進行差錯編碼以便進行差錯檢測。
2、關(guān)于序列號。對于停-等協(xié)議,序列號字段只需要1位就足夠了,因為在停-等協(xié)議中,
只需利用報文段的序號區(qū)分是新發(fā)的報文段還是重傳的報文段。接收方根據(jù)報文段的序號
就可以知道發(fā)送方是否正在重傳前一個報文段(即接收到的報文段序號與最近收到的報文
段序號相同),還是一個新報文段(即序號變化了,用模2運算“前向”移動了)。
3、關(guān)于ACK和NAK。如前所述,在停-等協(xié)議中,接收端可以利用ACK進行肯定確認,
利用NAK進行否定確認。但在實際的協(xié)議設(shè)計過程中,通常不使用NAK,而只使用ACK進行確認,這樣可以減少數(shù)據(jù)包的種類,降低協(xié)議的復(fù)雜性。這會帶來一個新的問題,那就是當(dāng)接收端接收到的報文段出現(xiàn)差錯時,如何向發(fā)送端進行確認呢?顯然,如果只簡單地發(fā)送 ACK 是肯定不行的,那會被發(fā)送方誤解接收端已經(jīng)正確接收了剛剛發(fā)送的報文段。為此,需要對 ACK 做細微的改進,即在ACK數(shù)據(jù)包中帶上所確認的報文段序列號。例如,接收端當(dāng)前正期望接收0號報文段,接收方收到報文段后首先進行差錯檢測,如果未發(fā)生差錯,且報文段序號為0,則接收報文段,并向發(fā)送方發(fā)送ACK0,對0號報文段進行確認;如果檢測到報文段有差錯,或報文段不是0號報文(即1號報文段,為重復(fù)報文段),則丟棄該報文段,并向發(fā)送方發(fā)送ACK1,進行確認,相當(dāng)于對上一個正確接收的1號報文段再次進行肯定確認。當(dāng)發(fā)送方再次收到 ACK1 時,即收到重復(fù)的 ACK1,則表明剛剛發(fā)送的0號報文段沒有被接收方正確接收,所以需要重發(fā)。也就是說,利用重復(fù) ACK 替代了NAK。
4、關(guān)于ACK或NAK差錯。在ACK或NAK數(shù)據(jù)包中增加了差錯編碼后,發(fā)送方可以檢測出ACK 或NAK是否發(fā)生差錯。如果發(fā)送方檢測出ACK或NAK差錯,則不能準確判斷接收方是否已正確接收報文段或者沒有接收報文段。在這種情況下,為了確保可靠傳輸,發(fā)送方采取“有錯推斷”'原則,即推斷接收方?jīng)]有正確接收相應(yīng)的報文段。因此,當(dāng)發(fā)送方檢測到收到的ACK或NAK有差錯時,便重傳剛剛發(fā)送的報文段。當(dāng)然,這可能帶來一個新問題,就是接收方可能重復(fù)接收到同一個報文段,但接收方可以通過報文段的序號判斷是否是重復(fù)的報文段,對于重復(fù)到達的報文段進行丟棄并確認即可。
?
停-等協(xié)議綜合應(yīng)用了差錯檢測、確認、重傳、序號和計時器等措施,每種措施都在協(xié)議的運行中起到了至關(guān)重要的作用,實現(xiàn)了可靠數(shù)據(jù)傳輸。停-等協(xié)議的特點是簡單、所需緩存存儲空間小。
三、滑動窗口協(xié)議
停-等協(xié)議是一個功能正確的協(xié)議,但其性能通常并不能令人滿意。停-等協(xié)議的主要性能問題在于它的停止-等待機制降低了信道的利用率。
解決這種特殊性能問題的一個簡單方法是:不使用停-等協(xié)議的停止—等待運行方式,允許發(fā)送方在沒有收到確認前連續(xù)發(fā)送多個分組。
?
如果發(fā)送方可以在等待確認之前連續(xù)發(fā)送 3 個分組,則協(xié)議的信道利用率相對于停-等協(xié)議就提高到3倍。在這種可靠數(shù)據(jù)傳輸協(xié)議中,從發(fā)送方向接收方傳送的系列分組可以看成是填充到一條流水線(或一條管道)中,故稱這種協(xié)議為流水線協(xié)議或管道協(xié)議。
相對于停-等協(xié)議,流水線協(xié)議實現(xiàn)可靠數(shù)據(jù)傳輸時,需要做如下的改進。
1、必須增加分組序號范圍。必須確保每個正在傳送中、未被確認的分組有一個唯一的 ?序號(重傳的分組除外),以便準確區(qū)分每一個未被確認的分組。因此,在流水線可靠傳輸 ?協(xié)議中,分組中的序號字段需要多位,而不能像停-等協(xié)議那樣只使用1位序號。
2、協(xié)議的發(fā)送方和(或)接收方必須緩存多個分組。發(fā)送方最低限度應(yīng)當(dāng)能緩沖那些 ?已發(fā)送但沒有確認的分組,一旦其中任何一個或多個分組丟失或錯誤,發(fā)送方可以從緩存中
取出相應(yīng)的分組,重發(fā)這些分組進行糾錯。類似地,接收方或許也需要緩存那些已正確到達 ?但不是按序到達的分組,以便等缺失的分組到達后一并按序向上層提交數(shù)據(jù)。
最典型的【流水線可靠傳輸協(xié)議】是【滑動窗口協(xié)議】。
發(fā)送窗口內(nèi)的序號,可能存在 3 種狀態(tài)。
1) ?已用未被確認序號。
2) ?已用且已被確認序號。
3) ?可用但尚未使用的序號。
當(dāng)前接收窗口中的序號,可能存在兩種狀態(tài):一種是期望接收但未收到的序號;另一種是
已接收序號。
1.?GBN協(xié)議
GBN協(xié)議的發(fā)送端緩存能力較高,可以在未得到確認前連續(xù)發(fā)送多個分組,因此,GBN協(xié)議的發(fā)送窗口Ws≥1。GBN接收端緩存能力很低,只能接收1個按序到達的分組,不能緩存未按序到達的分組,通常稱GBN協(xié)議的接收端無緩存能力。因此,GBN協(xié)議的接收窗口Wr=1。
?
GBN 發(fā)送方必須響應(yīng) 3 種類型的事件。
1) ?上層調(diào)用。當(dāng)上層調(diào)用GBN協(xié)議時,發(fā)送方首先檢查發(fā)送窗口是否已滿,即是否有Ws個已發(fā)送但未被確認的分組。如果窗口未滿,則用“下一個可用序號”編號新的分組并發(fā)
送,更新“下一個可用序號”(加1);如果窗口已滿,發(fā)送方則暫不響應(yīng)上層調(diào)用,拒絕發(fā)送新的數(shù)據(jù)。
2)?收 到 1個ACKn。GBN 協(xié)議采用累積確認(cumulative acknowledgment)方式,即當(dāng)發(fā)送方收到ACKn 時,表明接收方已正確接收序號為n以及序號小于n的所有分組。如果 n在當(dāng)前發(fā)送窗口范圍內(nèi),則表明至少1個已發(fā)送未被確認分組得到了確認,發(fā)送窗口滑動到“基序號”為 n+1 的位置;窗口滑動后,如果還有未被確認的分組,則重新啟動計時器,否則停止計時。當(dāng)GBN協(xié)議只使用ACK肯定確認時,發(fā)送方可能會收到對同一個序號的多次重復(fù)確認,被重復(fù)確認的序號在當(dāng)前發(fā)送窗口的左側(cè),即n小于當(dāng)前窗口的“基序號”。 收到重復(fù)ACK確認時,發(fā)送方可以不予理會。
3)?計時器超時。GBN協(xié)議發(fā)送方只使用1個計時器,且只對當(dāng)前發(fā)送窗口的“基序號”
指向的分組進行計時。如果出現(xiàn)超時,發(fā)送方重傳當(dāng)前發(fā)送窗口中所有已發(fā)送但未被確認的分組,這也是為什么將GBN協(xié)議稱為“回退N步”協(xié)議的原因。實質(zhì)上,GBN協(xié)議之所以“回退N步”,是因為Wr=l,即接收方無緩存能力。如果發(fā)送方收到一個ACK,窗口滑動后仍有已發(fā)送但未被確認的分組,則定時器重新啟動;如果沒有已發(fā)送但未被確認的分組,該定時器終止。
GBN 協(xié)議的接收方的操作很簡單:因為 Wr=1,所以 GBN 接收方只能接收當(dāng)前接收窗口中序號(即“基序號”)所指向的分組。
??在差錯率較低的情況下,GBN協(xié)議的信道利用率會得到很大提高。但是,如果信道誤碼率或丟包率較高,會導(dǎo)致大量分組的重發(fā)(包括那些正確到達接收方的失序分組),使信道傳輸能力降低。GBN協(xié)議比較適用于低誤碼率、低丟包率、帶寬高時延積信道,且接收方緩存【能力要求低】。
?
2.?SR協(xié)議
若改進GBN協(xié)議的設(shè)計,增加接收方緩存能力(即令Wr≥1),緩存那些正確到達但失序的分組,等缺失分組到達后一并向上層按序提交。當(dāng)然,這同時需要改進確認方式,使發(fā)送方及時確認哪些分組已經(jīng)被正確接收(未必是按序接收),以免發(fā)送方超時重傳這些已經(jīng)被接收方正確接收了的分組。這種設(shè)計可以在信道差錯率或丟包率增加的情況下,減少不必要的分組重傳,改進協(xié)議的性能?;谶@種設(shè)計思想的滑動窗口協(xié)議就是選擇重傳(SR)協(xié)議。
顧名思義,選擇重傳(SR)協(xié)議是通過讓發(fā)送方僅重傳那些未被接收方確認(出錯或丟失)的分組,而避免了不必要的重傳。為此,SR協(xié)議的接收方是對每個正確接收的分組進行逐個確認。SR協(xié)議的發(fā)送窗口和接收窗口都大于1,雖然理論上發(fā)送窗口和接收窗口大小可以不相等,但很多SR協(xié)議設(shè)計取相同的發(fā)送窗口和接收窗口大小。
SR協(xié)議的發(fā)送方可以連續(xù)發(fā)送多個分組,每個分組在當(dāng)前發(fā)送窗口中必須有唯一的編號。
SR 發(fā)送方主要響應(yīng)3個事件,并完成相應(yīng)操作
1)上層調(diào)用,請求發(fā)送數(shù)據(jù)。
2)定時器超時。
3)收到 ACKn
SR 協(xié)議接收方的主要操作分以下3種情況:
1) ?正確接收到序號在接收窗口范圍內(nèi)的分組PKT
2) ?正確接收到序號在接收窗口左側(cè)的分組PKTn。
3) ?其他情況,接收方可以直接丟棄分組,不做任何響應(yīng)。
第四節(jié)?用戶數(shù)據(jù)報協(xié)議(UDP)
用戶數(shù)據(jù)報協(xié)議UDP是Internet傳輸層協(xié)議,提供無連接、不可靠、數(shù)據(jù)報盡力傳輸服務(wù)。UDP 是一種輕量級傳輸層協(xié)議,只提供最基本的傳輸層服務(wù)。UDP是無連接的,因此在支持兩個進程間通信時,沒有握手過程。UDP提供一種不可靠數(shù)據(jù)傳送服務(wù),也就是說,當(dāng)應(yīng)用進程將一個報文發(fā)送進UDP套接字時,UDP并不保證將該報文送達到目的接收進程。不僅如此,在發(fā)送方依次發(fā)送的報文段,UDP即便將這些報文段送達到接收進程,也可能是亂序到達的。UDP沒有擁塞控制機制,所以UDP發(fā)送端可以用任何速率向其下層(即網(wǎng)絡(luò)層)注入數(shù)據(jù)。當(dāng)然,實際端到端吞吐量可能小于這種速率,這可能是因為中間鏈路的帶寬受限或因為網(wǎng)絡(luò)擁塞而造成的。
傳輸層協(xié)議必須至少做一點點事情,即必須提供一種復(fù)用/分解服務(wù),這樣才能在網(wǎng)絡(luò)層與正確的應(yīng)用進程之間傳遞數(shù)據(jù)。
UDP就是只做了傳輸層協(xié)議需要完成的最少功能的協(xié)議,除了復(fù)用/分解功能以及簡單的差錯檢測外,幾乎沒有對網(wǎng)絡(luò)層的IP增加任何功能。
DNS是一個使用【UDP】的應(yīng)用層協(xié)議的例子。
使用 UDP 的原因
1) ?應(yīng)用進程更容易控制發(fā)送什么數(shù)據(jù)以及何時發(fā)送。
2) ?無需建立連接。
3) ?無連接狀態(tài)。
4) ?首部開銷小。
簡述UDP提供的服務(wù)的主要特征。
(1)應(yīng)用進程更容易控制發(fā)送什么數(shù)據(jù),以及何時發(fā)送。采用UDP時,只要應(yīng)用進程將數(shù)據(jù)傳遞給UDP,UDP就會將此數(shù)據(jù)打包進UDP報文段并立即將其傳遞給網(wǎng)絡(luò)層。
(2)無需建立連接。UDP不需要任何準備即可進行數(shù)據(jù)傳輸。因此,UDP不會引入建立連接(根本就無連接)的時延。
(3)無連接狀態(tài)。UDP是無連接的,因此也無需維護連接狀態(tài)。
(4)首部開銷小。UDP僅有8字節(jié)的開銷。
?
??需要說明的一點是,雖然UDP提供不可靠傳輸服務(wù),但使用UDP的應(yīng)用仍然可以實現(xiàn)可靠數(shù)據(jù)傳輸。這可以通過在應(yīng)用程序自身中建立可靠傳輸機制來完成,如前面介紹的停-等協(xié)議或滑動窗口協(xié)議等。也就是說,應(yīng)用進程可以使用UDP的同時進行可靠通信,只是需要在【應(yīng)用層設(shè)計可靠傳輸機制】而已。
?
一、UDP數(shù)據(jù)報結(jié)構(gòu)
0 ?????????????????????????????????????16 ???????????????????????????????????31
源端口號
目的端口號
長度
校驗和
應(yīng)用數(shù)據(jù)
簡述UDP數(shù)據(jù)報結(jié)構(gòu)中各字段的含義
UDP首部只有4個字段,每個字段由兩個字節(jié)組成。源和目的端口號用于UDP實現(xiàn)復(fù)用與分解。長度字段指示了在UDP報文段中的字節(jié)數(shù)(首部和數(shù)據(jù)的總和)。接收方使用校驗和來檢測該數(shù)據(jù)報是否出現(xiàn)了差錯。
二、UDP校驗和
UDP 校驗和提供了差錯檢測功能。
UDP 在計算校驗和時,對所有參與運算的內(nèi)容(包括UDP報文段)按16位(16位對 ?齊)求和,求和過程中遇到的任何溢出(即進位)都被回卷(即進位與和的最低位再加)。最后得到的和取反碼,就是UDP的校驗和,填入UDP數(shù)據(jù)報的校驗和字段。UDP 在生成校驗和時,校驗和字段取全0。參與UDP校驗和計算的內(nèi)容包括 3 部分:UDP 偽首部、UDP首部和應(yīng)用層數(shù)據(jù)。
第五節(jié)?傳輸控制協(xié)議(TCP)
傳輸控制協(xié)議(TCP)是Internet一個重要的傳輸層協(xié)議。TCP提供面向連接、可靠、有序、字節(jié)流傳輸服務(wù)。為了提供可靠數(shù)據(jù)傳輸,TCP采用了前面所討論的許多措施,其中 ?包括差錯檢測、重傳、累積確認、定時器以及序號和確認序號等。
一、TCP報文段結(jié)構(gòu)
TCP 報文段由首部字段和一個數(shù)據(jù)字段組成。
1) 源端口號與目的端口號字段分別占16位,標識發(fā)送該報文段的源端口和目的端口, ?用于多路復(fù)用/分解來自或送到上層應(yīng)用的數(shù)據(jù)。?
2)?序號字段與確認序號字段分別占32位。?
3) 首部長度字段占4位,指出 TCP 段的首部長度,以4字節(jié)為計算單位,例如該字段值為5時,表示TCP段的首部長度為20字節(jié)。由于TCP選項字段的原因,TCP首部的長度是可變的。當(dāng)該字段取最大值15時,表示TCP段的最大首部長度,即60字節(jié)??梢?,TCP 段的選項字段最多為40字節(jié)。
4)保留字段占6位,保留為今后使用,目前值為0。
5)URG、ACK、PSH、RST、SYN 和 FIN 字段各占1位,共占6位,為6位標志位(字
段)。
6)接收窗口字段占16位,用于向?qū)Ψ酵ǜ娼邮沾翱诖笮。▎挝粸樽止?jié)),表示接收方愿意(或還可以)接收的應(yīng)用層數(shù)據(jù)字節(jié)數(shù)量,其值是本端接收對方數(shù)據(jù)的緩存剩余空間, ?用于實現(xiàn) TCP 的流量控制。
7)校驗和字段占16位,校驗和字段檢驗的范圍類似于UDP,包括TCP偽首部、TCP首部和應(yīng)用層數(shù)據(jù)3部分,計算方法與UDP校驗和的計算方法相同。
8)緊急指針字段占16位,該字段只有URG=1時才有效。
9)選項字段的長度可變。
10)填充字段,長度為0?3字節(jié),取值全0,其目的是為了使整個首部長度是4字節(jié)的整數(shù)倍。
二、TCP連接管理
TCP 連接管理包括【連接建立】與【連接拆除】。
TCP 連接建立通過“三次握手”過程。假設(shè)主機A上的一個進程想與主機B上的一個進程建立一條TCP連接,主機A應(yīng)用進程首先通知主機A的TCP,它想建立一個與主機B上某個進程之間的連接,主機A中的TCP會通過以下過程與主機B中的TCP建立一條TCP連接。
1)?主機A的TCP向主機B發(fā)出連接請求段(第一次握手)。
2)?—旦包含 SYN 報文段的IP數(shù)據(jù)報到達主機B,SYN報文段被從該數(shù)據(jù)報中提取出來。主機B的TCP收到連接請求段后,如同意,則發(fā)回確認報文段(第二次握手)。
3)?主機A收到SYNACK報文段后,也要給該連接分配緩存和變量,并向主機B發(fā)送確認報文段(第三次握手),該報文段是對主機B的同意連接報文段進行確認,其中ACK=1, SYN=0(因為連接已建立),seq=x+l,ack_seq=y+1。第三次握手的 ACK 報文段可以攜帶從主機A到主機B的應(yīng)用層數(shù)據(jù)。
三次握手
第一次握手:客戶端作為連接建立發(fā)起端,選擇客戶端初始序列號x,向服務(wù)器發(fā)送 ?(SYN=1,
seq=x)的 SYN段??蛻魻顟B(tài)由LISTEN進入SYN_SEND 狀態(tài),等待服務(wù)器確認。
第二次握手:服務(wù)器收到客戶發(fā)送的 SYN 段后,選擇服務(wù)器初始序列號向客戶發(fā)送 ?(SYN=1, ACK=1, ?seq=y, ?ack_seq=x+1) 的SYNACK段 。同時,服務(wù)器狀態(tài)由LISTEN進入SYN_RCVD 狀態(tài)。
第三 次 握 手 : 客 戶端 收 到 服 務(wù) 器 ?SYNACK ?段 后 , 向 服 務(wù) 器發(fā) 送 (ACK=1, ?seq=x+1, ack_seq=y+1)的 ACK 段,同時,客戶端進入ESTABLISHED 狀態(tài),客戶端確認連接已建立;當(dāng)服務(wù)器收到ACK段后,也進入ESTABLISHED狀態(tài),也確認連接已建立。至此,雙方均確認連接建立成功。
?
四次揮手
1)當(dāng)客戶向服務(wù)器發(fā)送完最后一個數(shù)據(jù)段后,可以發(fā)送一個FIN段(FIN=1, seq=u), 請求
斷開客戶到服務(wù)器的連接,其狀態(tài)由 ESTABLISHED 進入FIN_WAIT_1,在這一狀態(tài)下,只
能接收服務(wù)器發(fā)送過來的數(shù)據(jù),而不再發(fā)送數(shù)據(jù)。需要注意的是,F(xiàn)IN段不封裝應(yīng)用層數(shù)
據(jù),但是也要消耗掉1個序列號(類似于SYN段)。
2) ?服務(wù)器收到客戶的 FIN 段后,向客戶發(fā)送一個 ACK 段(ACK=1,seq=v, ack_seq=u+1),
ACK 段可以封裝應(yīng)用層數(shù)據(jù)(如果有)。服務(wù)器狀態(tài)由 ESTABLISHED 進入CLOSE_WAIT,
在這一狀態(tài)下,服務(wù)器仍然可以發(fā)送數(shù)據(jù),但不再接收數(shù)據(jù)。當(dāng)客戶收到ACK段后,其
狀態(tài)由FIN_WAIT_1 進入FIN_WAIT_2,仍然可以接收來自服務(wù)器的數(shù)據(jù)。此時的 TCP 連接
已經(jīng)關(guān)閉了客戶向服務(wù)器方向的數(shù)據(jù)傳輸,故也稱為半關(guān)閉。
3) ?當(dāng)服務(wù)器向客戶發(fā)送完最后一個數(shù)據(jù)段后,服務(wù)器向客戶發(fā)送FIN段(FIN=1, ACK=1,
seq=w, ack_seq=w+l),同樣,該FIN段也不攜帶應(yīng)用層數(shù)據(jù)。服務(wù)器狀態(tài)則由 CLOSE_WAIT
進入LAST_ACK,此時服務(wù)器也不再發(fā)送數(shù)據(jù)。
4) ?當(dāng)客戶收到服務(wù)器發(fā)送的 FIN 段后,向服務(wù)器發(fā)送ACK段(ACK=1,seq=w,
ack_seq=u+1),其狀態(tài)由FIN_WAIT_2進入TIME_WAIT,等待2MSL(Maximum Segment
Lifetime)時間,然后進入CLOSED狀態(tài),最終釋放連接;服務(wù)器在收到最后一次ACK段
后,狀態(tài)由 LAST__ACK 進入CLOSED,最終釋放連接。
三、TCP可靠數(shù)據(jù)傳輸
TCP 能夠提供可靠的數(shù)據(jù)傳輸服務(wù),是通過以下工作機制來實現(xiàn)的。
1)??應(yīng)用數(shù)據(jù)被分割成 TCP 認為最適合發(fā)送的數(shù)據(jù)塊(通常是 MSS),封裝成TCP段,傳遞給IP。
2)?當(dāng)TCP發(fā)出一個段后,啟動一個計時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,則認為該報文段丟失,將重發(fā)這個報文段。當(dāng) TCP 收到發(fā)自 TCP 連接另一端的數(shù)據(jù),將發(fā)送一個確認段。
3)?TCP 首部中設(shè)有校驗和字段,用于檢測數(shù)據(jù)在傳輸過程中是否發(fā)生差錯。如果收到
的報文段通過校驗和檢測,發(fā)現(xiàn)有差錯,TCP 將丟棄這個報文段和不確認收到此報文段(希
望發(fā)送端超時并重發(fā)),而將已連續(xù)接收到的應(yīng)用層數(shù)據(jù)的最后一個字節(jié)的序號加 1,作為
確認序號,向發(fā)送方發(fā)送確認段。
4)?由于TCP報文段封裝到IP數(shù)據(jù)報中傳輸,而IP 數(shù)據(jù)報的到達可能會經(jīng)過不同的路徑從而造成順序的錯亂,因此TCP報文段的到達也可能會失序。如果必要,TCP將根據(jù)序號對收到的數(shù)據(jù)進行重新排序,將收到的數(shù)據(jù)以正確的順序交給應(yīng)用層。
5)?由于存在網(wǎng)絡(luò)延遲和重傳機制,TCP的接收端有可能會收到多個重復(fù)的報文段,這時接收端需要根據(jù)序號把重復(fù)的報文段丟棄。
6)?TCP能夠提供流量控制。TCP連接的每一方都在建立連接時分配一定大小的接收緩沖空間。TCP的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)。這可以防止較快主
機發(fā)送數(shù)據(jù)太快,致使較慢主機的緩沖區(qū)溢出。
?
?TCP接收方生成ACK的策略主要有4種。
1) ?具有所期望序號的報文段(即接收窗口基序號指向的段)按序到達,所有在期望序號
及以前的報文段都已被確認。此時,TCP接收方延遲發(fā)送ACK,最多等待 500 ms。如果下
一個按序報文段在這個時間段內(nèi)沒有到達,則發(fā)送ACK,對收到的段進行確認。
2) ?具有所期望序號的報文段按序到達,且另一個按序報文段在等待ACK傳輸,TCP接收方立即發(fā)送單個累積ACK,以確認以上兩個按序到達的報文段。
3) ?擁有序號大于期望序號的失序報文段到達,TCP接收方立即發(fā)送重復(fù)ACK,即對當(dāng)前
接收窗口基序號進行確認,指示下一個期待接收字節(jié)的序號。
4) ?收到一個報文段,部分或完全填充接收數(shù)據(jù)間隔(缺失)。
四、TCP流量控制
流量控制(flow ?control)的目的是協(xié)調(diào)協(xié)議發(fā)送方與接收方的數(shù)據(jù)發(fā)送與接收速度,避免因發(fā)送方發(fā)送數(shù)據(jù)太快,超出接收方的數(shù)據(jù)接收和處理能力,導(dǎo)致接收方被數(shù)據(jù)“淹沒”,
即數(shù)據(jù)到達速度超出接收方的接收、緩存或處理能力,致使數(shù)據(jù)在接收方被丟棄。流量控
制問題不僅存在于端到端的傳輸層,也存在于數(shù)據(jù)鏈路層。
五、TCP擁塞控制
【擁塞】是指太多主機以太快的速度向網(wǎng)絡(luò)中發(fā)送太多的數(shù)據(jù),超出了網(wǎng)絡(luò)處理能力,導(dǎo)致大量數(shù)據(jù)分組“擁擠”在網(wǎng)絡(luò)中間設(shè)備(如路由器)隊列中等待轉(zhuǎn)發(fā),網(wǎng)絡(luò)性能顯著下降的現(xiàn)象。
【擁塞控制】(congestion ?control)就是通過合理調(diào)度、規(guī)范、調(diào)整向網(wǎng)絡(luò)中發(fā)送數(shù)據(jù)的主機數(shù)量、發(fā)送速率或數(shù)據(jù)量,以避免擁塞或盡快消除己發(fā)生的擁塞。?