Linux網絡編程基礎_5_傳輸層(下)--TCP協議

傳輸層

--TCP協議



一、TCP概述

    傳輸控制協議(TransmissionControl ProtocolTCP是一種面向連接(連接導向)的、可靠的、基於字節流的傳輸層(Transportlayer)通信協議。TCPIP報文的協議號是6


二、TCP數據段


1、源端口和目的端口字段:各佔2字節。端口是運輸層與應用層的服務接口。運輸層的複用和分用功能都要通過端口才能實現。

2、序號字段:佔4字節。TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。

3、確認號字段:佔4字節,是期望收到對方下一個報文段的數據的第一個字節的序號。

4、數據偏移:佔4 bit它指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠。“數據偏移”的單位不是字節而是32bit4字節爲計算單位)。

5、保留字段:佔6bit,保留爲今後使用,但目前應置爲0

6、緊急比特URG——URG= 1時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應儘快傳送(相當於高優先級的數據)

7、確認比特ACK——只有當ACK= 1確認號字段纔有效。當ACK= 0時,確認號無效。

8、推送比特PSH(PuSH) —— 接收TCP收到推送比特置1的報文段,就儘快地交付給接收應用進程,而不再等到整個緩存都填滿了後再向上交付

9、復位比特RST(ReSeT) —— RST= 1時,表明TCP連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然後再重新建立運輸連接(重新連接)

10、同步比特SYN——同步比特SYN置爲1,就表示這是一個連接請求或連接接受報文。

11、終止比特FIN(FINal) —— 用來釋放一個連接。當FIN= 1時,表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接

12、窗口字段:佔2字節。窗口字段用來控制對方發送的數據量,單位爲字節。TCP連接的一端根據設置的緩存空間大小確定自己的接收窗口大小,然後通知對方以確定對方的發送窗口的上限。

13、檢驗和:佔2字節。檢驗和字段檢驗的範圍包括首部和數據這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節的僞首部。

14、緊急指針字段:佔16bit。緊急指針指出在本報文段中的緊急數據的最後一個字節的序號。

15、選項字段:長度可變。TCP只規定了一種選項,即最大報文段長度MSS(Maximum Segment Size)MSS告訴對方TCP:“我的緩存所能接收的報文段的數據字段的最大長度是MSS個字節。”

MSSTCP報文段中的數據字段的最大長度。數據字段加上TCP首部纔等於整個的TCP報文段。

16、填充字段:這是爲了使整個首部長度是4字節的整數倍。


三、TCP連接管理

1、連接建立(TCP的三次握手(three-wayhandshake))


    第一步,A端的TCP首先向B端的TCP發送一個特殊的TCP報文段SYN,此報文段中的SYN標誌被置1,同時初始化一個起始序號;

    第二步,當B端收到A端發來的SYN報文段,會爲該TCP連接分配TCP緩存和變量,並向A端回覆一個允許連接的報文段SYNACK

    第三步,在收到允許連接的報文段後,A端也要給該連接分配緩存和變量。然後向B端發送另一個報文段,用於對B端允許連接的SYNACK報文段進行確認。


2、數據傳輸(見圖1

    一旦建立起TCP連接,兩個應用進程之間就可以相互發送數據了。

    通信雙方主機中的應用進程之間的數據傳輸是字節流方式的。發送方主機中的TCP將來自進程的數據放到該連接的發送緩存裏,然後TCP就會不時從發送緩存裏取出一塊數據準備發送。


3、連接終止(四次揮手)


    在數據傳輸結束後,通信雙方都可以發出釋放連接的請求。

    基於網絡服務的不可靠性,必須考慮到在釋放連接時,可能由於數據包的失序而使釋放連接請求的數據包會比其他數據包先到達目的端。此時,如果目的端由於收到了釋放連接請求的數據包而立即釋放該連接,則勢必造成那些先發而後至的數據包丟失。

    爲了解決這些問題,可以把TCP連接看成是一對單工來處理連接的釋放,每個單工連接獨立的釋放。


四、TCP特點

1.面向連接的傳輸;

2.端到端的通信;每一條TCP連接只能有兩個端點;

3.高可靠性,確保傳輸數據的正確性,不出現丟失或亂序;

4.全雙工方式傳輸;

5.面向字節流,採用字節流方式,即以字節爲單位傳輸字節序列;

6.緊急數據傳送功能。

注意:

    TCP是一條虛連接而不是一條實際存在的物理鏈路。


五、TCP協議和UDP協議的區別

1TCP協議面向連接,UDP協議面向非連接

2TCP協議傳輸速度慢,UDP協議傳輸速度快

3TCP協議保證數據順序,UDP協議不保證

4TCP協議保證數據正確性,UDP協議可能丟包

5TCP協議對系統資源要求多,UDP協議要求少


六、TCP數據編號與確認

    TCP協議是面向字節的。TCP將所要傳送的報文看成是字節組成的數據流,並使每一個字節對應於一個序號。

    在連接建立時,雙方要商定初始序號TCP每次發送的報文段的首部中的序號字段數值表示該報文段中的數據部分的第一個字節的序號。

    TCP的確認是對接收到的數據的最高序號表示確認。接收端返回的確認號是已收到的數據的最高序號加1。因此確認號表示接收端期望下次收到的數據中的第一個數據字節的序號。


七、TCP的三種基本發送機制

1TCP維持一個變量,它等於MSS,只要發送緩存從發磅進程得到的數據達到MSS字節時,就組裝報文發送出去。

2、發送端的應用進程指明要求發送的報文端,即TCP支持的推送(push)操作。

3、發送端的一個計時器時間到了,這時就把當前已有的緩存數據裝入報文段發送出去


八、Nagle算法

    若發送端應用進程將欲發送的數據逐個字節地送到發送端的TCP緩存,則發送端就將第一個字節先發送出去,將後面到達的字符先緩存起來。

    當發送端收到對第一個字符確認後,再將緩存中的所有字符裝成一個報文段發送出去,同時繼續對隨後到達的字符進行緩存

    只有在收到對前一個報文段的確認後才繼續發送下一個報文段。


九、TCP的流量控制

1、滑動窗口

    TCP採用大小可變的滑動窗口進行流量控制窗口大小的單位是字節

    在TCP報文段首部的窗口字段寫入的數值就是當前給對方設置的發送窗口數值的上限。

    發送窗口在連接建立時由雙方商定。但在通信的過程中,接收端可根據自己的資源情況,隨時動態地調整對方的發送窗口上限值(可增大或減小)


2、發送過程及詳細分析

1)

    發送端要發送900字節長的數據,劃分爲9100字節長的報文段,而發送窗口確定爲500字節

    發送端只要收到了對方的確認,發送窗口就可前移。

    發送TCP要維護一個指針。每發送一個報文段,指針就向前移動一個報文段的距離。

2



    發送端已發送了400字節的數據,但只收到對前200字節數據的確認,同時窗口大小不變。

    現在發送端還可發送300字節

3


    發送端收到了對方對前400字節數據的確認,但對方通知發送端必須把窗口減小到400字節。

    現在發送端最多還可發送400節的數據。


3、利用可變窗口大小進行流量控制(雙方確定的窗口值是400



十、慢開始和擁塞避免

1、發送端的主機在確定發送報文段的速率時,既要根據接收端的接收能力,又要從全局考慮不要使網絡發生擁塞。

      因此,每一個TCP連接需要有以下兩個狀態變量:

接收端窗口rwnd(receiver window)又稱爲通知窗口(advertisedwindow)

擁塞窗口cwnd(congestion window)


2、接收段窗口rwnd和擁塞窗口cwnd

(1)接收端窗口rwnd:這是接收端根據其目前的接收緩存大小所許諾的最新的窗口值,是來自接收端的流量控制。接收端將此窗口值放在TCP報文的首部中的窗口字段,傳送給發送端。

(2)擁塞窗口cwnd:是發送端根據自己估計的網絡擁塞程度而設置的窗口值,是來自發送端的流量控制。

3、發送窗口的上限值

    發送端的發送窗口的上限值應當取爲接收端窗口rwnd和擁塞窗口cwnd這兩個變量中較小的一個,即應按以下公式確定:

    發送窗口的上限值=Min(rwnd, cwnd)

    當rwnd< cwnd時,是接收端的接收能力限制發送窗口的最大值。

    當cwnd< rwnd時,則是網絡的擁塞限制發送窗口的最大值。


4、慢開始算法原理

    在主機剛剛開始發送報文段時可先將擁塞窗口cwnd設置爲一個最大報文段MSS的數值。

    在每收到一個對新的報文段的確認後,將擁塞窗口增加至多一個MSS的數值

    用這樣的方法逐步增大發送端的擁塞窗口cwnd,可以使分組注入到網絡的速率更加合理。


5、慢開始和擁塞避免算法的實現舉例



1)當TCP連接進行初始化時,將擁塞窗口置爲1。圖中的窗口單位不使用字節而使用報文段。

      慢開始門限的初始值設置爲16個報文段,即ssthresh= 16

      發送端的發送窗口不能超過擁塞窗口cwnd和接收端窗口rwnd中的最小值。我們假定接收端窗口足夠大,因此現在發送窗口的數值等於擁塞窗口的數值。

2)在執行慢開始算法時,擁塞窗口cwnd的初始值爲1,發送第一個報文段M0

3)發送端收到ACK1(確認M0,期望收到M1)後,將cwnd1增大到2,於是發送端可以接着發送M1M2兩個報文段。

4)接收端發回ACK2ACK3。發送端每收到一個對新報文段的確認ACK,就把發送端的擁塞窗口加1。現在發送端的cwnd2增大到4,並可發送M4~ M64個報文段。

5)發送端每收到一個對新報文段的確認ACK,就把發送端的擁塞窗口加1,因此擁塞窗口cwnd隨着傳輸次數按指數規律增長。

6)當擁塞窗口cwnd增長到慢開始門限值ssthresh時(即當cwnd= 16 時),就改爲執行擁塞避免算法,擁塞窗口按線性規律增長。

7)假定擁塞窗口的數值增長到24時,網絡出現超時(表明網絡擁塞了)。

8)更新後的ssthresh值變爲12(即發送窗口數值24的一半),擁塞窗口再重新設置爲1,並執行慢開始算法。

9)當cwnd= 12 時改爲執行擁塞避免算法,擁塞窗口按按線性規律增長,每經過一個往返時延就增加一個MSS的大小。


6、乘法減小(multiplicativedecrease)

    “乘法減小“是指不論在慢開始階段還是擁塞避免階段,只要出現一次超時(即出現一次網絡擁塞),就把慢開始門限值ssthresh設置爲當前的擁塞窗口值乘以0.5

    當網絡頻繁出現擁塞時,ssthresh值就下降得很快,以大大減少注入到網絡中的分組數


7、加法增大(additiveincrease)

    “加法增大”是指執行擁塞避免算法後,當收到對所有報文段的確認就將擁塞窗口cwnd增加一個MSS大小,使擁塞窗口緩慢增大,以防止網絡過早出現擁塞。

【附】

    “擁塞避免”並非指完全能夠避免了擁塞。利用以上的措施要完全避免網絡擁塞還是不可能的。

    “擁塞避免”是說在擁塞避免階段把擁塞窗口控制爲按線性規律增長,使網絡比較不容易出現擁塞。


十一、快重傳與快恢復

    快重傳算法規定,發送端只要一連收到三個重複的ACK即可斷定有分組丟失了,就應立即重傳丟失的報文段而不必繼續等待爲該報文段設置的重傳計時器的超時。

    不難看出,快重傳並非取消重傳計時器,而是在某些情況下可更早地重傳丟失的報文段。

1、快重傳舉例


2、快恢復算法

(1)當發送端收到連續三個重複的ACK時,就重新設置慢開始門限ssthresh

(2)與慢開始不同之處是擁塞窗口cwnd不是設置爲1,而是設置爲ssthresh+ 3*MSS

(3)若收到的重複的ACKn個(n> 3),則將cwnd設置爲ssthresh+ n*MSS

(4)若發送窗口值還容許發送報文段,就按擁塞避免算法繼續發送報文段。

(5)若收到了確認新的報文段的ACK,就將cwnd縮小到ssthresh

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章