計算機網(wǎng)絡第3章_第1頁
計算機網(wǎng)絡第3章_第2頁
計算機網(wǎng)絡第3章_第3頁
計算機網(wǎng)絡第3章_第4頁
計算機網(wǎng)絡第3章_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1Chapter 3 Transport Layerq電子科技大學計算機科學與工程學院q付波 A Top-Down Approach2目標: 理解運輸層服務: 復用/分解復用 可靠數(shù)據(jù)傳輸 流量控制 擁塞控制 學習因特網(wǎng)的運輸層協(xié)議: UDP: 無連接傳輸 TCP: 面向連接傳輸 TCP 擁塞控制3 3.1 運輸層服務 3.2多路復用和多路分解 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 報文段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制4 在兩個不同的主機上運行的應用程序之間應用程序之間提供邏輯通信 運輸層

2、協(xié)議運行在端系統(tǒng)運行在端系統(tǒng) 發(fā)送方: 將應用程序報文分解成數(shù)據(jù)段,加上運輸層首部后傳遞給網(wǎng)絡層 接受方: 將數(shù)據(jù)段重新組裝成報文傳遞到應用層 運輸層協(xié)議: TCP 和和 UDP應用層應用層運輸層運輸層網(wǎng)絡層網(wǎng)絡層鏈路層鏈路層物理層物理層應用層應用層運輸層運輸層網(wǎng)絡層網(wǎng)絡層鏈路層鏈路層物理層物理層networkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysical邏輯的端到端傳輸邏輯的端到端傳輸5 運輸層位于網(wǎng)絡層之上 運輸

3、層協(xié)議提供的某些服務受到網(wǎng)絡層協(xié)議的限制。比如,時限和帶寬保證。 運輸層也提供自己的特殊服務。比如,可靠數(shù)據(jù)傳輸服務,安全性服務。 網(wǎng)絡層:兩個主機之間主機之間的邏輯通信 運輸層:兩個進程之間進程之間的邏輯通信6 傳輸控制協(xié)議(TCP) 通過流量控制流量控制、序號序號、確認確認和定時器定時器等確保數(shù)據(jù)可靠按序遞交,會涉及到 擁塞控制 流量控制 連接建立 用戶數(shù)據(jù)報協(xié)議(UDP) 采用best-effort delivery service IP服務的直接擴展,提供不可靠的無序傳遞applicationtransportnetworkdata linkphysicalapplicationtra

4、nsportnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicalnetworkdata linkphysicallogical end-end transport7 3.1 運輸層服務 3.2 多路復用和多路分解 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 報文段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制8 網(wǎng)絡層是主機之

