1. 程式人生 > >學習筆記之計算機網路(王道考研) 第五章 傳輸層

學習筆記之計算機網路(王道考研) 第五章 傳輸層

  • 傳輸層屬於面向通訊的最高層,同時也是使用者功能中的最低層
  • 傳輸層提供應用程序之間的邏輯通訊(即端到端的通訊),與網路層的區別是,網路層提供的是主機之間的邏輯通訊
  • 傳輸層的複用和分用:複用是指傳送方不同的應用程序都可以使用同一個傳輸層協議傳送資料;分用是指接收方的傳輸層在剝去報文的首部後能夠把這些資料正確交付到目的應用程序
  • 傳輸層還要對收到的報文進行差錯檢測(首部和資料部分),而網路層只檢查IP資料報的首部(首部校驗和),不檢驗資料不符是否會出錯
  • 提供兩種不同的傳輸協議,即面向連線的TCP和無連線的UDP。而網路層無法同時實現兩種協議(即在網路層要麼只提供面向連線的服務,如虛電路
    ,要麼只提供無連線服務,如資料報,而不可能在網路層同時存在這兩種方式)
  • 服務訪問點(SAP):資料鏈路層的SAP是MAC地址,網路層的SAP是IP地址,傳輸層的SAP是埠
  • 服務端使用的埠號:分兩種。一類為熟知埠號,數值為0~1023,這些埠號被指定給了TCP/IP最重要的一些應用程式;另一類叫做登記埠號,數值為1024~49151,它是為沒有熟知埠號的應用程式使用的,使用這類埠號必須在IANA登記
  • 一些常用的熟知埠號如下:
