計算機網路 -- 傳輸層
概述
-
之前課程所介紹的計算機網路體系結構中的物理層、資料鏈路層以及網路層它們共同解決了將主機通過異構網路互聯起來所面臨的問題,實現了主機到主機的通訊。
-
但實際上在計算機網路中進行通訊的真正實體是位於通訊兩端主機中的程序。
-
如何為執行在不同主機上的應用程序提供直接的通訊服務是運輸層的任務,運輸層協議又稱為端到端協議。
-
運輸層向高層使用者遮蔽了下面網路核心的細節(如網路拓撲、所採用的路由選擇協議等),它使應用程序看見的就好像是在兩個運輸層實體之間有一條端到端的邏輯通訊通道。
-
根據應用需求的不同,因特網的運輸層為應用層提供了兩種不同的運輸協議,即面向連線的TCP和無連線的UDP
運輸層埠號、複用與分用的概念
埠號
TCP/IP體系的運輸層使用埠號來區分應用層的不同應用程序。
埠號使用16位元表示,取值範圍0~65535
-
熟知埠號:0~1023,IANA把這些埠號指派給了TCP/IP體系中最重要的一些應用協議,例如:FTP使用21/20,HTTP使用80,DNS使用53
-
登記埠號:1024~49151,為沒有熟知埠號的應用程式使用。使用這類埠號必須在IANA按照規定的手續登記,以防止重複。例如:
Microsoft RDP微軟遠端桌面使用的埠是3389 -
短暫埠號:49152~65535,留給客戶程序選擇暫時使用。當伺服器程序收到客戶程序的報文時,就知道了客戶程序所使用的動態埠號。通訊結束後,這個埠號可供其他客戶程序以後使用。
埠號只具有本地意義,即埠號只是為了標識本計算機應用層中的各程序,在因特網中不同計算機中的相同埠號是沒有聯絡的。
傳送方的複用和接收方的分用
UDP/TCP複用:不同的應用報文都使用UDP/TCP封裝
TCP/IP體系的應用層常用協議所使用的運輸層熟知埠號
UDP和TCP的對比
TCP的流量控制
-
一般來說,我們總是希望資料傳輸得更快一些,但如果傳送方把資料傳送得過快,接收方就可能來不及接收,這就會造成資料的丟失。
-
所謂流量控制(flow
control)就是讓傳送方的傳送速率不要太快,要讓接收方來得及接收。 -
利用滑動視窗機制可以很方便地在TCP連線上實現對傳送方的流量控制。
例
在A與B建立連線時,B已告訴A接收視窗為400
這裡的大寫ACK是TCP報文段首部中的標誌位,1表示這是一個TCP確認報文段
小寫ack是TCP報文段首部中的確認號欄位,取值201表示序號201之前的資料已全部正確接收,現在希望收到序號201及其後續資料。
rwnd是TCP報文段首部中的視窗欄位,取值300表示自己的接收視窗大小為300
當主機B確認接收後,則主機A就可以把快取刪除了
為了解決這個問題,TCP未每個連線設有一個持續計時器,只要TCP連線的一方收到對方的零窗回通知,就啟動持續計時器,若超時則傳送一個零視窗探測報文,僅攜帶1位元組資料。而對方在確認這個探測報文時,給出自己現在徵的接收視窗值,如果接收視窗仍是0,那麼收到這個報文段的一方成重新啟動持續時器,如果不是0,則打破死鎖
TCP規定,即使接收視窗為0,也必須接受探測報文段、確認報文段、以及帶有緊急資料的報文段,同時,零視窗探測報文也有計時器,若丟失則會被重傳
TCP擁塞控制
在某段時間,若對網路中某一資源的需求超過了該資源所能提供的可用部分,網路效能就要變壞。這種情況就叫做擁塞(
congestion)
在計算機網路中的鏈路容量(即頻寬)、交換結點中的快取和處理機等,都是網路的資源。
若出現擁塞而不進行控制,整個網路的吞吐量將隨輸入負荷的增大而下降
傳送方維護一個叫做擁塞視窗cwnd的狀態變數,其值取決於網路的擁塞程度,並且動態變化。
-
擁塞視窗cwnd的維護原則:只要網路沒有出現擁塞,擁塞視窗就再增大一些;但只要網路出現擁塞,擁塞視窗就減少ー些。
-
判斷出現網路擁塞的依據:沒有按時收到應當到達的確認報文(即發生超時重傳)
傳送方將擁塞視窗作為傳送視窗swnd,即swnd=cwnd
維護一個慢開始門限 ssthresh狀態變數:
-
當cwnd< ssthreshl時,使用慢開始演算法;
-
當cwnd> ssthresh時,停止使用慢開始演算法而改用擁塞避免演算法;
-
當cwnd= ssthresh時,既可使用慢開始演算法,也可使用擁塞避免演算法。
慢開始(ssthresh)
擁塞視窗為幾就可以傳送幾個報文段
假設一開始擁塞視窗為1,慢開始門限值為16,則傳送報文數為:
1、2、4、8、16
當傳送報文為16,即擁塞視窗為16時採用擁塞避免演算法
擁塞避免
擁塞避免演算法只能線性加1
16、17、18……23、24
當傳送報文數為24時,發現重傳計時器超時,即24個報文中有個別丟失,則判斷網路擁塞,使用以下解決方法
-
將ssthresh值更新為發生擁塞時cwnd值的一半(12)
-
將cwnd值減少為1,井重新開始執行慢開始演算法
若是收到三個重複的確認檢測到丟失的報文段則將cwnd設定為1/2,若是通過超時檢測到丟失的報文段則從新從1開始?
“慢開始”是指一開始向網路注入的報文段少,並不是指擁塞視窗cwnd增長速度慢;
"擁塞避免”並非指完全能夠避免擁塞,而是指在擁塞避兔階段將擁塞視窗控制為按線性規律嶒長,使網路比較不容易出現擁塞;
快重傳和快恢復
有時,個別報文段會在網路中丟失,但實際上網路並未發生擁塞。這將導致傳送方超時重傳,並誤認為網路發生了擁塞;傳送方把擁塞視窗cwnd又設定為最小值1,並錯誤地啟動慢開始演算法,因而降低了傳輸效率
採用快重傳演算法可以讓傳送方儘早知道發生了個別報文段的丟失。
所謂快重傳,就是使傳送方儘快進行重傳,而不是等超時重傳計時器超時再重傳。
-
要求接收方不要等待自己傳送資料時才進行捎帶確認,而是要立即傳送確認;
-
即使收到了失序的報文段也要立即發出對己收到的報文段的重複確認。
-
傳送方一旦收到3個連續的重複確認,就將相應的報文段立即重傳,而不是等該報文段的超時重傳計時器超時再傳。
對於個別丟失的報文段,傳送方不會出現超時重傳,也就不會誤認為出現了擁塞(進而降低擁塞視窗cwnd為1)。使用
快重傳可以使整個網路的吞吐量提高約20%
傳送方一旦收到3個重複確認,就知道現在只是丟失了個別的報文段。於是不啟動慢開始演算法,而執行快恢復演算法,傳送方將慢開始門限ssthreshe值和擁塞視窗cwnd值調整為當前視窗的一半;開始執行擁塞避免演算法。也有的快恢復實現是把快恢復開始時的擁塞視窗cwnd值再增大ー些,即等於新的ssthresh+3.
-
既然傳送方收到3個重複的確認,就表明有3個數據報文段已經離開了網路
-
這3個報文段不再消耗網路資源而是停留在接收方的接收快取中;
-
可見現在網路中不是堆積了報文段而是減少了3個報文段。因此可以適當把擁塞視窗打大些。
在這裡插入圖片描述
TCP報文段的首部格式
源埠:佔16位元,寫入源埠號,用來標識傳送該TCP報文段的應用程序。
目的埠:佔16位元,寫入目的埠號,用來標識接收該TCP報文段的應用程序。
序號:佔32位元,取值範圍[0,2^32-1],序號増加到最後一個後,下ー個序號就又回到0。
確認號:佔32位元,取值範圍[0,2^32-1],確認號増加到最後一個後,下ー個確認號就又回到0.
指出期製收到對方下ー個TCP報文段的資料載荷的第一個位元組的序號,同時也是對之前收到的所有資料的確認。
-
若確認號=n,則表明到序號n-1為止的所有資料都已正確接收,期望接收序號為n的資料。
-
確認標誌位ACK:取值為1時確認號欄位オ有效;取值為0時確認號欄位無效。
-
TCP視定,在連線建立後所有傳送的TCP報文段都必須把ACK置1。
資料偏移:佔4位元,並以4位元組為單位,用來指出TCP報文段的資料載荷部分的起始處距離TCP報文段的起始處有多遠,這個欄位實際上是指出了TCP報文段的首部長度。
首部固定長度為20位元組,因此資料偏移欄位的最小值為(0101)#2
首部最大長度為60位元組,因此資料偏移欄位的最大值為(1111)#2
視窗:佔16位元,以位元組為單位。指出傳送本報文段的一方的接收視窗。
視窗值作為接收方讓傳送方設定其傳送視窗的依據。
這是以接收方的接收能力來控制傳送方的傳送能力,稱為流量控制。
校驗和:佔16位元,檢查範圍包括TCP報文段的首部和資料載荷兩部分。在計算校驗和時,要在TCP報文段的前面加上12位元組的偽首部。
同步標誌位SYN:在TCP連線建立時用來同步序號。
終止標誌位FIN:用來釋放TCP連結
復位標誌位RST:用來複位TCP連線。
當RST=1時,表明TCP連接出現了異常,必須釋放連線,然後再重新建立連線。
RST置1還用來拒絕一個非法的報文段或拒絕開啟ー個TCP連線。
推送標誌位PSH:接收方的TCP收到該標誌位為1的報文段會盡快上交應用程序,而不必等到接收綬存都填滿後再向上交付。
緊急標誌位URG:取值為1時緊急指標欄位有效;取值為0時緊急指標欄位無效。
緊急指標:佔16位元,以位元組為單位,用來指明緊急資料的長度。
當傳送方有緊急資料時,可將緊急資料插隊到傳送快取的最前面,並立刻封裝到一個TCP報文段中進行傳送。緊急指標會指出本報文段資料載荷部分包含了多長的緊急資料。緊急資料之後是普通資料。
UDP報文段
其中首部佔8個位元組,其餘每個域各佔用2個位元組
TCP的超時重傳
超時重傳時間RTO應略大於往返時間RTT
不能直接使用某次測量得到的RTT樣本來計算超時重傳時間RTO
利用每次測量得到的RTT樣本,計算加權平均往返時間RTTs(又稱為平滑的往返時間)。
RTT(s1) = RTT(1)
新的RTT(s) = (1 - a)×舊的RTT(s) + ax新的RTT樣本
在上式中,O≤a<1
-
若α很接近於0,則新RTT樣本對RTTs的影響不大;
-
若a很接近於1,則新RTT樣本對RTTs的影響較大;
-
已成為建議標準的RFC6298推薦的(值為1/8,即0.125)
用這種方法得出的加權平均往返時間RTTs就比測量出的RTTs值更加平滑
顯然,超時重傳時間RTO應略大於加權平均往返時間RTT
源主機若誤將確認當作是對原報文段的確認:所計算出的RTTs和RTO就會偏大,降低了傳輸效率
源主機若誤將確認當作是對重傳報文段的確認:所計算出的RTTs和RTO就會偏小,導致報文段沒必要的重傳,增大網路負荷;
例:
TCP連線管理
TCP運輸連線有以下三個階段
-
建立TCP連線
-
資料傳送
-
釋放TCP連線
連線建立(三次握手)
TCP的連線建立要解決以下三個問題:
-
使TCP雙方能夠確知對方的存在
-
使TCP雙方能夠協商一些引數(如最大視窗值、是否使用視窗擴大選項和時間戳選項以及服務質量等)
-
使TCP雙方能夠對運輸實體資源(如快取大小、連線表中的專案等)進行分配。
SYN被設定為1的報文段不攜帶資料,但是要消耗掉一個序號
普通的的TCP確認報文段可以攜帶資料,如果不攜帶資料,則不消耗掉序號
連線釋放(四次揮手)
TGP規定終止位FIN等於1的報文段即使不攜帶資料,也要消耗掉一個序號