3.1概述和運輸層服務(wù)
運輸層協(xié)議為運行在不同主機上的應(yīng)用進程之間提供了邏輯通信。其在端系統(tǒng)中而不是路由器中實現(xiàn)。
3.1.1運輸層和網(wǎng)絡(luò)層的關(guān)系
網(wǎng)絡(luò)層提供了主機之間的邏輯通信。用類比的方法就是兩個家庭之間收發(fā)信件,每個家庭都有一個負責(zé)人進行信件的收集和交付郵局工作,其中負責(zé)人相當(dāng)于運輸層協(xié)議,而郵政服務(wù)相當(dāng)于網(wǎng)絡(luò)層協(xié)議。
3.1.2運輸層概述
運輸層分組稱為報文段。網(wǎng)絡(luò)層協(xié)議有一個IP協(xié)議,為主機之間提供邏輯通信,IP的服務(wù)模型是盡力而為交付服務(wù),它并不能確保任何報文段的交付,不保證按序交付,不保證數(shù)據(jù)完整性。將主機間交付擴展到進程間交付稱為運輸層的多路復(fù)用和多路分解。
進程到進程的數(shù)據(jù)交付和差錯檢查是兩種最低限度的運輸層服務(wù),也是UDP提供了僅有的兩種服務(wù)。
3.2多路復(fù)用和多路分解
運輸層通過檢查報文段中的幾個字段來標(biāo)識出接受套接字,并將報文段定向到該套接字,這個過程稱為多路分解。(負責(zé)人從郵遞員接受一批信件,然后通過收信人名字將信件交給其他人)主機從不同套接字收集數(shù)據(jù)塊,并為每個數(shù)據(jù)塊封裝首部信息從而生成報文段,然后將報文段傳遞到網(wǎng)絡(luò)層的工作稱為多路復(fù)用。(負責(zé)人收集信件然后交給郵遞員)
多路復(fù)用要求
- 套接字有唯一標(biāo)識符
- 每個報文段有特殊字段來指示該報文要交付的套接字。其中特殊的字段是源端口號字段和目的端口號字段,端口號是一個16比特的數(shù),大小在0 ~ 65535之間,0 ~ 1023是周知端口號,該端口號保留給諸如HTTP(80)、FTP(21)
1.無連接的多路復(fù)用和多路分解
使用傳統(tǒng)方法創(chuàng)建套接字的時候,運輸層會自動給該套接字分配一個端口號,當(dāng)然,也可以用socket.bind(('',19157))這樣的方法來綁定端口號。
一個UDP套接字是由一個二元組來全面標(biāo)識的,即目的IP和目的端口號。所有標(biāo)識符一致的請求,都會被分解到相同的套接字中
2.面向連接的多路復(fù)用和多路分解
TCP套接字是由一個四元組(源IP、源端口號、目的IP、目的端口號)標(biāo)識的。在敲門端口號接收到請求后,會根據(jù)標(biāo)識符來生成相應(yīng)的連接套接字。
3.web服務(wù)器與TCP
如今高性能Web服務(wù)器只使用一個進程,而每個新的客戶連接創(chuàng)建一個新連接套接字的新線程
3.3無連接運輸:UDP
UDP只是做了運輸協(xié)議能夠做的最少工作,除了復(fù)用/分解功能及少量的差錯檢測外,它幾乎沒有對IP增加別的東西。
DNS是一個通常使用UDP的應(yīng)用層協(xié)議的例子。有很多應(yīng)用更加適合用UDP,原因如下:
- 關(guān)于何時、發(fā)送什么數(shù)據(jù)的應(yīng)用層控制更加精細。能實現(xiàn)立即傳遞,無需考慮擁塞控制
- 無需建立連接。UDP不會引入建立連接的時延
- 分組首部開銷小。每個TCP報文段又20字節(jié)的首部開銷,而UDP僅有8字節(jié)
UDP可以實現(xiàn)可靠數(shù)據(jù)傳輸,只不過需要在應(yīng)用程序自身中建立可靠性機制來完成(如增加確認和重傳機制)
3.3.1 UDP報文段結(jié)構(gòu)
UDP首部只有4個字段,一個字段由兩個字節(jié)組成。長度字段表示報文段中的字節(jié)數(shù)(首部加數(shù)據(jù))。利用檢驗和來檢查報文段中是否出現(xiàn)差錯。

3.3.2 UDP檢驗和
發(fā)送方的UDP對報文段中所有的16比特字的和進行反碼運算,(求和時遇到任何溢出都被回卷)得到的結(jié)果放在檢驗和字段。
在接收方,全部的4個16比特加在一起,如果沒有引入差錯,那顯然在接收方初該和將是1111111111111111,如果出現(xiàn)了0,那就表明分組出錯。
雖然鏈路層也提供了差錯檢測的協(xié)議,但是不能保證每條鏈路都有,也不能保證內(nèi)存中不會出現(xiàn),所以運輸層的差錯檢驗是非常必要的。
3.4可靠數(shù)據(jù)傳輸原理
3.4.1可靠數(shù)據(jù)傳輸協(xié)議
1.經(jīng)完全可靠信道的可靠數(shù)據(jù)傳輸rdt1.0
有限狀態(tài)機(Finite-State Machine, FSM)可以用來定義接收方和發(fā)送方的操作,橫線上方表示引起變遷的事件,橫線下方表示事件發(fā)生時所采取的動作,F(xiàn)SM的初始狀態(tài)用虛線表示

2.經(jīng)具有比特差錯信道的可靠數(shù)據(jù)傳輸:rdt 2.0
協(xié)議可以使用肯定確認和否定確認來讓發(fā)送方知道接收方知道,哪些內(nèi)容需要被重復(fù)傳輸,基于這種重傳機制的可靠數(shù)據(jù)傳輸協(xié)議稱為 自動重傳請求協(xié)議(Automatic Repeat reQuest,ARQ)
該協(xié)議需要三種協(xié)議功能來處理比特出錯
- 差錯檢測。
- 接收方反饋。
- 重傳。
rdt2.0的發(fā)送端有兩個狀態(tài),一個等待來自上層的調(diào)用,一個用來等待ACK或NCK分組。注意,當(dāng)發(fā)送方處于等待ACK/NCK的狀態(tài)時,就不能從上層獲取更多數(shù)據(jù)。這樣的行為稱為停等協(xié)議
rdt2.0的接收方只有一個狀態(tài)。
如果ACK/NCK分組受損,發(fā)送方就無法知道接收方有沒有正確接受上一塊發(fā)送的數(shù)據(jù),為此,有3種可能 - 接收方面對出錯的ACK/NCK分組,發(fā)送方可能會進一步發(fā)送報文,但這樣的話就容易陷入死胡同
- 增加足夠的檢驗和比特,使得發(fā)送方在檢測到出錯的時候也能恢復(fù)
- 發(fā)送方遇到出錯ACK/NCK時就重新發(fā)送,但會存在冗余分組
解決上述問題的方法是在數(shù)據(jù)分組種添加一個新字段,讓發(fā)送方對其數(shù)據(jù)分組編號,將發(fā)送數(shù)據(jù)分組的序號放在該字段。這樣就能確定該序號的分組是否被正確的接收到。
也可以不發(fā)送NAK,而是對上一次正確接收的分組發(fā)送一個ACK,也能實現(xiàn)和NAK一樣的效果。
3.經(jīng)具有比特差錯的丟包信道的可靠數(shù)據(jù)傳輸:rdt3.0
假設(shè)除了比特受損,還會丟包。現(xiàn)在需要處理兩個關(guān)注的問題:怎么檢測丟包以及丟包后該怎么做
解決上述方法最簡單的方法就是重傳,雖然會引入冗余數(shù)據(jù)分組,但是可以用編號的方法來處理。
為了實現(xiàn)時間的重傳機制,需要一個倒計數(shù)計時器。即如果超時,那就需要重新發(fā)
至此,在檢驗和、序號、定時器、肯定和否定確認分組這些技術(shù)加入之后,我們得到了一個可靠數(shù)據(jù)傳輸協(xié)議。
3.4.2 流水線可靠數(shù)據(jù)傳輸協(xié)議
流水線技術(shù)對可靠數(shù)據(jù)傳輸協(xié)議帶來了以下的影響:
- 增加序號范圍
- 協(xié)議的發(fā)送方和接收方必須緩存多個分組。發(fā)送方至少能緩存已發(fā)送但是沒有確認的分組。接收方也需要緩存那些已正確接受的分組
- 所需序號的范圍和對緩沖的要求取決于數(shù)據(jù)傳輸協(xié)議如何處理數(shù)據(jù)丟失、損壞和延時過大的分組。兩種基本方法:回退N步和選擇重傳
3.4.3回退N步(GBN)(滑動窗口協(xié)議)
基序號定義為最早的未確認分組的序號
下一個序號定義為最小的未使用序號
窗體長度的定義是為了流量控制和擁塞控制

