運輸層協議--TCP及UDP協議


TCP及UDP協議

按照網絡的五層分級結構來看,TCP及UDP位於運輸層,故TCP及UDP是運輸層協議。
TCP協議--傳輸控制協議
UDP協議--用戶數據報協議

多路復用及多路分解

圖多路復用及多路分解
接受主機中的運輸層實際上並沒有直接將數據交給進程,而是通過一個中間的套接字來傳遞。由於在任何一個時刻接受主機上可能有多個套接字,所以每個套接字都已一個唯一的標識符。

主機如何將一個收到的運輸層報文段定向到合適的套接字?
為達到這一目的,在每個運輸層報文段中設置了幾個字段,在接收端,運輸層檢查並標識出接受套接字,然后將報文段定向到該套接字。
從而: 將運輸層報文段中的數據交付到正確的套接字的工作叫做多路分解
從源主機的不同套接字中手機數據塊,並為每個數據塊封裝首部信息從而生成報文段,然后將報文段傳遞到網絡層的工作叫做多路復用

UDP協議

由RFC 768定義的UDP除了多路復用/多路分解功能及一些輕型的差錯檢測外,幾部沒對IP增加別的東西。
UDP被稱為無連接的,不可靠數據傳輸

UDP報文段結構

  首部只有四個字段,每個字段兩個字節
  源端口號、目的端口號:通過端口號可以使目的主機將應用數據交給運行在目的端系統中的相應進程
  檢驗和:接收主機使用檢驗和來檢查報文段中是否存在差錯
  長度:指明包括首部在內的UDP報文段的長度(以字節為單位)

UDP檢驗和

發送方的UDP對報文段的所有16比特字的和進行反碼運算,求和時遇到任何語出都被回卷。得到的結果放在UDP報文段中的檢驗和字段。
例:假設報文段中有3個16比特字:
0110011001100000
0101010101010101
1000111100001100
前兩個16比特字之和:
0110011001100000
0101010101010101
---------------------------
1011101110110101
再將上面的和與第三個字相加,得到:
1011101110110101
1000111100001100
---------------------------
0100101011000010
最后一次加法有溢出,這要被回卷(將溢出的1放到最后位繼續加)。
反碼:0變1,1變0
1011010100111101
此時就是檢驗和
在接收方,全部的4個16比特字包括檢驗和,一起相加。如果分組中無差錯,接收方這個和將是
1111111111111111
如果其中有0那么我們就知道分組中出了差錯

TCP協議

TCP協議是一個可靠數據傳輸協議,面向連接

進程間利用網絡通信的過程中,如果數據傳輸的通道是一個可靠信道,即在數據在傳輸過程中不會產生丟失及損耗,那么進程間通信是完全可靠的。但是在實際的應用中,數據傳輸的通道是不可靠的,所以會產生數據的丟失等問題,為了解決這個問題,就產生了可靠數據傳輸協議,通過協議的方式來實現數據的可靠傳輸。

TCP連接在兩個進程“握手”猴將連接狀態完全保留在兩個端系統中,TCP協議只在端系統中運行,而不再中間網絡元素中運行,所以中間要素並不會維持TCP的連接狀態。

TCP報文結構

  源端口號和目的端口號同UDP
  序號字段:32比特的
  確認號字段:32比特 序號字段和確認號字段用於實現可靠的數據傳輸
  接收窗口:16比特 用於流量控制
  首部長度字段 32比特字為單位的TCP首部長度
  可選與變長的選項字段 發送方與接收方協商最大報文段長度
  標志字段 ACK比特--用於指示確認字段中的值有效的
  RST、SYN和FIN比特用於連接建立和拆除
  PSH比特被設置時,指示接收方應立即將數據交給上層
  URG比特用來指示報文段里存着被發送方的上層實體置為“緊急”的數據

序號和確認號

TCP把數據看成一個無結構的但是有序的字節流。序號建立在傳送的字節流上,而不是建立在傳送的報文段的序列之上。一個報文段的序號因此是該報文段首字節的字節流編號。
例:主機A上的一個進程想通過一條TCP連接向主機B上的一個進程發送一個數據流。A中的TCP將隱式的對數據流中的每一個字節進行編號。假定數據流由一個包含500000字節的文件組成,MSS為1000字節,數據流的首字節編號是0。TCP將該數據流構建500個報文段。第一個報文段的序號被賦為0,第二個報文段的序號被賦為1000,第三個報文段的序號被賦為2000,以此類推。每一個序號被填入到相應TCP報文段首部的序號字段中。
確認號字段。
TCP是全雙工的,因此主機A也許在向主機B發送數據的同時,也接收來自主機B的數據。
從主機B到達的每個報文段中都有一個序號用於從B流向A的數據。主機A填充進報文段的確認號是主機A期望從主機B收到的下一個字節的序號。

客戶機TCP與服務器TCP通信的過程:

建立連接的三次握手:

第一步:客戶機端的TCP首先向服務器端的TCP發送一個特殊的TCP報文段。該報文段中不包含應用層數據,但是報文段的首部中的一個標志位(SYN比特)被置為1。另外,客戶機會選擇一個起始序號(client_isn),並將其放置到該起始的TCP SYN報文段的序號字段中。該報文段會被封裝在一個IP數據報中,並發送給服務器。
第二步:一旦包含TCP SYN報文段的IP數據到達服務器主機(假定到達),服務器會從該數據報中提取出TCP SYN報文段,為該TCP連接分配TCP緩存和變量,並向客戶機TCP發送允許連接的報文段。這個允許連接的報文段也不包含應用層數據。但是報文段的首部卻包含了3個重要的信息。首先,SYN比特被置為1.其次該TCP報文段首部的確認號字段被置為client_isn+1.最后服務器選擇自己的初始序號(server——isn),並將其放置到TCP報文段首部的序號字段中。
第三步:在收到SYN ACK報文段后,客戶機也要給該連接分配緩存和變量。客戶機主機還會向服務器發送另一個報文段,這個報文段對服務器的允許連接的報文段進行了確認(客戶機通過將值server_isn+1放置到TCP報文段首部的確認字段中來完成此項工作)因為連接已經建立,所以該SYN比特被置為0。

數據傳輸:

數據傳輸的過程中SYN都會被置為0

斷開連接的四次揮手:

參與TCP連接的兩方都可以終止連接。
假設客戶機打算關閉連接,客戶機應用進程發出一個關閉連接命令。這會引起客戶機TCP向服務器進程發送一個特殊的TCP報文段。這個特殊的報文段首部中的一個標志比特,即FIN比特被設置為1。當服務器收到該報文段后,就向客戶機會送一個確認報文段。然后服務器發送其終止報文段,其FIN比特被置為1.最后,該客戶機對這個服務器的終止報文進行確認。此時,兩台主機商用與該連接的所有資源都被釋放。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM