前言
上幾文章我們講解了應用層協議Http和Https,要知道應用層協議有很多,這些都是程序員自己定制的,而真正要傳輸的時候,是要在操作系統的傳輸層進行的,今天我們就來學習一下傳輸層協議Udp的
標識一個通信
要進行跨網絡通信,就要標識一個網絡通信的唯一性
通常需要:源IP、目的IP、協議號、源端口號、目的端口號這五個信息來標識一個網絡通信。
端口劃分
-
0-1023
屬于知名端口號,Http、FTP、SSH等廣為使用的應用層協議,端口號是固定的。- SSH,使用22端口
- FTP,使用21端口
- telnet,使用23端口
- Http,使用80端口
- Https,使用443端口
可以使用以下命令查看知名端口號:
cat /etc/services
- 1024-65535
操作系統動態分配對策端口號,客戶端程序的端口號就是從這里面隨機分配的。
我們設計端口的時候,要避開這些知名端口。
netstat
是一個查看網絡狀態的工具
選項:
- n,拒絕顯示別名,能夠數字化就全數字化
- l ,只列出在監聽狀態(listen)的服務狀態
- p,顯示建立相關鏈接的程序名
- t ,只顯示tcp相關
- u,只顯示udp相關
- a,顯示所有選項,默認不顯示listen相關
pidof
通過進程名查看進程id
Udp協議端格式
可以看到,Udp報頭長度總共八個字節,其中,十六位Udp長度表示數據報的報頭+報文總共的大小,十六位校驗和出錯會直接將數據報丟棄。
而且由于十六位Udp長度的限制,TCP能傳輸的大小是有限的。一個Udp能傳輸的數據最大長度是64k,超過就需要在應用層手動分包多次傳送,并在接收端手動拼裝。
Udp特點
- 無連接,不需要建立連接,知道ip和端口號就能傳輸
- 不可靠,沒有確認傳傳機制,udp不反回任何錯誤信息
- 面向數據報,不能靈活控制讀寫數據的次數和數量
- 簡單。
面向數據報
應用層交給Udp多長的報文,Udp就要直接發送,不能拆分和并,例如:
發送端調用sendto,發送100字節,那么接收端必須調用一次recvfrom100字節,不能循環調用recvfrom,每次10字節
Udp緩沖區
Udp沒有真正的發送緩沖區,調用sendto會直接將要發送的數據交給內核,由內核將數據傳輸給網絡并進行后續動作
Udp具有接收緩沖區,但是這個緩沖區不保證Udp數據報的順序,如果緩沖區滿了,照樣會被丟棄
也因此,Udp socket 既可以寫也可以讀,是全雙工的。
基于Udp的協議
- NFS,網絡文件系統
- TFTP,簡單文件傳輸協議
- DHCP,動態主機配置協議
- BOOTP,啟動協議
- DNS,域名解析協議