發(fā)送方:當(dāng)出現(xiàn)丟失和時延過長分組時發(fā)送方會利用定時器來恢復(fù)數(shù)據(jù)或確認分組的丟失。如果超時,發(fā)送方會重傳所有已發(fā)送但是還未被確認的分組,如果收到一個ACK,但還有已發(fā)送但未確認的分組,那就重啟定時器。知道沒有已發(fā)送未確認的分組,定時器才會終止。
接收方:丟棄正確接受但失序的分組。該方法接受緩存簡單,無需緩存失序分組。
3.4.4選擇重發(fā)(SR)
由于GBN方法在單個分組出錯后就會引起大量分組的重傳,所以效率較慢。
發(fā)送方:SR僅重傳那些懷疑在接收方出錯的分組。而且每個分組必須擁有自己的邏輯定時器,以防止超時。當(dāng)收到ACK時,將對應(yīng)的分組標(biāo)記為已接受,如果時send_base,那就移動。
接收方:確認一個正確接受的分組而不管其是否按序,緩存起來直到所有丟失的分組都收到了。

接收方重新確認已經(jīng)收到過的那些序號小于當(dāng)前窗口基序號的分組。
窗口的大小必須小于或等于序號空間大小的一半,否則會出現(xiàn)接收方無法確認,收到的分組是新傳入的還是重新發(fā)送的(如下面的兩種情況)

3.5面向連接的傳輸:TCP
3.5.1TCP連接
TCP連接提供的是全雙工服務(wù),該連接也總是點對點的,即單個發(fā)送方與單個接受方之間的連接。
在經(jīng)過三次握手之后開始互相發(fā)送數(shù)據(jù),客戶進程通過套接字傳輸數(shù)據(jù),TCP將數(shù)據(jù)引導(dǎo)到連接的發(fā)送緩存中,TCP可從緩存中取出并放入到報文段中的數(shù)據(jù)量受限于最大報文段長度(MSS)
TCP連接的組成包括:一臺主機上的緩存、變量和與進程連接的套接字,以及另一臺主機上的緩存、變量和套接字
3.5.2 TCP報文段結(jié)構(gòu)

上圖可知,首部字段一般是20字節(jié)。除了源端口號、目的端口號和因特網(wǎng)檢驗和三個字段,TCP報文段還包括:
- 4字節(jié)的序號字段和4字節(jié)的確認好字段
- 2字節(jié)的接受窗口字段,用于流量控制
- 4比特的首部長度字節(jié),表示以32為比特的字為單位的TCP首部長度
- 選項字段
- 6比特的標(biāo)志字段,ACK表明該報文段包括一個對已成功接收報文段的確認,RST、SYN、FIN用于連接的建立和拆除。PSH表明該數(shù)據(jù)應(yīng)立即交給上層,URG表明報文段中存在發(fā)送端設(shè)置為”緊急“的數(shù)據(jù),該數(shù)據(jù)的最后一個字節(jié)由緊急數(shù)據(jù)指針指出。
1.序號和確認號
序號是建立在傳送的字節(jié)流上,而不是傳送的報文段上。如一個包含了500000字節(jié)的數(shù)據(jù),MSS是1000字節(jié),數(shù)據(jù)流的首字節(jié)編號是0,那么TCP就會為該數(shù)據(jù)流構(gòu)建500個報文段,第一個報文段的序號是0.第二個報文段的序號是1000.
主機A填充進報文段的確認號是主機A期望從主機B收到的下一個字節(jié)的序號。比如說主機A已經(jīng)收到一個來自主機B的包含字節(jié)0~ 535的報文段,以及一個包含字節(jié)900~ 2100的報文段,那么A到B的下一個報文段將在確認號中包含536.
2.Telmet:序號和確認號的案例
大體流程是主機A鍵入的每個字符都會被發(fā)送到遠程主機B,遠程主機B又將會送每個字符副本到主機A。之后主機A將取人以從服務(wù)器收到的數(shù)據(jù)
假設(shè)客戶和服務(wù)器的起始序號分別是42和79,所以TCP建立之后,客戶等待字節(jié)79,而服務(wù)器等待字節(jié)42

