1. 程式人生 > >傳輸層協議

傳輸層協議

傳輸層協議

傳輸層定義了主機應用程序之間端到端的連通性。傳輸層中最為常見的兩個協議分別是傳輸控制協議TCP(Transmission Control Protocol )和 用戶數據包協議UDP(User Datagram Protocol)。

技術分享

TCP位於TCP/IP模型的傳輸層,它是一種面向連接的端到端協議。TCP作為傳輸控制協議,可以為主機提供可靠的數據傳輸。TCP需要依賴網絡協議為主機提供可用的傳輸路徑。在本例中,兩臺主機在通信之前,需要TCP在它們之間建立可靠的傳輸通道。

技術分享

TCP允許一個主機同時運行多個應用進程。每臺主機可以擁有多個應用端口,每對端口號、源和目標IP地址的組合唯一地標識了一個會話。端口分為知名端口和動態端口。有些網絡服務會使用固定的端口,這類端口稱為知名端口,端口號範圍為0-1023。如FTP、HTTP、Telnet、SNMP服務均使用知名端口。動態端口號範圍從1024到65535,這些端口號一般不固定分配給某個服務,也就是說許多服務都可以使用這些端口。只要運行的程序向系統提出訪問網絡的申請,那麽系統就可以從這些端口號中分配一個供該程序使用。

技術分享

TCP通常使用IP作為網絡層協議,這時TCP數據段被封裝在IP數據包內。

TCP數據段由TCP Header(頭部)和TCP Data(數據)組成。TCP最多可以有60個字節的頭部,如果沒有Options字段,正常的長度是20字節。

TCP Header是由如上圖標識一些字段組成,這裏列出幾個常用字段。

16位源端口號:源主機的應用程序使用的端口號。

16位目的端口號:目的主機的應用程序使用的端口號。每個TCP頭部都包含源和目的端的端口號,這兩個值加上IP頭部中的源IP地址和目的IP地址可以唯一確定一個TCP連接。

32位序列號:用於標識從發送端發出的不同的TCP數據段的序號。數據段在網絡中傳輸時,它們的順序可能會發生變化;接收端依據此序列號,便可按照正確的順序重組數據。

32位確認序列號:用於標識接收端確認收到的數據段。確認序列號為成功收到的數據序列號加1。

4位頭部長度:表示頭部占32bit字的數目,它能表達的TCP頭部最大長度為60字節。

16位窗口大小:表示接收端期望通過單次確認而收到的數據的大小。由於該字段為16位,所以窗口大小的最大值為65535字節,該機制通常用來進行流量控制。

16位校驗和:校驗整個TCP報文段,包括TCP頭部和TCP數據。該值由發送端計算和記錄並由接收端進行驗證。


技術分享

TCP是一種可靠的,面向連接的全雙工傳輸層協議。

TCP連接的建立是一個三次握手的過程。如圖所示:

主機A(通常也稱為客戶端)發送一個標識了SYN的數據段,表示期望與服務器A建立連接,此數據段的序列號(seq)為a。

服務器A回復標識了SYN+ACK的數據段,此數據段的序列號(seq)為b,確認序列號為主機A的序列號加1(a+1),以此作為對主機A的SYN報文的確認。

主機A發送一個標識了ACK的數據段,此數據段的序列號(seq)為a+1,確認序列號為服務器A的序列號加1(b+1),以此作為對服務器A的SYN報文段的確認。

技術分享

TCP的可靠傳輸還體現在TCP使用了確認技術來確保目的設備收到了從源設備發來的數據,並且是準確無誤的。

確認技術的工作原理如下:

目的設備接收到源設備發送的數據段時,會向源端發送確認報文,源設備收到確認報文後,繼續發送數據段,如此重復。

如圖所示,主機A向服務器A發送TCP數據段,為描述方便假定每個數據段的長度都是500個字節。當服務器A成功收到序列號是M+1499的字節以及之前的所有字節時,會以序列號M+1499+1=M+1500進行確認。另外,由於數據段N+3傳輸失敗,所以服務器A未能收到序列號為M+1500的字節,因此服務器A還會再次以序列號M+1500進行確認。

技術分享

CP滑動窗口技術通過動態改變窗口大小來實現對端到端設備之間的數據傳輸進行流量控制。

如圖所示,主機A和服務器A之間通過滑動窗口來實現流量控制。為方便理解,此例中只考慮主機A發送數據給服務器A時,服務器A通過滑動窗口進行的流量控制。

主機A向服務器發送4個長度為1024字節的數據段,其中主機的窗口大小為4096個字節。服務器A收到第3個數據段後,緩存區滿,第4個數據段被丟棄。服務器以ACK3073響應,窗口大小調整為3072,表明服務器的緩沖區只能處理3072個字節的數據段。於是主機A改變其發送速率,發送窗口大小為3072的數據段。

技術分享

TCP支持全雙工模式傳輸數據,這意味著同一時刻兩個方向都可以進行數據的傳輸。在傳輸數據之前,TCP通過三次握手建立的實際上是兩個方向的連接,因此在傳輸完畢後,兩個方向的連接必須都關閉。

TCP連接的建立是一個三次握手的過程,而TCP連接的終止則要經過四次握手。

如圖所示:

主機A想終止連接,於是發送一個標識了FIN,ACK的數據段,序列號為a,確認序列號為b。

服務器A回應一個標識了ACK的數據段,序列號為b,確認序號為a+1,作為對主機A的FIN報文的確認。

服務器A想終止連接,於是向主機A發送一個標識了FIN,ACK的數據段,序列號為b,確認序列號為a+1。

主機A回應一個標識了ACK的數據段,序列號為a+1,確認序號為b+1,作為對服務器A的FIN報文的確認。

以上四次交互便完成了兩個方向連接的關閉。

技術分享

當應用程序對傳輸的可靠性要求不高,但是對傳輸速度和延遲要求較高時,可以用UDP協議來替代TCP協議在傳輸層控制數據的轉發。UDP將數據從源端發送到目的端時,無需事先建立連接。UDP采用了簡單、易操作的機制在應用程序間傳輸數據,沒有使用TCP中的確認技術或滑動窗口機制,因此UDP不能保證數據傳輸的可靠性,也無法避免接收到重復數據的情況。

技術分享

UDP報文分為UDP報文頭和UDP數據區域兩部分。報頭由源端口、目的端口、報文長度以及校驗和組成。UDP適合於實時數據傳輸,如語音和視頻通信。相比於TCP,UDP的傳輸效率更高、開銷更小,但是無法保障數據傳輸的可靠性。UDP頭部的標識如下:

16位源端口號:源主機的應用程序使用的端口號。

16位目的端口號:目的主機的應用程序使用的端口號。

16位UDP長度:是指UDP頭部和UDP數據的字節長度。因為UDP頭部長度為8字節,所以該字段的最小值為8。

16位UDP校驗和:該字段提供了與TCP校驗字段同樣的功能;該字段是可選的。

技術分享

主機A發送數據包時,這些數據包是以有序的方式發送到網絡中的,每個數據包獨立地在網絡中被發送,所以不同的數據包可能會通過不同的網絡路徑到達主機B。這樣的情況下,先發送的數據包不一定先到達主機B。因為UDP數據包沒有序號,主機B將無法通過UDP協議將數據包按照原來的順序重新組合,所以此時需要應用程序提供報文的到達確認、排序和流量控制等功能。通常情況下,UDP采用實時傳輸機制和時間戳來傳輸語音和視頻數據。


技術分享

UDP適合傳輸對延遲敏感的流量,如語音和視頻。

在使用TCP協議傳輸數據時,如果一個數據段丟失或者接收端對某個數據段沒有確認,發送端會重新發送該數據段。

TCP重新發送數據會帶來傳輸延遲和重復數據,降低了用戶的體驗。對於遲延敏感的應用,少量的數據丟失一般可以被忽略,這時使用UDP傳輸將能夠提升用戶的體驗。




TCP頭部中的確認標識位有什麽作用?

TCP頭部中有哪些標識位參與TCP三次握手?

TCP報文頭中的ACK標誌位用於目的端對已收到數據的確認。目的端成功收到序列號為x的字節及之前的所有字節後,會以序列號x+1進行確認。

在TCP的三次握手過程中,要使用SYN和ACK標誌位來請求建立連接和確認建立連接。


本文出自 “大李子” 博客,謝絕轉載!

傳輸層協議