1. 程式人生 > >計算機網路(三)傳輸層—TCP

計算機網路(三)傳輸層—TCP

傳輸層

傳輸單位是TCP報文段或UDP資料報,任務是負責兩個程序(埠)之間的通訊(端到端);複用是傳送方不同的程序可以使用同一傳輸層協議傳輸資料,分用是接收方在傳輸層剝去報文首部可以將這些資料正確交付目的應用程序;傳輸層對整個報文進行差錯檢測。

3.1

    埠標識主機中的應用程式,程序資料通過埠向下交付給傳輸層,埠號長度為16bit,可以標識65536個不同的埠號,埠號只具有本地意義!

    結合埠,網路中使用傳送和接受方的套接字socket(主機IP+埠號)組合來標識端點

3.2TCP

儘管下層的網路不可靠,但可以加入一些邏輯使其可靠,面向連線的tcp向上提供一條全雙工的可靠通道,在傳送資料前需要先建立連線,在資料傳送結束後釋放連線,為了可靠傳輸,

TCP加入瞭如確認、流量控制、計時器和擁塞控制等,不僅使tcp頭部大,佔用的處理機資源也會多,時期主要適用於更可靠和更重要的場合如檔案傳輸協議FTP,超文字傳輸協議HTTP和遠端登入TELENT等。

tcp保證傳輸的可靠、有序、無丟失和不重複,特點是:

(1)面向連線(每條tcp連線只能是一端到一端);

(2)全雙工允許雙方任意傳送資料,傳送方的快取臨時存放tcp準備傳送和tcp已傳送但未確認的資料,接收方則快取按序到達但未讀取的資料和未按序到達的資料);

(3)面向位元組流,雖然應用程式交給tcp固定或者不固定的資料塊,但tcp僅將它們視為無結構的位元組流。

    

tcp報頭最短需要為

20位元組:

序號欄位是報文資料的第一個位元組的序號(tcp給每個位元組都編了序號);

確認號則是期待收到的下一個報文段的資料的第一個位元組的序號(若確認號=N,則N-1已正確接受);

確認位ACKTCP建立連線後都會置為1,表示確認號欄位有效;

復位位RST=1意味著tcp連接出錯(主機崩潰等),必須釋放連線然後重新嘗試建立連線;

同步位SYN=1&&ACK=0)表示這是一個連線請求,而對方的響應報文如果為(SYN=1ACK=1)則意味著同意建立連線;

終止位FIN=1請求釋放連線;

視窗大小指出限制傳送快取空間有限,傳送方最多能傳送的資料量(如確認號700,視窗大小1000,則意味著傳送端能傳送

701~1700的資料),

選項欄位基本上就是最大報文段長度MSS,指出TCP報文段中資料欄位的最大長度。

MSS的大小並非考慮接收方快取放不下TCP報文段,其與接收視窗木有關係,TCP首部+IP首部至少40位元組,加上鍊路層的開銷,若MSS過小,網路利用率太低,但若MSS過大,IP層可能會分解為多個數據報片,接收端需要合併,且傳輸出現差錯時,還需要重傳。所以MSS需要儘量大但不使IP分片,但IP資料報經過的路徑動態變化,最佳MSS很難確定,議案預設為MSS=536

3.2.1三次握手

 

步驟:

(1)客戶端的TCP首先向服務端的TCP傳送一個連線請求報文段,攜帶SYN=1seq = x(隨機序列號) --連線請求報文不攜帶資料,但要消耗一個序號

(2)當服務端收到客戶端發出的請求報文段後,若同意建立連線,則向客戶端發回確認,並給TCP連線分配TCP快取和變數SYN=1ACK=1,(確認號)ack=x+1seq=y(起始序號--隨機產生)---不攜帶資料,但也消耗一個隨機序號

(3)當客戶端收到服務端的確認連線時,向伺服器再次傳送確認 ACK=1 seq=x+1,確認號ack=y+1給連線分配快取和變數,可以攜帶資料報

全雙工通訊:通訊雙方的應用程序在任何時候都能傳送資料。


注意1:為何不使用兩次握手?

AB的連線請求1如果長時間滯留在網路中導致A重發請求2建立了連線2並且在傳輸完資料和釋放連線2後(假設釋放不等待2MSL,這也是等待的2MSL原因),滯留的請求1到達B,就會建立連線1,一直等待A傳輸資料。而三次握手,B需要返回確認報文段,A會無視該報文段,連線便建立失敗。

