從信息處理得角度上去看,傳輸層主要是給上面得應用層提供通訊服務得。咱們平時再對網絡進行編程得時候,咱們不少時候都是直接對接得傳輸層,也就是咱們使用傳輸層所提供得接口來進行網絡編程,因此咱們常說傳輸層是用戶功能得最底層,是面向通訊部份得最高層。
傳輸層負責將上層數據分段並提供端到端的、可靠的或不可靠的傳輸以及端到端的差錯控制和流量控制問題;包含的主要協議:TCP協議(Transmission Control Protocol,傳輸控制協議)、UDP協議(User Datagram Protocol,用戶數據報協議)。算法
UDP(User Datagram Protocol: 用戶數據報協議),是一個很是簡單的協議,它對接收到的數據報不合並也不拆分,以下圖:
UDP協議格式:編程
16位源端口號 | 16位目的端口號 |
16位UDP長度 | 16位UDP校驗和 |
UDP數據 |
UDP協議的特色:UDP是無鏈接協議;UDP不能保證可靠的交付數據,即UDP協議不會感知網絡是否擁塞,UDP協議無論網絡是否擁塞,都會把數據交付出去,給這個網絡就完了。沒法保證數據在網絡中是否丟失;UDP是面向報文傳輸的;UDP沒有擁塞控制,並且UDP首部開銷很小。服務器
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位,每位各有不一樣意義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 表示釋放鏈接 |
窗口:佔16位:0~\(2^{16}\)-1,窗口指明容許對方發送的數據量
緊急指針:緊急數據(URG=1),指定緊急數據在報文的位置
TCP選項:最多40字節,支持將來的拓展spa
TCP的可靠傳輸基於連續ARQ協議,TCP的滑動窗口以字節爲單位,窗口滑動過程以下圖:
若是接收到的序號沒有按序收到確認號,在超時時間內就會進行從新傳送,以下圖:
爲了不對整個窗口中的字節進行重傳,所以TCP協議使用了選擇重傳來提升傳輸效率。選擇重傳:重傳的是一段字節流,而不是某個字節,在TCP選項裏存儲的是須要重傳的字節流的邊界。選擇重傳須要指定須要重傳的字節,每個字節都有惟一的32位序號。計算機網絡
流量控制指讓發送方發送速率不要太快,是使用滑動窗口來實現的,即經過窗口大小控制對方發送速率。當接收到窗口爲0的消息,則啓動堅持定時器,堅持定時器每隔一段時間發送一個窗口探測報文。
3d
一條數據鏈路通過很是多的設備,數據鏈路中各個部分都有可能成爲網路傳輸的瓶頸。流量控制考慮點對點的通訊量的控制,擁塞控制考慮整個網絡,是全局性的考慮。如何判斷是否發生了網絡擁塞?根據報文超時來判斷髮生了擁塞是不成立的,若是咱們在傳輸的過程當中,把光纖或者網絡斷了,這個時候也會致使報文超時,但這是由於網絡故障形成的
慢啓動算法: 由小到大逐漸增長髮送數據量,每收到一個報文確認,就加一。例如:發送的數據量以此爲:1 2 4 8 16...,是指數增加的。當使用慢啓動算法增加到慢啓動閾值時,就會使用擁塞避免算法;擁塞避免算法:維護一個擁塞窗口的變量,只要網絡不擁塞,就試探着擁塞窗口調大,如1 2 4 8 16 17 18 19。指針
標記 | 含義 |
---|---|
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三次握手的過程:blog
在客戶端與服務器端傳輸的TCP報文中,雙方的確認號Ack和序號Seq的值,都是在彼此Ack和Seq值的基礎上進行計算的,這樣作保證了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報文多數狀況下都是分開發送的。
傳輸層總結:第一個端到端,即主機到主機的層次。傳輸層負責將上層數據分段並提供端到端的、可靠的或不可靠的傳輸。此外,傳輸層還要處理端到端的差錯控制和流量控制問題。 傳輸層的任務是根據通訊子網的特性,最佳的利用網絡資源,爲兩個端系統的會話層之間,提供創建、維護和取消傳輸鏈接的功能,負責端到端的可靠數據傳輸。在這一層,信息傳送的協議數據單元稱爲段或報文。 網絡層只是根據網絡地址將源結點發出的數據包傳送到目的結點,而傳輸層則負責將數據可靠地傳送到相應的端口。 有關網絡層的重點: