2014年11月29日 星期六

【大三課程】資訊網路筆記(三)【學習筆記】

傳輸層 -
 目標 - 了解傳輸層服務背後的運作原則
 服務 - multiplexing(多工) 與 demultiplexing(解多工) / 可靠資料傳輸 / 控制流 / 壅塞控制
    TCP / UDP / TCP的壅塞控制


傳輸層服務及協定
 - 在不同主機上的應用處理程予之間提供有邏輯的溝通
 - 傳輸層協定是在終端機上運作
 - 送端將訊息分成segments (區段),通過網路層
 - 收端將區段重組成訊息,通過應用層
 - 一個應用程式會有一個以上的傳輸協定 Internet有TCP跟UDP

傳輸層與網路層
 - 傳輸層是在processes之間有邏輯地溝通 (依靠並增強網路層傳輸) - 人 - segment
 - 網路層是在hosts之間有邏輯地溝通 - 地點 - package

傳輸層協定
- TCP - 可靠有順序
 - 壅塞控制
 - 流量控制
 - 先設定connection
- UDP - 不可靠,無順序地傳輸
 - 沒有多餘的最有效IP
- 不可用服務
 - 傳輸時間與頻寬保證

多工與解多工
 - 多工 - 用於處理多個socket內的資料並加上傳輸header
 - 解多工 - 用herder資訊來傳輸要被接收的區端到正確的socket

解多工的運作方式
 - 主機接收每一個datagram的來源IP與目標IP
 - 每個datagram都會帶一個傳輸層的segment
 - 每個segment都有來源與目的端的port number

傳送時 - 先建一個socket,包含主機本地的port,當要建datagram傳到UDP socket時必定要指定目的端IP跟port。
收到時 - 當host收到UDP segment會先檢查segment內的目的port,引導UDP segment到欲傳到的port。IP datagram有相同目的port,來源的IP, port也許會不同,但最後都會送到相同的socket。

TCP ( Connection-oriented demux )
 - TCP socket 會有四個確定的元件
 - 來源IP, port number
 - 目的IP, port number  以上組成TCP的socket
 - demux : 使用以上四個值來引導segment到適當的socket
 - 伺服器主機會同時提供多個TCP socket(多執行緖應用),每個socket個自確定的四個元件
 - 網路伺服器有不同socket對應到每個連接中的client
 - 如間歇性的HTTP有不同的socket給每個要求

UDP (User Datagram protocol)
 - 沒有多餘設計的網路傳輸協定
 - 盡力的服務,不可靠
 - segment會流失、傳送的順序會錯
 - 收送端之間不會作handshaking這個動作
 - 每個UDP segment獨自處理
UDP使用於容許掉封包的應用
 - 多媒體串流
 - DNS
 - SNMP
若在UDP上進行可靠傳輸
 - 加可靠功能於應用層,應用個別錯誤復原
UDP的segment header  (32bits)
 - source port & dest port
 - length顯示包含header的UDP segment長度
為什麼UDP要存在
 - 無連線建立(會增加延遲)
 - 簡單,沒有連接狀態
 - 小型header
 - 無壅塞控制(要爆就給他爆,能多快就多快)

UDP checksum (檢查但不重送)
 - 目的 : 為了檢測封包錯誤
 - 送端
 - checksum加在segment裡面,放在checksum field
 - 收端
 - 計算checksum,若不等於checksumfield裡面的值,則有錯,反之

可靠傳輸的原則 - 網路作業的10大重點之一,於應用、傳輸、鏈結都很重要
 - UDP的通道特點將決定TCP的複雜度
 - 要增加送收端的可靠傳輸協定(rdt)
 - 考慮只有單一方向性的資料傳送 (實際會是雙向)
 - 使用finite state machines (FMS) 來指定送收者

rdt1.0 - 通過可靠通道進行可靠傳輸
 - 底層的可靠通道是完美可靠的,不會有錯誤或掉封包
 - sender傳資料到底下通道,receiver讀資料從底下通道

