【網絡】Udp & Tcp

文章參考:圖解TCP/IP第五版

1. 端口

1.1 端口號的作用

  • 端口號可以用來標識同一個主機上通信的不同應用程序,端口號+IP地址就可以組成一個套接字,用來標識一個進程。
  • 在TCP/IP協議中,用“源IP地址”,“目的IP地址”,“源端口號”,“目的端口號”,“協議號”的一個五元組來標識一個通信。

1.2 端口範圍劃分

  • 0~1023:知名端口號,是留着備用的,一把都是用於協議,例如HTTP、FTP、SSH;
  • 1024~65535:是操作系統動態分配的端口號,客戶端程序的端口號,就是由操作糸統從這個範圍來分配的,在TCP與UDP的套接字通信中,客戶端的端口號就是在此範圍中。

1.3 知名的端口號與端口號對應的服務器

  • HTTP服務器:80;
  • HTTPS:443;
  • FTP服務器:21;
  • TELNET服務器:23;
  • SSH服務器:22;
  • WEB服務器:25。

1.4 問題

(1)一個進程是否可以bind多個端口號? 可以

(2)一個端口號是否可以被多個進程綁定? 不可以

2. UDP協議

2.1 協議格式
  • 16源端口/16目的端口/16數據報長度/16校驗和;
  • 16位源端口/目的端口:負責端與端之間的數據傳輸;
  • 16位udp數據報長度:包含頭部在內,udp數據報長度 ;
  • 16位udp數據校驗和:校驗數據一致性----二進制反碼求和算法;
    在這裏插入圖片描述
2.2 特性

2.2.1 無連接、不可靠

  • 客戶端只需要知道服務端的地址信息就可以直接發送數據,並且不關心數據是否已經到達;
  • 知道對端的IP和端口號就直接進行傳輸,不需要建立連接。

2.2.2 面向數據報

  • udp整個數據報長度不能大於64k,若大於的話,兩個字節就不夠存;
  • 因爲udp數據包長度的限制,若數據過大時,則需要用戶在應用層進行數據分包,將大數據報分割成一個個小的數據報64k;
  • udp不能保證數據可靠、有序到達,因此需要用戶在應用層進行包序管理;
  • udp在sendto發送數據時將數據放到發送緩衝區,則會直接封裝頭部,將數據發送出去。
2.3 應用場景

在這裏插入圖片描述

3. TCP協議

3.1 協議格式

在這裏插入圖片描述

  • 源/目的端口:負責端與端數據傳輸
  • 序號/確定序號:進行包序管理
  • 長度:頭部長度,以4字節爲單位,表示tcp頭部最小爲20字節,最大爲60字節
  • 標誌位:URG/ACK/PSH/RST/SYN/FIN
  • 窗口大小:用於避免丟包的一種方式
  • 校驗和:校驗數據一致性----二進制反碼求和
  • 緊急指針:帶外數據
  • 選項數據:通常用於通信雙方協商一些數據的時候使用
3.2 特性

3.2.1 面向連接

  • tcp是一個有狀態的協議,三次握手建立連接,四次揮手斷開連接;
  • 通信雙方之間要先建立連接。
    在這裏插入圖片描述
  • ACK: 確認號是否有效;
    • 當發送端的數據到達接收主機時,接收端主機會返回一個已收到消息的通知,這個消息叫做確認應答(ACK)。
  • SYN:請求建立連接,把攜帶SYN標識的稱爲同步報文段;
  • FIN:通知對方, 本端要關閉了, 把攜帶FIN標識的爲結束報文段;

【問題:爲甚什麼建立需要三次?斷開需要四次?】

(1)握手過程爲什麼是三次?

tcp是全雙工通信,必須確保雙方都有數據收發的能力,兩次不安全,四次沒必要;
客戶端發送SYN請求之後,若萬一退出服務端卻不進行再一次確認,就會丟包;
第一次SYN因爲網絡延遲與後發的第二個SYN同時到來,會造成服務端創建多餘的socket。

(2)揮手過程爲什麼是四次?

套接字的關閉有好多操作,可以分別關閉套接字的讀和寫;
當關閉套接字寫操作,會觸發向對端發送FIN包,接收方收到FIN之後,認爲對方不再繼續發送數據,因此recv會返回,等待用戶關閉套接字,關閉套接字則會給對方發送FIN;
在發送端若只關閉了寫端,並沒有關閉套接字讀端,意味着對方有可能還正在發送數據,自己有可能還需要接收,因此ACK和FIN不能一起發送,否則自己在有些數據還沒有接收成功的情況下收到了FIN,則會造成有數據還沒有處理完,或者對端有數據沒有發送完畢,因此握手三次,揮手必須得四次。

3.2.2 可靠傳輸

  • 確認應答機制----發送的每一條數據要求對方進行確認回覆
  • 超時重傳機制----等待確認回覆超時,則重發數據
    在這裏插入圖片描述
  • 協議字段中的序號/確認序號
    在這裏插入圖片描述
  • 協議字段中的校驗和 – 若數據不一致,則丟棄數據要求重傳
  • 面向連接 – 可靠傳輸的前提

避免丟包

【滑動窗口機制】

  • 通過一個窗口後沿和一個窗口前沿以及一個當前的發送序號,通過這幾個序號就可以維護一個窗口;
  • 發送窗口:前沿減去後沿不大於窗口大小 --> 前沿 - 後沿 <= 窗口大小;
  • 接收窗口:窗口大小不大於緩衝區中空閒空間大小 --> 窗口大小 <= 緩衝區中空閒空間大小
    在這裏插入圖片描述
    優點:
    1. 發送方可以連續發送多條數據,等待對方回覆,提高一定的傳輸性能;
    2. 連續發送數據,連續接收確認回覆,可以避免因爲確認回覆的丟失而導致數據重傳;

【快速重傳機制】

  • 當接收方接收到第二條數據,而還未接收到第一條數據,則這時認爲數據有可能丟失,因此連續發送三次對應數據的重傳請求;
  • 當發送方連續接收到三條重傳請求,纔會將相應數據進行重傳,避免數據因爲網絡原因而延遲到達的重傳。
    在這裏插入圖片描述

3.2.3 面向字節流

  • 有序、可靠、雙向的、基於連接的字節流傳輸;
  • tcp通信雙方在進行三次握手的時候,會協商一個信息 – MSS;
  • tcp在發送數據,會將數據先放入發送緩衝區,操作系統從緩衝區中取出合適大小(MSS:最大數據段大小,不包括頭部)的數據封裝報頭進行數據傳輸;數據到達對端之後tcp分用之後,將數據放入接收緩衝區中,用戶recv從緩衝區取出想要的大小的數據。
    • 優點:數據傳輸比較靈活,但是會有一種情況:在緩衝區tcp有可能會將多條數據當作一條處理 – tcp粘包。
    • tcp的粘包本質:tcp在傳輸層對數據邊界並不敏感,多條數據合成一條數據進行處理;粘包有可能在發送方產生也有可能在接收方產生。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章