上海推廣網(wǎng)站長沙網(wǎng)絡(luò)推廣公司
個人主頁:C++忠實粉絲
歡迎 點贊👍 收藏? 留言? 加關(guān)注💓本文由 C++忠實粉絲 原創(chuàng)計算機網(wǎng)絡(luò)之傳輸層協(xié)議UDP
收錄于專欄【計算機網(wǎng)絡(luò)】
本專欄旨在分享學(xué)習(xí)計算機網(wǎng)絡(luò)的一點學(xué)習(xí)筆記,歡迎大家在評論區(qū)交流討論💌???
目錄
端口號?
端口號范圍劃分
認識知名端口號?
進程與端口號綁定的問題
1. 一個進程可以綁定多個端口號嗎???
2. 一個端口號可以被多個進程綁定嗎??
UDP 協(xié)議
UDP 協(xié)議端格式?
UDP 特點?
面向數(shù)據(jù)報?
UDP 的緩沖區(qū)?
UDP 使用注意事項
基于 UDP 的應(yīng)用層協(xié)議
傳輸層 : 負責(zé)數(shù)據(jù)能夠從發(fā)送端傳輸接收端?
端口號?
端口號 (Port) 標(biāo)識一個主機上進行通信的不同的應(yīng)用程序 :?
在 TCP/IP 協(xié)議中, 用 "源 IP", "源端口號", "目的 IP", "目的端口號", "協(xié)議號" 這樣一個五元組來標(biāo)識一個通信 (可以通過 netstat -n 查看)?
?
?通過源 IP 地址, 目標(biāo) IP 地址, 協(xié)議號, 源端口號, 和目標(biāo)端口號這5個數(shù)字識別一個通信.
端口號范圍劃分
0 - 1023 : 知名端口號, HTTP, FTP, SSH 等這些廣為使用的應(yīng)用層協(xié)議, 他們的端口號都是固定的
1024 - 65535 : 操作系統(tǒng)動態(tài)分配的端口號, 客戶端程序的端口號, 就是由操作系統(tǒng)從這個范圍分配?
認識知名端口號?
有些服務(wù)器是非常常用的, 為了使用方便, 人們約定一些常用的服務(wù)器, 都是用以下這些固定的端口號 :
ssh 服務(wù)器 : 使用 22 端口
ftp 服務(wù)器 : 使用 21 端口
telnet 服務(wù)器 : 使用 23 端口
http 服務(wù)器 : 使用 80 端口
https 服務(wù)器 : 使用 443?
執(zhí)行下面命令, 可以看到知名端口號 :?
cat /etc/services
所以我們自己寫一個程序使用端口號時, 要避開這些知名端口號.?
進程與端口號綁定的問題
1. 一個進程可以綁定多個端口號嗎???
一個進程可以綁定多個端口號, 通常情況下, 進程綁定一個端口號用于通信, 但也可以通過不同的方式讓一個進程綁定多個端口, 處理不同的服務(wù)或協(xié)議, 實現(xiàn)的方式有以下幾種 :?
1. 多個監(jiān)聽套接字 : 進程可以創(chuàng)建多個套接字, 每個套接字綁定到不同的端口號, 例如, 一個 Web 服務(wù)器可以綁定 80 端口用于 HTTP 協(xié)議, 綁定 443 端口用于 HTTPS 協(xié)議, 或者不同的服務(wù)通過不同端口監(jiān)聽來自客戶端的連接
2. 多路復(fù)用 (select, poll, epoll) : 一個進程可以使用 I/O?多路復(fù)用技術(shù), 在一個線程中監(jiān)聽多個端口上的事件, 例如, 使用 select(), poll(), epoll() 等機制, 一個進程可以監(jiān)聽多個套接字 (綁定到不同的端口), 然后根據(jù)事件處理不同端口的連接.
3. 協(xié)議棧和端口的綁定 : 不同協(xié)議 (如 TCP, UDP) 可以通過不同的端口來處理數(shù)據(jù)通信, 同一進程可以分別綁定 TCP 和 UDP 協(xié)議的不同端口
2. 一個端口號可以被多個進程綁定嗎??
一個端口號通常不能被多個進程同時綁定, 除非特定的條件被滿足, 操作系統(tǒng)為了避免端口沖突, 通常不允許多個進程同時綁定到同一個端口~~
默認情況下, 端口只能被一個進程綁定.
使用 SO_REUSEADDR 和 SO_REUSEPORT 選項可以在某些情況下允許多個進程綁定同一個端口, 特別是 UDP 協(xié)議或者特定操作系統(tǒng)支持的情況下.
UDP 協(xié)議
UDP 協(xié)議端格式?
16 位 UDP 長度, 表示整個數(shù)據(jù)報 (UDP 首部 + UDP 數(shù)據(jù)) 的最大長度
如果校驗和出錯, 就會直接丟棄~~
UDP 特點?
UDP 傳輸?shù)倪^程類似于寄信 :?
1. 無連接 : 知道對端的 IP 和端口號就直接進行傳輸, 不需要建立連接;
2. 不可靠 : 沒有確認機制, 沒有重傳機制, 如果因為網(wǎng)絡(luò)故障該段無法發(fā)到對方, UDP 協(xié)議層也不會給應(yīng)用層返回任何錯誤信息.
3. 面向數(shù)據(jù)報 : 不能夠靈活的控制讀寫數(shù)據(jù)的次數(shù)和數(shù)量.?
面向數(shù)據(jù)報?
應(yīng)用層交給 UDP 多長的報文, UDP 原樣發(fā)送, 既不會拆分, 也不會合并;
用 UDP 傳輸 100 個字節(jié)的數(shù)據(jù) :?
如果發(fā)送端調(diào)用一次 sendto, 發(fā)送 100 個字節(jié), 那么接收端也必須調(diào)用對應(yīng)的一次 recvfrom, 接收 100 個字節(jié), 而不能循環(huán)用 10 次 recvfrom, 每次接收 10 個字節(jié).?
UDP 的緩沖區(qū)?
1. UDP 沒有真正意義上的 發(fā)送緩沖區(qū), 調(diào)用 sendto 會直接交給內(nèi)核, 有內(nèi)核將數(shù)據(jù)報傳給網(wǎng)絡(luò)層協(xié)議進行后序的傳輸動作
2. UDP 具有接收緩沖區(qū), 但是這個接收緩沖區(qū)不能保證收到的 UDP 報的順序和發(fā)送 UDP 報的順序一致, 如果緩沖區(qū)滿了, 再到達的 UDP 數(shù)據(jù)就會被丟棄~?
UDP 的 socket 既能讀, 也能寫, 這個概念叫做 "全雙工"?
UDP 使用注意事項
我們注意到, UDP 協(xié)議首部中一個 16 位的最大長度, 也就是說一個 UDP 能傳輸?shù)臄?shù)據(jù)最大長度是 64K (包含 UDP 首部)
然而, 64K 在當(dāng)今的互聯(lián)網(wǎng)環(huán)境下, 是一個非常小的數(shù)字
如果我們需要傳輸?shù)臄?shù)據(jù)超過 64K , 就需要在應(yīng)用層手動分包, 多次發(fā)送, 并在接收端手動拼裝.
基于 UDP 的應(yīng)用層協(xié)議
NFS : 網(wǎng)絡(luò)文件系統(tǒng)
TFTP : 簡單文件傳輸協(xié)議
DHCP : 動態(tài)主機配置協(xié)議
BOOTP : 啟動協(xié)議 (用于無盤設(shè)備啟動)
DNS : 域名解析協(xié)議