3.5.3往返時間的估計和超時
1.估計往返時間
首先需要估計發(fā)送方與接受方之間的往返時間。在任意時刻,僅為一個已發(fā)送但是目前尚未被確認的報文段估計樣本RTT,從而產(chǎn)生一個接近于每個RTT的新的值,而且絕不為已經(jīng)重傳的報文段計算。
為了計算典型的RTT,即平均樣本RTT,需要用加權(quán)平均值來進行計算,被稱為制數(shù)加權(quán)移動平均(EWMA)
EstimatedRTT=0.875×EstimatedRTT +0.125×SampleRTT
計算RTT的變化,用于估算sampleRTT一般會偏移EstimateRTT的程度:
DevRTT=0.75×DevRTT+0.25×|SampleRTT-EstimateRTT|
2.設(shè)置和管理重傳超時間隔
TimeoutInterval=EstimateRTT+4×DevRTT
推薦的初始值TimeoutInterval是1秒
3.5.4 可靠數(shù)據(jù)傳輸
- 簡化的描述
發(fā)送方有3個與發(fā)送和重傳相關(guān)的事件:從上層應(yīng)用程序接受數(shù)據(jù)、定時器超時和收到ACK。
一種有趣的情況:主機A發(fā)送兩個報文段,第一個報文段序號是92,包含8個字節(jié)。第二個報文段序號是100,包含20字節(jié),兩個報文段無損達到主機B,但超時前A收到一個確認號是120的確認報文,那主機A就知道主機B已經(jīng)收到了序號119及之前所有的字節(jié),也就不會重傳。
冗余ACK:當(dāng)TCP接收方收到一個具有這樣序號的報文段,其序號大于下一個所期待的、按序的報文段,說明有報文段丟失。所以他會對已接受的最后一個按序字節(jié)數(shù)據(jù)進行重復(fù)確認。也就產(chǎn)生了冗余ACK
3.5.5流量控制
TCP提供的流量控制可以消除因發(fā)送方速率較快,而接收方讀取數(shù)據(jù)相對緩慢所導(dǎo)致的緩存溢出的可能性。
擁塞控制使發(fā)送方因為IP網(wǎng)絡(luò)的擁塞而被遏制的控制。兩者采取的動作相似,但針對的原因和目的完全不同。
TCP通過讓發(fā)送方維護一個稱為接受窗口的變量來提供流量控制。定義以下的變量:
- LastByteRead:主機B的應(yīng)用進程從緩存讀取的數(shù)據(jù)流的最后一個字節(jié)的編號
- LastByteRevd:從網(wǎng)絡(luò)中到達并且已放入主機B接收緩存中的數(shù)據(jù)流的最后以一個字節(jié)的編號
接收窗口用rwnd表示
rwnd=RevBuffer-[LastByteRevd-LastByteRead]
主機B把當(dāng)前的rwnd放入發(fā)送給A的報文段中通知主機A
主機A輪流跟蹤兩個變量。LastByteSent和LastByteAcked。主機A在連接的整個生命周期中需要保證:
LastByteSent-LastByteAcked<=rwnd
3.5.6TCP連接管理
- 第一步:在報文段的首部中的SYN比特被設(shè)為1,這個特殊報文段被稱為SYN報文段。隨機選擇一個初始序號(client _isn),該序號放置在開始的TCP SYN報文段的序號字段中。
- 第二步:提取TCP SYN報文段,為TCP 連接分配TCP緩存和變量。在第二個報文段中包含3個重要信息,首先SYN置為1,確認號字段置為client_isn+1,最后服務(wù)器選擇自己的初始序號(server_isn)。該連接有時被稱為SYNACK報文段
- 第三步:客戶為該連接分配緩存和變量。首部的確認字段設(shè)為server_isn+1,SYN比特設(shè)為0.同時可以攜帶客戶到服務(wù)器的數(shù)據(jù)
客戶端的生命周期如下:客戶端剛開始處于Closed狀態(tài),然后客戶端向服務(wù)器發(fā)送一個SYN報文段,發(fā)送完報文段之后就處于SYN_SENT狀態(tài)(等待來自服務(wù)器的確認報文段),收到確認報文段之后客戶TCP就處于ESTABLISHD狀態(tài)。此時客戶TCP就可以發(fā)送和接受應(yīng)用層產(chǎn)生的數(shù)據(jù)了。 關(guān)閉時TCP發(fā)送一個帶有FIN比特被置為1的TCP報文段,然后進入FIN_WAIT_1狀態(tài),當(dāng)收到服務(wù)器帶確認的報文段后,客戶TCP進入FIN_WAIT_2狀態(tài),當(dāng)收到FIN比特被置為1的另一個報文段后,發(fā)送確認報文段,進入TIME_WAIT狀態(tài),之后就正式關(guān)閉。