5、間的通信,運輸層是應用網(wǎng)絡層是主機之間的通信,運輸層是應用進層之間的通信。進層之間的通信。如何實現(xiàn)將主機之間的如何實現(xiàn)將主機之間的通信轉(zhuǎn)換為進程之間的通信呢?通信轉(zhuǎn)換為進程之間的通信呢? 解決辦法:運輸層提供解決辦法:運輸層提供 多路復用(多路復用(multiplexing) 多路分解(多路分解(demultiplexing)9進程進程1進程進程2多路復用器多路復用器網(wǎng)絡網(wǎng)絡接口接口進程進程1進程進程2多路分解器多路分解器網(wǎng)絡網(wǎng)絡接口接口怎樣實現(xiàn)呢?怎樣實現(xiàn)呢?10 通過套接字套接字(socket)來實現(xiàn)多路復用與分解 套接字相當于從網(wǎng)絡向進程傳遞數(shù)據(jù)和從進層向網(wǎng)絡傳遞數(shù)據(jù)的門戶門戶 套接字有

6、唯一的標識符標識符11 多路復用:多路復用:The job of gathering data chunks at the source host from different sockets, encapsulating each data chunk with header information to create segments, and passing the segments to the network layer 多路分解:多路分解:The job of delivering the data in a transport-layer segment to the corre

7、ct socket12applicationtransportnetworklinkphysicalP1applicationtransportnetworklinkphysicalapplicationtransportnetworklinkphysicalP2P3P4P1host 1host 2host 3= = 進程進程= = 套接字套接字將接收到的數(shù)據(jù)段傳遞到將接收到的數(shù)據(jù)段傳遞到正確的套接字正確的套接字接收主機多路分解接收主機多路分解: :從多個套接字收集數(shù)據(jù)從多個套接字收集數(shù)據(jù), , 用首部封裝數(shù)據(jù),然后將用首部封裝數(shù)據(jù),然后將報文段傳遞到網(wǎng)絡層報文段傳遞到網(wǎng)絡層發(fā)送主機多路復用發(fā)

8、送主機多路復用: :13 主機上每個套接字分配一個端口號端口號 端口號是16比特的數(shù)字,大小在 065535之間。 01023的端口號是眾所周知的端 口號,是受嚴格限制的。比如HTTP80 當報文段到達主機(1)運輸層檢查報文段的目的端口號(2)將目的端口號定向到相應套接字(3)報文段中的數(shù)據(jù)通過套接字進入所連接的進程 主機用IP地址和端口號指明數(shù)據(jù)段屬于哪個合適的套接字源端口源端口 # #目的端口目的端口 # #32 bits32 bits應用程序數(shù)據(jù)應用程序數(shù)據(jù)( (報文報文) )其他首部域其他首部域TCP/UDP TCP/UDP 報文段格式報文段格式14 用端口號創(chuàng)建套接字:自動分派端口

9、號:自動分派端口號:DatagramSocket ServerSocket1 = new DatagramSocket();應用程序指定端口號:應用程序指定端口號: DatagramSocket ServerSocket2 = new DatagramSocket(9922); UDP套接字由目的IP地址和目的端口號來標識 具有不同的源IP地址且/或源端口號,但具有相同的目的IP地址和目的端口號的IP數(shù)據(jù)報指向同樣的套接字(m:1)15P2ClientIP:Bclient IP: AP1P1P3serverIP: CSP: 6428DP: 9157SP: 9157DP: 6428SP: 642

10、8DP: 5775SP: 5775DP: 6428請求報文段中提供返回地址(包括請求報文段中提供返回地址(包括IPIP地址和端口號)地址和端口號)端口號9157端口號5775端口號642816 TCP 套接字由4部分指定: (源源IP地址地址,源端口號源端口號,目的目的IP地址地址,目的端口號目的端口號) 接收主機使用所有四個值將數(shù)據(jù)段定位到合適的套接字(1:1) 服務器主機支持很多同時的 TCP 套接字: 每個套接字用4部分來表示例例:Web服務器對每個連接的客戶都有不同的套接字,而非持久 HTTP 將對每個請求有一個不同的套接字17(1)TCP服務器進程在端口(比如服務器進程在端口(比如8

11、0)上等待)上等待TCP客客戶機的連接建立請求。戶機的連接建立請求。(2)TCP客戶機產(chǎn)生一條連接建立請求并創(chuàng)建客戶機客戶機產(chǎn)生一條連接建立請求并創(chuàng)建客戶機套接字套接字Socket clientsocket = new socket(“服務器主機名服務器主機名”,80)(3)服務器接收到服務器接收到80端口請求報文后,定位服務器進端口請求報文后,定位服務器進程,創(chuàng)建一個連接套接字程,創(chuàng)建一個連接套接字Socket consocket=welcomesocket.accept()(4)新創(chuàng)建的套接字通過(新創(chuàng)建的套接字通過(源源IP地址地址,源端口號源端口號,目的目的IP地地址址,目的端口號目的

12、端口號) 值來標識。若后續(xù)報文與這四個值來標識。若后續(xù)報文與這四個值相同,則多路分解到這個套接字。值相同,則多路分解到這個套接字。18ClientIP:BP1client IP: AP1P2P4serverIP: CSP: 9157DP: 80SP: 9157DP: 80P5P6P3D-IP:CS-IP: AS-IP: BSP: 5775DP: 80D-IP:CS-IP: BD-IP: C19 3.1 運輸層服務 3.2多路復用和多路復用 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 報文段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理

13、3.7 TCP 擁塞控制20 UDP僅提供:僅提供:多路復用/分解功能輕型的差錯檢測 UDP是無連接的是無連接的:在UDP接收者發(fā)送者之間沒有握手每個UDP 數(shù)據(jù)段的處理獨立于其他數(shù)據(jù)段 UDP采用采用“盡最大努力盡最大努力”服務服務, 導致導致UDP 數(shù)據(jù)段數(shù)據(jù)段可能可能:丟失會傳遞失序的報文到應用程序21 應用層能更好地控制要發(fā)送的數(shù)據(jù)和時間,容忍數(shù)據(jù)丟失 無需連接建立(減少延遲) 無連接狀態(tài) 很小的數(shù)據(jù)段首部(8字節(jié)) TCP不容數(shù)據(jù)丟失,有擁塞和確認控制,在擁堵鏈路會耗費很多時間 TCP需三次握手建立連接 TCP需維護連接狀態(tài),包括緩存、擁塞控制參數(shù)、序號和確認號參數(shù)等 TCP有20個

14、字節(jié)首部22 UDP 只在IP數(shù)據(jù)報服務之上增加了很少一點的功能,即端口的功能端口的功能和差錯檢測差錯檢測的功能。 UDP 用戶數(shù)據(jù)報只提供不可靠交付不可靠交付,但 UDP 在某些方面有其特殊的優(yōu)點。 UDP 是無連接的無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。 UDP 使用盡最大努力盡最大努力交付,即不保證可靠交付,同時也不使用擁塞控制。 UDP 沒有擁塞控制沒有擁塞控制,很適合多媒體通信的要求。 UDP 支持一對一一對一、一對多一對多、多對一多對一和多對多多對多的交互通信。23 UDP 的首部首部開銷小,只有 8 個字節(jié)。 UDP 是面向報文面向報文的。24IP IP 分組的數(shù)據(jù)部分分組的數(shù)

15、據(jù)部分IP IP 首部首部IP IP 層層UDP UDP 首部首部UDP UDP 用戶數(shù)據(jù)報的數(shù)據(jù)部分用戶數(shù)據(jù)報的數(shù)據(jù)部分運輸層運輸層應用層報文應用層報文應用層應用層25源端口源端口目的端口目的端口長長 度度檢驗和檢驗和數(shù)數(shù) 據(jù)據(jù)首首 部部IP IP 分組分組2 22 22 22 2字節(jié)字節(jié)數(shù)數(shù) 據(jù)據(jù)首首 部部UDP UDP 用戶數(shù)據(jù)報用戶數(shù)據(jù)報UDP 有兩個字段:首部字段首部字段和數(shù)據(jù)字段數(shù)據(jù)字段首部字段:有 8 個字節(jié),由 4 個字段組成,每個字段都是兩個字節(jié)。長度是首部和數(shù)據(jù)的總長度 26在計算檢驗和時,臨時把在計算檢驗和時,臨時把“偽首部偽首部”和和 UDP UDP 用戶數(shù)據(jù)用戶數(shù)據(jù)報

16、連接在一起。偽首部僅僅是為了計算檢驗和。報連接在一起。偽首部僅僅是為了計算檢驗和。偽首部偽首部源端口源端口目的端口目的端口長長 度度檢驗和檢驗和數(shù)數(shù) 據(jù)據(jù)首首 部部UDPUDP長度長度源源 IP IP 地址地址目的目的 IP IP 地址地址0 01717IP IP 分組分組字節(jié)字節(jié)4 44 41 11 12 212122 22 22 22 2字節(jié)字節(jié)數(shù)數(shù) 據(jù)據(jù)首首 部部UDP UDP 用戶數(shù)據(jù)報用戶數(shù)據(jù)報27發(fā)送方: 將數(shù)據(jù)段看成16bit的整數(shù)序列 校驗和: 數(shù)據(jù)段內(nèi)容相加 (1的補碼和) 發(fā)送者將校驗和值放入UDP的校驗和域接收方: 計算接收到數(shù)據(jù)段的校驗和 檢查 計算的校驗和是否等于校驗

17、和域中的值: NO 檢測到錯誤 YES 沒有檢測到錯誤目標目標: : 檢測傳輸?shù)臄?shù)據(jù)段的檢測傳輸?shù)臄?shù)據(jù)段的 “錯誤錯誤” 如如bitbit丟失丟失) )28注意:錯誤檢測不是注意:錯誤檢測不是100%100%可靠!可靠! 協(xié)議有可能漏掉一些錯誤,但很少協(xié)議有可能漏掉一些錯誤,但很少 大的校驗信息域能提供更好的檢錯能力大的校驗信息域能提供更好的檢錯能力用戶數(shù)據(jù)用戶數(shù)據(jù) 校驗信息校驗信息傳輸信道傳輸信道用戶數(shù)據(jù)用戶數(shù)據(jù)差錯檢測差錯檢測算法算法用戶數(shù)據(jù)用戶數(shù)據(jù) 校驗信息校驗信息用戶數(shù)據(jù)用戶數(shù)據(jù)差錯檢測差錯檢測算法算法是否相等是否相等是是錯誤處理錯誤處理否否291 1 1 0 0 1 1 0 0 1

18、1 0 0 1 1 01 1 0 1 0 1 0 1 0 1 0 1 0 1 0 11 0 1 1 1 0 1 1 1 0 1 1 1 0 1 111 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0累加和累加和0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1校驗和校驗和變反變反求和求和回卷回卷求和時產(chǎn)生的進位必求和時產(chǎn)生的進位必須回卷加到結(jié)果上須回卷加到結(jié)果上最后的累加和必須按位最后的累加和必須按位變反才是校驗和變反才是校驗和30 3.1 運輸層服務 3.2多路復用和多路分解 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 報文

19、段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制31 服務模型和服務實現(xiàn) 不可靠信道的特性將決定可靠數(shù)據(jù)傳輸協(xié)議(rdt)的復雜性rdt: reliable data transferudt: unreliable data transfer應用層應用層運輸層運輸層網(wǎng)絡層網(wǎng)絡層理想狀態(tài)理想狀態(tài)協(xié)議實現(xiàn)協(xié)議實現(xiàn)32發(fā)送方發(fā)送方接受方接受方rdt_send(): rdt_send(): 上層應用調(diào)用該函數(shù)上層應用調(diào)用該函數(shù),要求可靠傳輸數(shù)據(jù)到接收者,要求可靠傳輸數(shù)據(jù)到接收者udt_send(): udt_send(): 可靠傳輸調(diào)用該可靠傳輸調(diào)用該函數(shù),在不

20、可靠的信道上傳輸數(shù)函數(shù),在不可靠的信道上傳輸數(shù)據(jù)給接收者據(jù)給接收者rdt_rcv(): rdt_rcv(): 接收方接收到數(shù)據(jù)后調(diào)接收方接收到數(shù)據(jù)后調(diào)用該函數(shù),完成可靠傳輸用該函數(shù),完成可靠傳輸deliver_data(): deliver_data(): 可靠傳輸調(diào)用可靠傳輸調(diào)用該函數(shù),將數(shù)據(jù)傳給上層應用該函數(shù),將數(shù)據(jù)傳給上層應用33 我們將逐步開發(fā)發(fā)送方和接收方的可靠數(shù)據(jù)傳輸協(xié)議 (rdt) 僅考慮單向數(shù)據(jù)傳輸單向數(shù)據(jù)傳輸,即數(shù)據(jù)傳輸僅從發(fā)送方到接收方,但控制信息將雙向流動! 有限狀態(tài)機有限狀態(tài)機 (FSM) 來標示發(fā)送方和接收方 發(fā)送方和接收方有各自的FSM 箭頭箭頭指示協(xié)議從一個狀態(tài)變

21、遷到另一個狀態(tài) 狀態(tài)可變遷到其自身 引起變遷的事件事件顯示在表示變遷的橫線上方,所采取的動作動作顯示在橫線下方。 如果對一個事件沒有采取動作,或沒有事件發(fā)生則在橫線下方或上方用符號 初始狀態(tài)用虛線虛線表示34狀態(tài)狀態(tài)1 1狀態(tài)狀態(tài)2 2導致狀態(tài)轉(zhuǎn)換的事件導致狀態(tài)轉(zhuǎn)換的事件狀態(tài)轉(zhuǎn)換時執(zhí)行的動作狀態(tài)轉(zhuǎn)換時執(zhí)行的動作狀態(tài)狀態(tài): : 在一個狀態(tài)時,由事在一個狀態(tài)時,由事件唯一確定狀態(tài)的轉(zhuǎn)換件唯一確定狀態(tài)的轉(zhuǎn)換事件事件動作動作初始狀態(tài)初始狀態(tài)35 假設:在完美可靠的信道完美可靠的信道上 沒有bit錯誤 沒有分組丟失 發(fā)送方/接收方分離的 FSMs : 發(fā)送方發(fā)送數(shù)據(jù)到下層信道 接收方從下層信道接收數(shù)據(jù)等

22、待來自等待來自上層的調(diào)上層的調(diào)用用packet = make_pkt(data)udt_send(packet)rdt_send(data)extract (packet,data)deliver_data(data)等待來自等待來自下層的調(diào)下層的調(diào)用用rdt_rcv(packet)senderreceiver36 假設:下層信道可能讓傳輸分組中的bit受損 校驗和校驗和將檢測到bit錯誤問題: 如何從錯誤中恢復?確認(ACKs): 接收方明確告訴發(fā)送方:分組接收正確否認 (NAKs):接收方明確告訴發(fā)送方:分組接收出錯 發(fā)送方收到NAK后重發(fā)重發(fā)這個分組 在 rdt2.0的新機制 (在 rd

23、t1.0中沒有的): 差錯檢測差錯檢測 接收方反饋反饋: 控制信息 (ACK,NAK)37extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt) &corrupt(rcvpkt)Wait for call from belowreceiverWait for call from abovesnkpkt = make_pkt(data, checksum)udt_send(sndpkt)rdt_rcv(rcvpkt) &

24、isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt) &isNAK(rcvpkt)Wait for ACK or NAKsenderrdt_send(data)L38Wait for call from abovesnkpkt = make_pkt(data, checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt)rdt_rcv(rcvpkt) & isACK(rcvpkt)udt_send

25、(sndpkt)rdt_rcv(rcvpkt) & isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt) & corrupt(rcvpkt)Wait for ACK or NAKWait for call from belowrdt_send(data)L39Wait for call from abovesnkpkt = make_pkt(data, checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt) & notcorrupt(rc

26、vpkt)rdt_rcv(rcvpkt) & isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt) & isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt) & corrupt(rcvpkt)Wait for ACK or NAKWait for call from belowrdt_send(data)L40ACK/NAKACK/NAK發(fā)生錯誤會發(fā)生什么呢?發(fā)生錯誤會發(fā)生什么呢? 發(fā)送方并不知道接收方發(fā)生了什么發(fā)送方并不知道接收方發(fā)生了什么! 不能正確重發(fā)不能正確重發(fā): 可能導致重復分組可能導致重復分組解決辦法解決辦法-序號序

27、號: 發(fā)送方給每個分組加一個序號 在 ACK/NAK 錯誤時發(fā)送方重發(fā)當前分組 接收方丟棄重復的分組(并不向上傳遞)Sender sends one packet, then waits for receiver responsestop and wait41等待來自等待來自上層的上層的調(diào)用調(diào)用0sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)rdt_send(data)等待等待 ACK 或或 NAK 0udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isNAK(rcvpkt) )

28、sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)rdt_send(data)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt) udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isNAK(rcvpkt) )rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt) 等待來自等待來自 上層的上層的調(diào)用調(diào)用1等待等待 ACK 或或 NAK 1LL42sndpkt = make_pkt(N

29、AK, chksum)udt_send(sndpkt)等待來自等待來自下層的下層的0 rdt_rcv(rcvpkt) & not corrupt(rcvpkt) & has_seq0(rcvpkt)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq1(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt)等待來自等待來自下層的下層的1rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq

