傳輸層
負責數據能夠從發送端傳輸接收端.
端口號
- 端口號(Port)標識了一個主機上進行通信的不同的應用程序;
- 在TCP/IP協議中, 用 “源IP”, “源端口號”, “目的IP”, “目的端口號”, “協議號” 這樣一個五元組來標識一個通信(可以通過 netstat -n查看);
- 一個端口只能被一個進程占用,一個進程可以使用多個端口
端口號范圍劃分
- 0 - 1023: 知名端口號, HTTP, FTP, SSH等這些廣為使用的應用層協議, 他們的端口號都是固定的.
- 1024 - 65535: 操作系統動態分配的端口號. 客戶端程序的端口號, 就是由操作系統從這個范圍分配的
查看知名端口
cat /etc/services
兩個問題
- 一個進程是否可以bind多個端口號?
可以
因為一個進程可以打開多個文件描述符,而每個文件描述符都對應一個端口號,所以一個進程可以綁定多個端口號 - 一個端口號是否可以被多個進程bind?
不可以
UDP協議
UDP協議格式
udp協議字段:
16位源端口,16位目的端口:負責端與端之間傳輸
16位校驗和:驗證數據的完整一致性(二進制反碼求和)
16位udp數據報總長度:udp數據報總長度的存儲只有16位,意味著一個包含有頭部信息的udp數據報最大長度=65535字節,意味著如果發送的數據長度大于65535-8大小,則這個數據需要用戶在應用層進行數據分段;因為udp不會在傳輸層自動進行數據分段
注意
- 16位UDP長度, 表示整個數據報(UDP首部+UDP數據)的大長度;
- 如果校驗和(二進制反碼求和)出錯, 就會直接丟棄;
UDP的特點
UDP傳輸的過程類似于寄信.
- 無連接: 知道對端的IP和端口號就直接進行傳輸, 不需要建立連接;
- 不可靠: 沒有確認機制, 沒有重傳機制; 如果因為網絡故障該段無法發到對方, UDP協議層也不會給應用層 返回任何錯誤信息,沒有粘包問題;
- 面向數據報: 不能夠靈活的控制讀寫數據的次數和數量,數據只能整條整條的交付給應用層
- udp不保證數據報的有序到達,需要用戶在應用層進行包序管理
面向數據報
應用層交給UDP多長的報文, UDP原樣發送, 既不會拆分, 也不會合并
例如:
如果發送端調用一次sendto, 發送100個字節, 那么接收端也必須調用對應的一次recvfrom, 接收100個 字節; 而不能循環調用10次recvfrom, 每次接收10個字節;
UDP的緩沖區
- UDP沒有真正意義上的 發送緩沖區. 調用sendto會直接交給內核, 由內核將數據傳給網絡層協議進行后 續的傳輸動作
- UDP具有接收緩沖區. 但是這個接收緩沖區不能保證收到的UDP報的順序和發送UDP報的順序一致; 如果 緩沖區滿了, 再到達的UDP數據就會被丟棄
UDP的socket既能讀, 也能寫, 這個概念叫做 全雙工
UDP使用注意事項
- , UDP協議首部中有一個16位的大長度. 也就是說一個UDP能傳輸的數據大長度是64K(包含UDP首 部).
- 64K在當今的互聯網環境下, 是一個非常小的數字. 如果我們需要傳輸的數據超過64K, 就需要在應用層手動的分包, 多次發送, 并在接收端手動拼裝;
基于UDP的應用層協議
- NFS: 網絡文件系統
- TFTP: 簡單文件傳輸協議
- DHCP: 動態主機配置協議
- BOOTP: 啟動協議(用于無盤設備啟動)
- DNS: 域名解析協議
- 。。。。。。