應用程式 FTP TELNET SMTP DNS TFTP HTTP SNMP
熟知埠號 21 23 25 53 69 80 16
  • 客戶端使用的埠號:數值為49152~65535.這類埠僅在客戶程序執行時才動態選擇,因此又叫短暫埠,又稱臨時埠
  • 套接字 = (主機IP地址,埠號)
  • 使用TCP的典型協議有FTP、HTTP、TELNET等;使用UDP的協議主要有TFTP(小檔案傳輸協議)、DNS、實時協議(RTP)
  • UDP在IP之上僅提供兩個附加服務:複用和分用以及差錯檢測
  • UDP較TCP的優點:
  1. 無需建立連線,沒有建立連線的時延
  2. 無連線狀態。一些專用應用伺服器使用UDP時,可以支援更多的活動客戶機
  3. 分組首部開銷小。TCP首部20位元組,UDP首部僅8位元組
  4. 應用層能更好地控制要傳送的資料和傳送時間。UDP沒有擁塞控制,因此網路中的擁塞也不會影響主機的傳送效率。對於某些實時性應用,允許一些資料的丟失,但是不允許有較大的時延
  • UDP提供盡最大努力的交付,所有傳輸可靠性的工作需要使用者在應用層來完成
  • UDP是面向報文的。傳送方UDP對應用層交下來的報文,在新增首部後就向下交付給IP層,既不合並,也不拆分。報文不可分割,是UDP資料報處理的最小單位
  • UDP資料報格式:

  • 校驗和:檢測UDP資料報在傳輸中是否有錯。有錯就丟棄。該欄位是可選的,當源主機不想計算校驗和,則直接令該欄位為全0
  • 在計算校驗和時,要在UDP資料報之前增加12個位元組的偽首部。偽首部既不向下傳送也不向上遞交,僅僅只是為了計算校驗和。既檢查UDP資料報,也對IP資料報的源IP地址和目的IP地址進行了校驗。
  • UDP資料報加上偽首部後:

  • 計算UDP檢驗和例子:

  • 對於計算UDP校驗和注意:是使用16位二進位制碼直接進行二進位制加法,有進位則加到下一位;若最高位有進位則加到最後一位,迴圈,直到無進位產生最後取反。比如:111 + 111 = 111。首先,1 + 1 = 0(進位1),然後 1 + 1 + 1(進位) = 1 (再進位1),再1 + 1 + 1(進位) = 1(再進位1,此時進位1加到最後一位),最後一位得到最高位的進位,變為1,不產生進位。因此最後結果為111
  • 每一條TCP只能是點對點的,TCP提供全雙工通訊,TCP允許通訊雙方的應用程序在任何時候都能傳送資料,為此TCP連線的兩端都設有傳送快取和接收快取
  • TCP是面向位元組流的
  • TCP傳送的資料單元稱為報文段
  • TCP首部長度最短20位元組。TCP報文段首部格式如下:

  • TCP報文首部一些欄位的意義:
  1. 序號欄位。佔4位元組,TCP連線中傳送的資料流中的每一個位元組都編上一個序號,序號欄位的值則指的是本報文段所傳送的資料的第一個位元組的序號
  2. 確認號欄位。佔4位元組,是期望收到對方的下一個報文段的資料的第一個位元組的序號。與資料鏈路層的ACK不同
  3. 資料偏移。佔4位,即首部長度,單位是4位元組。與IP資料報分片的資料偏移不同
  4. 緊急位URG。當URG=1時,表明緊急指標欄位有效。資料從第一個位元組到緊急指標所指位元組就是緊急資料
  5. 確認位ACK。只有當ACK=1時確認號欄位才有效,當ACK=0時,確認號無效。TCP規定,在連線建立後,所有傳送的報文段都必須把ACK置為1
  6. 推送位PSH。接收TCP收到PSH=1的報文段,就儘快地交付接收應用程序,而不再等到整個快取都填滿了後再向上交付
  7. 復位位RST。當RST=1時,表明TCP連線中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連線,然後再重新建立連線
  8. 同部位SYN。同步SYN=1表示這是一個連線請求或連線接收報文。當SYN=1,ACK=0時,表明這是一個連線請求報文;當SYN=1,ACK=1時,表示這是一個連線接收報文
  9. 終止位FIN。FIN=1表示此報文段的傳送方的資料已傳送完畢,並要求釋放連線
  10. 視窗欄位。佔2位元組,指出了現在執行對方傳送的資料量,可動態變化。與資料鏈路層的視窗還是有很大不同的
  11. 檢驗和。佔2位元組,檢驗範圍包括首部和資料。檢驗方法同UDP檢驗和,只需把偽首部的第四個協議欄位改為6即可。UDP協議欄位是17
  12. 緊急指標欄位。佔16位,指出本報文段中緊急資料共有多少個位元組
  • TCP連線的建立採用客戶/伺服器方式(C/S)。主動發起連線建立的應用程序叫做客戶機,被動等待連線建立的應用程序叫做伺服器
  • TCP連線的端點不是IP地址,不是應用程序,不是協議埠,而是套接字,即IP+埠
  • TCP連線建立“三次握手”機制:
  1. 客戶機的TCP首先向伺服器的TCP傳送一個連線請求報文段。這個報文段中不含應用層資料,其首部中的SYN標誌位被置為1.另外,客戶機會隨機選擇一個起始序號seq=x(連線請求報文不攜帶資料,但要消耗掉一個序號
  2. 伺服器的TCP收到連線請求報文段後,如同意建立連線,就向客戶機發回確認,併為該TCP連線分配TCP快取和變數。在確認報文段中,SYN和ACK都被置為1,確認號欄位的值為x+1,並且伺服器隨機產生起始序號y(確認報文不攜帶資料,但也要消耗一個序號)。確認報文段同樣不包含應用層資料
  3. 當客戶機收到確認報文段後,還要向伺服器給出確認,並且也要給該連線分配快取和變數。這個報文段的ACK標誌位被置為1,序號欄位為x+1,確認號欄位為ack為y+1。該報文段可以攜帶資料,如果不攜帶資料則不消耗序號
  • 服務端的資源是在完成第二次握手時分配的,而客戶端的資源是在第三次握手時分配的,這就使得伺服器易於收到SYN洪泛攻擊
  • TCP連線釋放“四次揮手”機制:(參與TCP連線的兩個程序中的任何一個都能終止該連線,下面以客戶機發起釋放請求為例)
  1. 客戶機打算關閉連線,就向其TCP傳送一個連線釋放報文段,並停止再發送資料,主動關閉TCP連線,該報文段的FIN標誌被置為1,seq=u,它等於前面已傳送過的資料的最後一個位元組的序號加1(FIN報文段即使不攜帶資料,也要消耗一個序號)
  2. 伺服器收到連線釋放報文段後即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v,等於它前面已傳送過的資料的最後一個位元組的序號加1.此時,從客戶機到伺服器的這個方向的連線就釋放了,TCP連線處於半關閉狀態。但伺服器若傳送資料,客戶機仍要接收,即從伺服器到客戶機這個方向的連線並未關閉
  3. 若伺服器已經沒有要向客戶機發送的資料,就通知TCP釋放連線,此時其發出FIN=1的連線釋放報文段
  4. 客戶機收到連線釋放報文段後,必須發出確認。在確認報文段中,ACK欄位被置為1,確認號ack=w+1,序號seq=u+1.此時TCP連線還沒有釋放掉,必須經過時間等待計時器設定的時間2MSL後,TCP才進入連線關閉狀態
  • TCP連線建立的總結:
  1. SYN=1,seq=x
  2. SYN=1,ACK=1,seq=y,ack=x+1
  3. ACK=1,seq=x+1,ack=y+1
  • TCP連線釋放的總結:
  1. FIN=1,seq=u
  2. ACK=1,seq=v,ack=u+1
  3. FIN=1,ACK=1,seq=w(隨機產生一個序號),ack=u+1
  4. ACK=1,seq=u+1,ack=w+1
  • TCP提供的可靠資料傳輸服務就是要保證接收方程序從快取區讀出的位元組流與傳送方發出的位元組流是完全一樣的,TCP使用了校驗、序號、確認和重傳機制來達到這個目的
  • 每一個位元組都有序號,而在一個報文段中,序號欄位的值是該報文段中第一個位元組的序號
  • TCP使用累計確認,只保證確認號之前的資料全部被接收(如果有亂序的資料到達,則接收方會根據其視窗大小判斷是否應該接收這些亂序到達的資料)
  • 超時重傳:TCP每傳送一個報文段,就對這個報文段設定一次計時器
  • 冗餘ACK(冗餘確認)重傳:TCP規定每當比期望序號大的失序報文段到達時,就傳送一個冗餘ACK,指明下一個期待位元組的序號;同時,TCP規定當傳送方收到對同一個報文段的3個冗餘ACK時,就可以認為跟在這個被確認報文段之後的報文段已經丟失。這種技術通常稱為快速重傳
  • 傳送視窗的單位為位元組
  • 傳輸層流量控制與資料鏈路層流量控制的區別:
  1. 傳輸層定義了端到端使用者之間的流量控制,資料鏈路層定義了兩個中間的相鄰節點的流量控制
  2. 傳輸層的視窗大小可以動態變化,而資料鏈路層不可以
  • 傳送方的傳送視窗的大小=MIN{rwnd,cwnd}
  • 擁塞控制:防止過多的資料注入網路,這樣可以使網路中的路由器或鏈路不致過載
  • 擁塞控制和流量控制的區別:擁塞控制是讓網路能過承受現有的網路負荷,它是一個全域性性的過程,涉及所有的主機、所有的路由器,以及與降低網路傳輸效能有關的所有因素。相反,流量控制往往是指點對對的通訊量的控制,即接收端控制傳送端,它所要做的是抑制傳送端傳送資料的速率,以便使接收端來得及接收
  • 擁塞視窗:傳送方根據自己估算的網路擁塞程度而設定的視窗值,反映了網路的當前容量
  • 慢開始演算法:在TCP剛剛連線好,開始傳送TCP報文段時,先令擁塞視窗cwnd=1,即一個最大報文段長度MSS。而在每收到一個對新的報文段的確認後,將cwnd加1,即增大一個MSS(所以經過一個RTT後,cwnd應該是變為原來的2倍)。當把擁塞視窗增大到一個規定的慢開始門限ssthresh(閾值),然後改用擁塞避免演算法
  • 擁塞避免演算法:傳送端的擁塞視窗cwnd每經過一個RRT就增加一個MSS的大小,而不是加倍(經過一個RRT和收到對一個報文段的確認是完全不同的)。當出現一次超時時,則令慢開始門限ssthresh等於當前cwnd的一半(乘法減小)
  • 當網路出現擁塞時,無論在慢開始階段還是在擁塞避免階段,只要傳送方檢測到超時事件的發生(沒有按時收到確認,重傳計時器超時),就要把慢開始門限ssthresh設定為出現擁塞時的傳送方cwnd的一半(但不能小於2),然後把擁塞視窗的cwnd重新設定為1,執行慢開始演算法
  • 慢開始和擁塞避免演算法的實現舉例(圖):

  • cwnd不能越過ssthresh值
  • 快重傳:利用冗餘ACK技術用於網路擁塞的檢測,快重傳並非是取消重傳計時器,而是在某些情況下可更早地重傳丟失的報文段
  • 快恢復:當傳送端收到連續的三個冗餘ACK時,即把慢開始門限ssthresh設定為出現擁塞時(當前)傳送方cwnd(也是傳送方的傳送視窗大小)的一半,把cwnd設定為慢開始門限ssthresh改變後的數值,然後執行擁塞避免演算法
  • 快重傳和快恢復演算法的實現舉例(圖):

  • 實際中,慢開始、擁塞避免演算法、快重傳和快恢復幾種演算法應該是同時應用在擁塞控制機制中的,當傳送方檢測到超時的時候就採用慢開始和擁塞避免,當傳送方接收到冗餘ACK時就採用快重傳和快恢復