30、0(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt) rdt_rcv(rcvpkt) & (corrupt(rcvpkt)sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt)rdt_rcv(rcvpkt) & not corrupt(rcvpkt) & has_seq1(rcvpkt)rdt_rcv(rcvpkt) & (corrupt(rcvpkt)sndpkt = make_pkt(ACK, chksum)udt_s

31、end(sndpkt)sndpkt = make_pkt(NAK, chksum)udt_send(sndpkt)43發(fā)送方: 序號加到分組上 兩個序號 (0,1) 就可以滿足. 必須檢查是否收到錯誤的 ACK/NAK 必須記住當前的報文是1號還是0號接收方: 必須檢查是否接收到重復的報文 狀態(tài)指示0或者1是否為希望收到的報文序號 注意注意: 接收方并不知道它的上一個ACK/NAK 是否被發(fā)送方正確收到44 同 rdt2.1一樣的功能, 只用 ACKs 不用 NAK, 如果上個報文接收正確接收方發(fā)送 ACK 接收方必須明確包含被確認的報文的序號 發(fā)送方收到重復ACK將導致和 NAK一樣的處理:

32、 重發(fā)當前報文重發(fā)當前報文45等待來自等待來自上層的上層的調(diào)用調(diào)用0sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)rdt_send(data)等待等待 ACK 0udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,1) )sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)rdt_send(data)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt,0)

33、 udt_send(sndpkt)rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,0) )rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt,1) 等待來自等待來自 上層的上層的調(diào)用調(diào)用1等待等待 ACK 1LL46等待來自等待來自下層的下層的0 rdt_rcv(rcvpkt) & (corrupt(rcvpkt) | has_seq0(rcvpkt)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq1(rcvpkt) extract(rcvpkt,

34、data)deliver_data(data)sndpkt = make_pkt(ACK, 1, chksum)udt_send(sndpkt)等待來自等待來自下層的下層的1rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & has_seq0(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, 0, chksum)udt_send(sndpkt)oncethru=1udt_send(sndpkt) rdt_rcv(rcvpkt) & (corrupt(rcvpkt)| has_seq

35、1(rcvpkt)If (oncethru=1) udt_send(sndpkt)oncethru=0L47新假設: 下層信道可能發(fā)生分組丟失丟失 ,比如數(shù)據(jù)或者 ACKs該怎么辦呢?倒計數(shù)定時器countdown timer方法方法: 發(fā)送者等待“合理的”確認時間,如果在這個時間內(nèi)沒有收到確認就重發(fā)重發(fā) 發(fā)送方需要:發(fā)送方需要: 每發(fā)送一個分組啟動定時器 超時:響應定時器中斷 收到ACK:終止定時器48sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)start_timerrdt_send(data)等待等待 ACK0rdt_rcv(rc

36、vpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,1) )等待來自上等待來自上層的調(diào)用層的調(diào)用1sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)start_timerrdt_send(data)rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt,0) rdt_rcv(rcvpkt) & ( corrupt(rcvpkt) |isACK(rcvpkt,0) )rdt_rcv(rcvpkt) & notcorrupt(rcvpkt) & isACK(rcvpkt

37、,1) stop_timerstop_timerudt_send(sndpkt)start_timertimeoutudt_send(sndpkt)start_timertimeoutrdt_rcv(rcvpkt)等待來自上等待來自上層的調(diào)用層的調(diào)用0等待等待 ACK1Lrdt_rcv(rcvpkt)LLL495051第第1 1個比特被傳輸個比特被傳輸, , t = 0t = 0發(fā)送方發(fā)送方接收方接收方RTTRTT 最后最后1 1比特被傳輸比特被傳輸, , t = L / R t = L / R首個分組的第首個分組的第1 1個比特到達個比特到達首個分組的最后首個分組的最后1 1比特到達比特到達

38、發(fā)送發(fā)送 ACK ACKACK ACK 到達到達, , 發(fā)送下一個分組發(fā)送下一個分組, t = RTT + L / R, t = RTT + L / R首個分組首個分組: :52Ttransmit=8kb/pkt109b/sec= 8 microsec每30.008msec發(fā)送一個1K字節(jié)的報文,由此可見在1Gbps的鏈路上,其有效吞吐量只有267kbps U sender = .008 30.008 = 0.00027 Ttransmit RTT + Ttransmit = L (packet length in bits)R (transmission rate, bps)= 例如: 1

39、Gbps鏈路, 15 ms 端到端傳輸延遲, 1K字節(jié)報文,計算網(wǎng)絡利用率?53 不使用停等方式,允許發(fā)送方發(fā)送多個分不使用停等方式,允許發(fā)送方發(fā)送多個分組而無需等待確認組而無需等待確認流水線技術(shù)流水線技術(shù)pipelining54首個分組的第首個分組的第1 1個比特被傳輸個比特被傳輸, t = 0, t = 0sendersenderreceiverreceiverRTT RTT 首個分組的最后首個分組的最后1 1比特被傳輸比特被傳輸, t = L / R, t = L / R首個分組的第首個分組的第1 1比特到達比特到達首個分組的最后首個分組的最后1 1比特到達比特到達, ,發(fā)送發(fā)送ACKA

40、CKACKACK到達到達, , 發(fā)送下一個分組發(fā)送下一個分組, t = RTT + L / R, t = RTT + L / R第第2 2分組的最后分組的最后1 1比特到達比特到達, , 發(fā)送發(fā)送ACKACK第第3 3分組的最后分組的最后1 1比特到達比特到達, ,發(fā)送發(fā)送ACKACK U sender = .024 30.008 = 0.0008 microseconds 3 * L / R RTT + L / R = 利用率提高了利用率提高了3 3倍倍55流水線流水線: 允許發(fā)送多個沒有確認的分組 “在路上的” 序號數(shù)目序號數(shù)目必須增加 在發(fā)送方/接收方必須有緩沖區(qū)緩沖區(qū) 兩個方法: go

41、-Back-N, 選擇重傳選擇重傳56Go-Back-NGo-Back-N發(fā)送方發(fā)送方: : 在流水線中允許在流水線中允許N N個個unACKed unACKed 分組分組接收方接收方: : 累積確認累積確認ACKsACKs發(fā)送方發(fā)送方: : 只有最早只有最早unACKedunACKed分組有一個定時器分組有一個定時器 若超時若超時: : 重傳所有重傳所有 unACKedunACKed分組分組選擇重傳選擇重傳發(fā)送方發(fā)送方: :在流水線中允許在流水線中允許N N個個unACKed unACKed 分組分組接收方接收方: : 每個分組單獨確認每個分組單獨確認發(fā)送方發(fā)送方: : 每個每個unACKe

42、dunACKed分組分組有一個定時器有一個定時器 若超時若超時: : 僅重傳僅重傳unACKed unACKed 分組分組57發(fā)送方: 在分組頭中規(guī)定一個k位的序號 “窗口”, 允許的連續(xù)未確認的報文ACK(n):ACK(n): 確認所有的報文直到(包含)序號確認所有的報文直到(包含)序號n - n - “累積累積ACKACK”定時定時:對第一個發(fā)送未被確認的報文定時:對第一個發(fā)送未被確認的報文定時超時超時(n):(n): 重發(fā)窗口中的報文重發(fā)窗口中的報文n n及以上更高序號的報文及以上更高序號的報文( (只有一個定時器記只有一個定時器記錄最早的未被確認報文的發(fā)送時間錄最早的未被確認報文的發(fā)送

43、時間) )58ACK-only: 總是為正確接收的最高序號最高序號的分組發(fā)送ACK。 可能生成重復的ACKs 只需要記住被期待接收的序號expectedseqnum 接收到失序分組: 丟棄(不緩沖) - 沒有接收緩沖區(qū)! 重發(fā)最高序號分組的ACK59Waitstart_timerudt_send(sndpktbase)udt_send(sndpktbase+1)udt_send(sndpktnextseqnum-1)timeoutrdt_send(data) if (nextseqnum SendBase) SendBase = y if (there are currently not-ye

44、t-acknowledged segments) start timer /* end of loop forever */ 注意注意: SendBase-1: last cumulatively acked byteExample: SendBase-1 = 71; y= 73, so the rcvr wants 73+ ;y SendBase, so that new data is acked84Host ASeq=100, 20 bytes dataACK=100time過早的超時設置過早的超時設置Host BSeq=92, 8 bytes dataACK=120Seq=92, 8

45、bytes dataSeq=92 timeoutACK=120Host ASeq=92, 8 bytes dataACK=100losstimeout丟失丟失ACK的情況的情況Host BXSeq=92, 8 bytes dataACK=100timeSeq=92 timeoutSendBase= 100SendBase= 120SendBase= 120Sendbase= 10085Host ASeq=92, 8 bytes dataACK=100losstimeout累積累積ACK的情況的情況Host BXSeq=100, 20 bytes dataACK=120timeSendBase=

46、 120累積避免了第一個累積避免了第一個報文段的重傳報文段的重傳86 超時觸發(fā)重傳存在問題:超時周期往往太長超時周期往往太長 導致重傳丟失報文之前要等待很長時間,因此增加了網(wǎng)絡時延網(wǎng)絡時延 解決辦法:冗余冗余ACK檢測檢測 發(fā)送方在超時之前通過重復的ACK檢測丟失報文段 發(fā)送方常常一個接一個地發(fā)送很多報文段 如果報文段丟失,則發(fā)送方將可能接收到很多重復的 ACKs. 如果發(fā)送方收到3個個對同樣報文段的確認,則發(fā)送方認為該報文段之后的數(shù)據(jù)已經(jīng)丟失。 啟動快速重傳快速重傳: 在定時器超時之前重發(fā)丟失的報文段87Host AtimeoutHost BtimeXresend seq X2seq # x

47、1seq # x2seq # x3seq # x4seq # x5ACK x1ACK x1ACK x1ACK x1tripleduplicateACKs88 event: ACK received, with ACK field value of y if (y SendBase) SendBase = y if (there are currently not-yet-acknowledged segments) start timer else increment count of dup ACKs received for y if (count of dup ACKs received