注意2:為何序號隨機?

考慮AB頻繁的建立和釋放連線,那肯定不能釋放時都等2MSL時間,那麼A在第n次連線時發的一些報文可能會滯留的比較久,當ABn+x次連線建立時該資料到達,則可能會因為序號在新連線的接收範圍內而被接收。所以新的TCP連線的初始序號一定與其之前連線使用過的序號不一樣

3.2.2四次揮手

 

步驟:

1)客戶端要關閉連線,則傳送連線釋放報文段並停止再發送資料FIN=1seq=u,(u等於前面已傳送過的資料的最後一個位元組的序號加1)。TCP是全雙工的,一條TCP連線上兩條資料通路,當傳送FIN報文時,傳送FIN的一端就不能再發送資料,關閉其中一條資料通路,但對方還可以傳送資料。

(2)伺服器收到連線釋放報文段發出確認,確認號ACK=1,ack=u+1,隨機序列號seq=v。此時客戶端到伺服器這個方向就釋放了,處於半關閉狀態。但伺服器若傳送資料,客戶機仍要接收,因為伺服器到客戶機這個方向的連線並未關閉。

(3)若伺服器沒有要想客戶端傳送的資料,通知TCP釋放連線,FIN=1ACK=1 seq=w,ack=u+1

(4)客戶端收到連線釋放報文段後,必須發出確認。ACK=1ack=w+1,seq=u+1。此時TCP連線還沒有釋放掉,必須經過時間等待計時器設定時間為2MSL後,客戶端才關閉。

注:為什麼要經過2MSL時間?

1、確保客戶端傳送的最後一個確認報文段可以到達服務端,當確認報文段發生超時,需要客戶端重傳,在2MSL時間內被服務端接收。

2、防止在此期間,一些報文段仍在網路中生存,徹底關閉後,如果有一個socket四元組重新建立連線,這些垃圾報文段就會錯誤的被新連線接收,等待2MSL可以使滯留在網路中的垃圾報文段徹底消失。

連線和釋放注意三個問題:

1)要使每一方能夠確知對方的存在

2)要允許雙方協商一些引數(如最大報文段長度,最大視窗大小,服務質量等)

3)能夠對運輸實體資源(如快取大小,連線表中的專案等)進行分配


3.2.3TCP可靠傳輸

序號欄位和確認欄位+重傳保證可靠,重傳在超時和冗餘ACK的情況下會發生

超時:TCP傳送報文段會設定該報文段的計時器,並自適應設定重傳時間(每個報文段發出和確認的時間差為往返時間差RTTTCP保留RTT的加權平均RTTs作為重傳時間)

冗餘ACK這種情況其實就是擁塞控制的快速重傳,因為TCP規定當收到比期待序號大的失序報文段到達時傳送冗餘ACK指明下一個期待位元組的序號,在不等待超時,連續收到3個冗餘ACK就認為該確認報文段之後的報文丟失了,立即重傳。

http://blog.csdn.net/ns_code/article/details/32707721

快重傳演算法首先要求接收方每收到一個失序的報文段後就立即發出重複確認(重複傳送對前面有序部分的確認),而不是等待自己傳送資料時才進行稍待確認,也不是累積收到的報文傳送累積確認,如果傳送方連續收到三個重複確認,就應該立即重傳對方未收到的報文段(有收到重複確認,說明後面的報文段都送達了,只有中間丟失的報文段沒送達))

在鏈路層保證可靠的情況下,為何還需要TCP可靠:因為IP不可靠,無序

3.2.4TCP流量控制

跟鏈路層一樣使用滑動視窗,不管TCP接收方的接收視窗rwnd可以根據接收快取的大小來動態的調整發送方傳送視窗的大小swnd,當然,用於擁塞控制的的擁塞視窗cwnd的大小與網路頻寬和時延密切相關。(TCP需要維護兩個視窗)

AB發資料,B回覆確認報文時設定視窗欄位(為rwndcwnd的最小值),這樣A就根據這個最新的視窗值來控制傳送效率。

 

流量控制就是讓傳送方的傳送速率不要太快,讓接收方來得及接收。

    對於成塊資料流TCP利用滑動視窗機制來實現流量的控制,對於互動資料流TCP利用捎帶ACKNagle演算法來實現流量的控制。