rdt2.0 - 通道有一個位元的錯誤
 - 底下通道錯掉了一個封包 (利用checksum檢查出來)
 - 解決如何恢復這個錯誤
 - ACKs : 接收端明確地告知送端「封包已成功送達」
 - NAKs : 接收端明確地告知送端「封包有錯誤!」 ,當送端得知NAK,會重傳封包
 - 錯誤偵測
 - 接收端回傳msg(ACK,NAK)給送端
rdt2.1
 - rdt2.0有著致命的錯誤
 - ACK/NAK被破壞,送端不知道接收端發生什麼事
 - 不能只做重送動作,可能造成重覆封包
 - 處理重覆
 - 當ACK/NAK壞掉時重送封包
 - 傳送端在每個封包加序號(0,1)
 - 接收端丟棄重覆封包
 - 送端送一個封包,然後等待收端回應
 - 送端
 - 在封包上加序號
 - 序號0,1就足夠了
 - 必須檢查ACK跟NAK是否被破壞
 - 收端
 - 必須檢查封包是否重覆,依照封包序號狀態是0還1
 - 收端並不曉得送端是否確實收到ACK/NAK
rdt2.2 - NAK-free protocol
 - 跟rdt2.1相同的運作方式,但只有使用ACK
 - 用只傳ACK的方式告知送端來取代NAK
 - ACK要明確地包含序號
 - 當我們送端收到相同的ACK時就等同於沒有傳成功(收到NAK),要重送封包
rdt3.0 - 通道發生錯誤跟掉封包
 - 新的假設是底下的通道會掉封包(data跟ACK都有可能),checksum、序號、ACK不足以應付這些錯誤
 - 方法 : 送端在一合理的時間內等待ACK
 - 如果沒等到ACK,就重傳
 - 如果其實ACK沒掉,只是delay了,雖然會造成重送,但是序號能解決此問題
 - 收端必須指定ACK的序號
 - 需要一個計時器
- 實際運作後,若發生delay,每次寄收都會變成2次作業,效率變差,雖然能達到可靠傳輸,但是每次只能傳一封包,造成效率變差,所以讓以下Pipelined protocols產生。



Pipelined protocols
 - pipeling : 送端允許送多個、"in-flight"(還在傳)、有未傳送成功(ACK)的封包
 - 封包序號要加大
 - 送收雙方要有緩衝(buffering)
- utilization rate提高至三倍
- Go-back-N : 回到掉的那個封包
 - 送端可回到第N個unacked(未確認收到的)封包
 - 收端只回傳累積到的ack號碼,確認收到的第幾個封包正確,重傳下一個
 - 送端會有timer給最舊未ack的封包,如果timer時間一到,就會重傳所有封包
 - 無視重覆傳送的,又收到就丟
 - 例如從pkt2一直收不到ack2,之後的3收到ack1就確認ack2掉了,重傳2pkt開始4個
- Selective Repeat
 - 送端可回到第N個未確認收到的封包
 - 收端會給每個封包個別的ack
 - 送端替每個未收到ack的封包計時,時間一到,就重傳那些沒有收到ack的封包
 - buffers是為了能夠有序地傳到下一層
 - 送端只重送沒有收到ack的封包,替每個未收到ack的封包計時
 - 要Window內原本預計送到的封包都確定送達,才會移至下一個Window區端傳送

TCP概述
 - point to point - one sender one receiver
 - 可靠且有序,不會有訊息被邊緣化
 - pipe lined - TCP會做壅塞及流量控制,利用Window大小
 - 全雙工資料
 - 在同一條connection進行雙工資料互通
 - MSS : maximum segment size
 - connection-oriented
 - 資料交換前會先handshaking
 - flow controlled
 - sender不會讓receiver超載

TCP segment structure中幾個重要元件
 - ACK - 確認封包是否有正確傳送
 - RST,SYN,FIN - 建立連線封包,確認是否穩定
 - checksum
 - source port / dest port
 - sequence number / ack number (計數器)

seq.numbers - 資料流的序號
acknowledgments -對送端來說是累積的ACK數,對收端來說是想要的資料序號
 - 送端送 Seq=42(給第42個檔案), ACK=79(ACK數有79個)
 - 收端回 Seq=79(收到第79個檔案), ACK =43(想要第43個檔案)
 - 送端送 Seq=43(給第43個檔案), ACK =80(ACK累積到80個,也代表確定收到)
 - 都是屬於自己的