48、 for y = 3) resend segment with sequence number y a duplicate ACK for already ACKed segmentfast retransmit89接收方的事件接收方的事件期望序號的報文段按序到達期望序號的報文段按序到達. . 所有所有在期望序號以前的報文段都在期望序號以前的報文段都被確認被確認期望序號的報文段按序到達期望序號的報文段按序到達. .另一個按序報文段等待發(fā)送另一個按序報文段等待發(fā)送ACKACK收到一個失序的報文段,高于收到一個失序的報文段,高于期望的序號,檢測到縫隙期望的序號,檢測到縫隙到達的報文段部分地或者完到

49、達的報文段部分地或者完全地填充接收數(shù)據(jù)間隔全地填充接收數(shù)據(jù)間隔TCP TCP 接收方行為接收方行為延遲延遲ACK. ACK. 等到等到 500ms 500ms看是否有下一個看是否有下一個報文段,如果沒有,發(fā)送報文段,如果沒有,發(fā)送ACKACK立即發(fā)送單個累積立即發(fā)送單個累積ACK, ACK, 確認兩個有序的報文段確認兩個有序的報文段立即發(fā)送重復立即發(fā)送重復 ACK, ACK, 指出期望的序號指出期望的序號立即發(fā)送立即發(fā)送 ACK, ACK, 證實縫隙低端的證實縫隙低端的報文段已經(jīng)收到報文段已經(jīng)收到90 3.1 運輸層服務 3.2多路復用和多路復用 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)

50、傳輸原理 3.5 面向連接傳輸: TCP 數(shù)據(jù)段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制91 TCP連接的接收邊有一個接收緩沖區(qū): 速度匹配服務速度匹配服務: 發(fā)送速率和接收應用程序的提取速率匹配應用程序可能從這個緩沖應用程序可能從這個緩沖區(qū)讀出數(shù)據(jù)很慢區(qū)讀出數(shù)據(jù)很慢發(fā)送方不能發(fā)送的太多太發(fā)送方不能發(fā)送的太多太快,讓接收緩沖區(qū)溢出快,讓接收緩沖區(qū)溢出流量控制流量控制92(假設 TCP 接收方丟棄失序的報文段) 流量控制使用接收窗口接收窗口:接收緩沖區(qū)的剩余空間 接收方在報文段中宣告接收窗口的剩余空剩余空間間 發(fā)送方限制沒有確認的數(shù)據(jù)不超過接收窗口

51、保證接收緩沖區(qū)不溢出93 3.1 運輸層服務 3.2多路復用和多路復用 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 數(shù)據(jù)段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制94回憶回憶: TCP在交換數(shù)據(jù)報文段之前在發(fā)送方和接收方之間建建立連接立連接 初始化初始化TCP 變量變量: 序號 緩沖區(qū)流控信息 如,接收窗口 客戶客戶: 連接發(fā)起者 Socket clientSocket = new Socket(hostname,port number); 服務器服務器: 等待客戶聯(lián)系 Socket connection

52、Socket = welcomeSocket.accept();三次握手協(xié)議三次握手協(xié)議95Step 1: 客戶發(fā)送TCP SYN報文段到服務器 指定初始的序號 沒有數(shù)據(jù)Step 2: 服務器接收SYN, 回復 SYNACK 報文段 服務器分配緩沖區(qū) 指定服務器的初始序號Step 3: 客戶接收 SYNACK, 回復 ACK 報文段, 可能包含數(shù)據(jù)SYN = 1, seq = client_isnSYN = 0, seq = client_isn + 1, ack = server_isn 1連接連接請求請求連接連接允許允許AB客戶服務器SYN = 1, seq = server_isn, a

53、ck= client_isn 196客戶關(guān)閉套接字客戶關(guān)閉套接字: clientSocket.close()Step 1: 客戶發(fā)送 TCP FIN 控制報文段到服務器 Step 2: 服務器接收 FIN, 回復 ACK. 半關(guān)閉連接半關(guān)閉連接, 并發(fā)送FIN到客戶Step 3: 客戶接收 FIN, 回復 ACK. 進入 “timed wait” 等待結(jié)束時釋放連接資源Step 4: 服務器接收 ACK. 連接關(guān)閉連接關(guān)閉. clientFINserverACKACKFINclosecloseclosedtimed wait97TCP 客戶端狀態(tài)轉(zhuǎn)換圖客戶端狀態(tài)轉(zhuǎn)換圖98TCP 服務器端狀態(tài)轉(zhuǎn)

54、換圖服務器端狀態(tài)轉(zhuǎn)換圖99 3.1 運輸層服務 3.2多路復用和多路復用 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 數(shù)據(jù)段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制100原因原因: Too many sources sending too much data too fast for network to handle(太多主機發(fā)送太多的數(shù)據(jù),速度太快以至于網(wǎng)絡來不及處理) 表現(xiàn)表現(xiàn): 丟失分組丟失分組 - 路由器的緩沖區(qū)溢出 長時延長時延 - 在路由器的緩沖區(qū)排隊101假設假設: 兩個發(fā)送者,兩個兩個發(fā)

55、送者,兩個接收者接收者 一個路由器,無限一個路由器,無限緩沖區(qū)緩沖區(qū) 不執(zhí)行重發(fā)不執(zhí)行重發(fā) 鏈路帶寬為鏈路帶寬為C 每個主機最大可每個主機最大可達吞吐量達吞吐量C/2,C/2,總總的吞吐量為的吞吐量為C C 擁塞時延在擁塞時延在C/2C/2達達到無限大到無限大unlimited shared output link buffersHost Al lin : original dataHost Bl loutl lin : original data102假設:假設: 一個路由器,有限緩沖區(qū)一個路由器,有限緩沖區(qū) 發(fā)送方重發(fā)丟失的報文發(fā)送方重發(fā)丟失的報文有限的共享式有限的共享式輸出鏈路緩存輸出鏈

56、路緩存Host AHost Ain in : : 原始數(shù)據(jù)原始數(shù)據(jù)Host BHost Boutoutin in : : 原始數(shù)據(jù)加重發(fā)數(shù)據(jù)原始數(shù)據(jù)加重發(fā)數(shù)據(jù)103 情況情況a:總是 情況情況b:僅當數(shù)據(jù)丟失時才重發(fā): 情況情況c:超時而沒有丟失的報文重發(fā),導致同樣的 需要比更大的l linl lout=l linl loutl linl loutR/2R/2l linl loutb.R/2R/2l linl louta.R/2R/2l linl loutc.R/4R/3104問問: : 在在 和和 增增加的時候什么會發(fā)生加的時候什么會發(fā)生 ? ?假設:假設: 四個發(fā)送方四個發(fā)送方 多跳路徑多

57、跳路徑 超時超時/重發(fā)重發(fā)l linl lin有限共享輸出鏈路有限共享輸出鏈路Host AHost Dl loutl lin : 原始數(shù)據(jù)原始數(shù)據(jù)l lin : 原始數(shù)據(jù)加重發(fā)數(shù)原始數(shù)據(jù)加重發(fā)數(shù)據(jù)據(jù)Host CHost BR1R3R4R2105當分組沿路徑被丟失后,當分組沿路徑被丟失后, 任何上游路由器的傳輸容量都任何上游路由器的傳輸容量都被浪費了被浪費了!Host AHost Bl lout106端到端擁塞控制端到端擁塞控制: 網(wǎng)絡層沒有為運輸層擁塞控制提供顯式支持 端系統(tǒng)必須觀察網(wǎng)絡行為,如分組丟失分組丟失或延遲延遲來推斷擁塞 TCP采用的方法網(wǎng)絡輔助的擁塞控制網(wǎng)絡輔助的擁塞控制: 路由器

58、給端系統(tǒng)提供顯式反饋 單單bit指示網(wǎng)絡擁塞 (SNA, DECnet) ATM 允許路由器顯式通知發(fā)送者輸出鏈路支持的傳輸速率傳輸速率107ABR: 可用比特率: “彈性服務” 如果發(fā)送方通道“低載” : 發(fā)送方應該利用有效帶寬 如果發(fā)送方通道擁塞: 發(fā)送方應該調(diào)節(jié)到保證速率RM (資源管理) 信元: 發(fā)送方發(fā)送,點綴在數(shù)據(jù)信元中 RM信元中的bit是交換機設置(網(wǎng)絡輔助) NI bit: 速率不要增加 (輕度擁塞) CI bit: 擁塞指示 接收方不改變RM 信元的bit,將其返回給發(fā)送者 108 RM信元的兩個字節(jié)的 ER (明確速率) 域 擁塞的交換機可能降低信元中的 ER 值 發(fā)送方

59、的發(fā)送速率因此調(diào)整到通道支持的最低速率 數(shù)據(jù)信元中的EFCI 位: 在擁塞的交換機中設置為1 如果數(shù)據(jù)信元有EFCI,比RM先到,發(fā)送方設置CI比特于返回的RM信元中109 3.1 運輸層服務 3.2多路復用和多路分解 3.3 無連接傳輸: UDP 3.4 可靠數(shù)據(jù)傳輸原理 3.5 面向連接傳輸: TCP 報文段結(jié)構(gòu) 可靠數(shù)據(jù)傳輸 流量控制 連接管理 3.6 擁塞控制原理 3.7 TCP 擁塞控制110goal: TCP sender should transmit as fast as possible, but without congesting netwo分散管理分散管理: 根據(jù)以下反饋設置自己的發(fā)送速率:1.1.收到收到ACK:ACK: 報文段被收到,網(wǎng)絡無擁塞,因而可增加發(fā)送速率2.2.報文段丟失報文段丟失: : 可認為是由于網(wǎng)絡擁塞導致丟失,降低發(fā)送速率三個機制三個機制:(1)AIMD (2)慢啟動慢啟動 (3)對超時事件作出反應對超時事件作出反應問題問題: 如何找到合適的發(fā)送速率以防止擁塞呢?如何找到合適的發(fā)送速率以防止擁塞呢?111 設置擁塞窗口,CongWin大小 CongWin 是動態(tài)感知網(wǎng)絡擁塞的函數(shù) 發(fā)送方限制發(fā)送:LastByteSent-LastByteA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論