服務(wù)器端的生命周期與上述相對。不再贅述

3.6 擁塞控制原理
3.6.1 擁塞原因和代價
情況1:兩臺發(fā)送方與一臺具有無窮大緩存的路由器
吞吐量如左圖所示,還算可以接受,但是隨著發(fā)送速率的增加,時延產(chǎn)生了指數(shù)級的增加,如圖右

情況2:兩個發(fā)送方和一臺具有有限緩存的路由器
發(fā)送方必須執(zhí)行重傳來補償因為緩存溢出而丟失的分組。
發(fā)送方在遇到大時延時所進行的不必要重傳會引起路由器利用其鏈路帶寬來轉(zhuǎn)發(fā)不必要的分組副本。
情況3:四個發(fā)送方和具有有限緩存的多臺路由器及多條路徑
當(dāng)一個分組沿一條路徑被丟棄時,每個上游路由器用于轉(zhuǎn)發(fā)該分組到丟棄該分組而使用的傳輸容量最終被浪費掉了。
3.6.2擁塞控制方法
- 端到端擁塞控制。
- 網(wǎng)絡(luò)輔助的擁塞控制。
3.6.3網(wǎng)絡(luò)輔助的擁塞控制例子:ATM ABR擁塞控制
沒看懂
3.7 TCP擁塞控制
思考三個問題,第一,一個TCP發(fā)送方如何限制它向其連接發(fā)送流量的速率?第二,一個TCP發(fā)送發(fā)如何感知他從目的地之間的路徑上存在的擁塞?第三,當(dāng)發(fā)送方感知端到端的擁塞時,采用何種算法來修改其發(fā)送效率。
第一個問題:發(fā)送方跟蹤一個額外的變量,擁塞窗口,表示為cwnd,可以通過調(diào)節(jié)這個值來調(diào)整他向連接發(fā)送數(shù)據(jù)的速率。
第二個問題:超時或者收到來自接收方的3個冗余ACK
第三個問題:如果收到的確認以相當(dāng)慢的速率增加,那擁塞窗口也以相當(dāng)慢的速率增加。TCP用確認來增大它擁塞窗口長度的行為被稱為是自計時的
1.慢啟動
csnd的值剛開始會設(shè)置的較小,為MSS的較小值,MSS=500然后cwnd的值以1個MSS進行增加.如此,報文段的增加形式就是(1,2,4,8,16....)如果存在一個擁塞,TCP發(fā)送方將cwnd設(shè)置為1并重新開始慢啟動。還將第二個狀態(tài)變量的值ssthresh設(shè)置為cwnd/2。
慢啟動結(jié)束的第二種方式是直接與ssthresh的值相關(guān)聯(lián),當(dāng)檢測到擁塞時,ssthresh設(shè)為cwnd的一半,當(dāng)cwnd的值等于ssthresh時,結(jié)束慢啟動并進入擁塞模式。
2.擁塞避免
進入擁塞避免狀態(tài)時,每個RTT只將cwnd的值增加一個MSS,
3.快速恢復(fù)
尚未看懂