如何設定timeout的時間
 - 比RTT長,但是RTT有變化
 - 過短,造成不必要的傳輸
 - 過長,對於segment的掉落反應慢
如何估計RTT
 - 樣本RTT - 計算從segment送出到ACK回傳時間,不計重傳時間,再利用指數平滑法估計RTT要多長,不能只用「現在的」樣本,包含最近的RTT計算平均。

timeout interval = estimatedRTT + safety margin (4*DevRTT)
- DevRTT是估計RTT與樣本RTT的偏差值

TCP的可靠傳輸 - IPS建造了rdt在不可靠的IP(網際協定)服務上 (TCP/IP)
- pipelined segment
- cumulative acks
- single retransmission timer
重傳的原因
- 超過時間
- 重覆的ack
TCP sender 程式事件
-data rcvd from app
 - 幫每個segment上序號,序號是segment中第一筆資料在byte-stream中的位置
 - 如果timer沒跑,則幫忙開啟,timer是替最舊的unacked segment設的
-timeout
 - timeout發生就重傳資料
 - 重新計時
- ack rcvd
 - 如果有unacked的segment
 - 更新現在是哪個資料已被acked了
 - 仍有unacked segment的話,開始計時

TCP fast retransmit
- timeout期間會相較其他來得長,若segment掉了,之後會收到重覆的ACK,所以可以利用重覆的ACK來偵測出是哪個資料掉了
- triple duplicate ACKs - 回傳3個相同的ack,就重送unacked區端中最小的那個,不用等到timeout再傳。

TCP flow control
- receiver會告訴裝segment的rwnd值(buffer剩多少空間),避免超載
 - RcvBuffer : 大小是根據socket來設,典型是4096bytes,現在很多會自動調整了
- sender會限制unacked的數量不得超過收端rwnd的值
- 將保證收端buffer不會爆

TCP Connection Management
- 在資料交換前,送/收端先進得handshake
- 允許建立連線、連線參數
- 雙向交握是否總是能在網路下運作?
 - 可變動的delay
 - 由於訊息流失,重傳訊息
 - 訊息重新排列
 - 無法看到另外一邊的狀態
- 三方交握解決了以上的問題,收到訊息才會建立連線,不會有傳送失敗的問題。
- closing a connection
 - 在TCP segment上附 FIN bit = 1,client, server就會關閉連接
 - 要確認對方是否收到FIN, ACK,會造成無限loop,同時的FIN交換能夠解決
 - 告訴伺服器「可以準備關囉!」(FIN),伺服器回報「我知道了」(ACK),伺服器傳完「傳完要關了」(FIN),告訴伺服器「我知道了」(ACK),伺服器收到關掉,收端等segment存活時間*2,確定伺服器已關,這邊也就關掉了。
 - 要由我方這邊等待伺服器傳FIN,也由我方傳ACK告知伺服器,我方稍等是否能關了。

TCP congestion control
 - sender會慢慢提升傳輸率,探測可使用的頻寬大小 ,直到loss發生
 - 以加法(A)的方式提升(I),以乘法(M)方式減少(D),當發生loss,就直接減半,因為會掉就代表buffer已滿,要直接減半才能確實恢復好的狀態。(AIMD)
 - Slow Start
 - 一開始只傳一個,之後沒事就翻倍成長,一開始雖然慢但後期呈指數成長
loss有兩種
 - 因為timeout得知loss,嚴重性高,cwnd重設為1,用slowstart指數增加,再用AIMD增加
 -當cwnd達到timeout前的1/2大小(ssthresh),就從指數成長變成線性成長
  - ssthresh是變數,會變成上次發生loss時的一半
 - 因為收到三個重複的ACK得知loss,將cwnd砍到原本的一半就好

TCP是公平的
 - 二台同時連接時會平均分配傳輸率
 - loss時會將window減半,避免擁塞則使用加法增加








1 則留言: