傳輸層概述
從資訊處理得角度上去看,傳輸層主要是給上面得應用層提供通訊服務得。我們平時再對網路進行程式設計得時候,我們很多時候都是直接對接得傳輸層,也就是我們使用傳輸層所提供得介面來進行網路程式設計,所以我們常說傳輸層是使用者功能得最底層,是面向通訊部份得最高層。
傳輸層負責將上層資料分段並提供端到端的、可靠的或不可靠的傳輸以及端到端的差錯控制和流量控制問題;包含的主要協議:TCP協議(Transmission Control Protocol,傳輸控制協議)、UDP協議(User Datagram Protocol,使用者資料包協議)。
UDP協議
UDP(User Datagram Protocol: 使用者資料包協議),是一個非常簡單的協議,它對接收到的資料包不合並也不拆分,如下圖:
UDP協議格式:
16位源埠號 | 16位目的埠號 |
16位UDP長度 | 16位UDP校驗和 |
UDP資料 |
UDP協議的特點:UDP是無連線協議;UDP不能保證可靠的交付資料,即UDP協議不會感知網路是否擁塞,UDP協議不管網路是否擁塞,都會把資料交付出去,給這個網路就完了。無法保證資料在網路中是否丟失;UDP是面向報文傳輸的;UDP沒有擁塞控制,而且UDP首部開銷很小。
TCP協議
TCP(Transmission Control Protocol: 傳輸控制協議),是計算機網路中非常複雜的一個協議。
TCP協議特點:TCP是面向連線的協議;TCP的一個連線有兩端(點對點通訊);TCP提供可靠的傳輸服務;TCP協議提供全雙工的通訊;TCP是面向位元組流的協議。
TCP協議格式:
16位源埠 | 16位目的埠 | ||||
序號 | |||||
確認號 | |||||
資料偏移 | 保留欄位 | TCP標記 | 視窗 | ||
校驗和 | 緊急指標 |
TCP選項 | 填充 |
序號:0~\(2^{32}\)-1,一個位元組一個序號, 資料首位元組序號
確認號:0~\(2^{32}\)-1,一個位元組一個序號, 期望收到資料的首位元組序號。確認號為N:則表示N-1序號的資料都已經收到。
資料偏移:佔4位:0~15,單位為:32位字,資料偏離首部的距離。
TCP標記:佔6位,每位各有不同意義
標記 | 含義 |
---|---|
URG | Urgent: 緊急位,URG=1,表示緊急資料 |
ACK | Acknowledgement: 確認位,ACK=1,確認號才生效 |
PSH | Push: 推送位,PSH=1,儘快地把資料交付給應用層 |
RST | Reset: 重置位,RST=1,重新建立連線 |
SYN | Synchronization: 同步位,SYN=1 表示連線請求報文 |
FIN | Finish: 終止位,FIN=1 表示釋放連線 |
視窗:佔16位:0~\(2^{16}\)-1,視窗指明允許對方傳送的資料量
緊急指標:緊急資料(URG=1),指定緊急資料在報文的位置
TCP選項:最多40位元組,支援未來的擴充
可靠傳輸的基本原理
- 停止等待協議:傳送方生成新的訊息,傳送給接收方,並且此時不會產生新的訊息,需要收到接受方的確認訊息後,才會產生新的訊息。超時重傳:如果傳送方的訊息在傳輸的過程種丟失了,接收方沒有收到訊息,就會進行超時重傳;如果接收方傳送的確認訊息,在傳輸的過程中丟失,也會進行超時重傳,因此 每傳送一個訊息,都需要設定一個定時器。停止等待協議是最簡單的可靠傳輸協議,但停止等待協議對通道的利用效率不高。
- 連續ARQ協議:ARQ(Automatic Repeat reQuest:自動重傳請求),由於單個傳送和確認效率低,我們可以通過批量傳送和確認來提升效率。
TCP的可靠傳輸基於連續ARQ協議,TCP的滑動視窗以位元組為單位,視窗滑動過程如下圖:
如果接收到的序號沒有按序收到確認號,在超時時間內就會進行重新傳送,如下圖:
為了避免對整個視窗中的位元組進行重傳,因此TCP協議使用了選擇重傳來提高傳輸效率。選擇重傳:重傳的是一段位元組流,而不是某個位元組,在TCP選項裡儲存的是需要重傳的位元組流的邊界。選擇重傳需要指定需要重傳的位元組,每一個位元組都有唯一的32位序號。
TCP協議的流量控制
流量控制指讓傳送方傳送速率不要太快,是使用滑動視窗來實現的,即通過視窗大小控制對方傳送速率。當接收到視窗為0的訊息,則啟動堅持定時器,堅持定時器每隔一段時間傳送一個視窗探測報文。
TCP協議的擁塞控制
一條資料鏈路經過非常多的裝置,資料鏈路中各個部分都有可能成為網路傳輸的瓶頸。流量控制考慮點對點的通訊量的控制,擁塞控制考慮整個網路,是全域性性的考慮。如何判斷是否發生了網路擁塞?根據報文超時來判斷髮生了擁塞是不成立的,如果我們在傳輸的過程中,把光纖或者網路斷了,這個時候也會導致報文超時,但這是因為網路故障造成的
慢啟動演算法: 由小到大逐漸增加傳送資料量,每收到一個報文確認,就加一。例如:傳送的資料量以此為:1 2 4 8 16...,是指數增長的。當使用慢啟動演算法增長到慢啟動閾值時,就會使用擁塞避免演算法;擁塞避免演算法:維護一個擁塞視窗的變數,只要網路不擁塞,就試探著擁塞視窗調大,如1 2 4 8 16 17 18 19。
TCP連線的建立
標記 | 含義 |
---|---|
URG | Urgent: 緊急位,URG=1,表示緊急資料 |
ACK | Acknowledgement: 確認位,ACK=1,確認號才生效 |
PSH | Push: 推送位,PSH=1,儘快地把資料交付給應用層 |
RST | Reset: 重置位,RST=1,重新建立連線 |
SYN | Synchronization: 同步位,SYN=1 表示連線請求報文 |
FIN | Finish: 終止位,FIN=1 表示釋放連線 |
TCP三次握手的過程:
- 第一次握手:建立連線時,客戶端(傳送方)傳送syn包(seq=j)到伺服器,並進入SYN_SENT狀態,等待伺服器(接收方)確認;
- 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(seq=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態。
- 第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED(TCP連線成功)狀態,完成三次握手
在客戶端與伺服器端傳輸的TCP報文中,雙方的確認號Ack和序號Seq的值,都是在彼此Ack和Seq值的基礎上進行計算的,這樣做保證了TCP報文傳輸的連貫性。一旦出現某一方發出的TCP報文丟失,便無法繼續"握手",以此確保了"三次握手"的順利完成。此後客戶端和伺服器端進行正常的資料傳輸。這就是“三次握手”的過程。
為什麼傳送方要發出第三個確認報文呢?
- 為了避免已經失效的連線請求報文傳送到對方,引起錯誤
TCP連線的釋放
TCP四次揮手的過程:TCP連線斷開過程:假設Client端發起中斷連線請求,也就是傳送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有資料要發給你了",但是如果你還有資料沒有傳送完成,則不必急著關閉Socket,可以繼續傳送資料。所以你先傳送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的訊息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定資料已傳送完成,則向Client端傳送FIN報文,"告訴Client端,好了,我這邊資料發完了,準備好關閉連線了"。Client端收到FIN報文後,"就知道可以關閉連線了,但是他還是不相信網路,怕Server端不知道要關閉,所以傳送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。",Server端收到ACK後,"就知道可以斷開連線了"。Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,我Client端也可以關閉連線了。Ok,TCP連線就這樣關閉了!
MSL(Max Segment Lifetime): 最長報文段壽命,MSL建議設定為2分鐘。為什麼需要等待2MSL?其實在釋放連線的過程中,客戶端最後一次傳送的報文,服務端是沒有確認的,為了確保傳送方的ACK可以達到接收方,如果2MSL時間內沒有收到,則接收方會重發。這也是等待計時器的作用,主要是為了確保傳送方傳送的第四次揮手報文可以正確的到達接收方,如果沒有到達的話,接收方就會重新放鬆第三次揮手的報文,以正確得到釋放這次連線。等待計時器的另一個作用就是確保當前連線的所有報文都已經過期。
為什麼關閉連線需要四次揮手呢?
這是因為服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裡來傳送。但關閉連線時,當收到對方的FIN報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,所以你可能未必會馬上會關閉SOCKET,也即你可能還需要傳送一些資料給對方之後,再傳送FIN報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ACK報文和FIN報文多數情況下都是分開傳送的。
傳輸層總結:第一個端到端,即主機到主機的層次。傳輸層負責將上層資料分段並提供端到端的、可靠的或不可靠的傳輸。此外,傳輸層還要處理端到端的差錯控制和流量控制問題。 傳輸層的任務是根據通訊子網的特性,最佳的利用網路資源,為兩個端系統的會話層之間,提供建立、維護和取消傳輸連線的功能,負責端到端的可靠資料傳輸。在這一層,資訊傳送的協議資料單元稱為段或報文。 網路層只是根據網路地址將源結點發出的資料包傳送到目的結點,而傳輸層則負責將資料可靠地傳送到相應的埠。 有關網路層的重點:
- 傳輸層負責將上層資料分段並提供端到端的、可靠的或不可靠的傳輸以及端到端的差錯控制和流量控制問題;
- 包含的主要協議:TCP協議(Transmission Control Protocol,傳輸控制協議)、UDP協議(User Datagram Protocol,使用者資料包協議);
- 重要裝置:閘道器。