絡(luò)通信|UDP協(xié)議)
本篇梳理網(wǎng)絡(luò)模型、IP、端口、數(shù)據(jù)包封裝再到 UDP 協(xié)議原理與 socket 代碼接口適合博客閱讀。一、網(wǎng)絡(luò)基礎(chǔ)模型1. OSI 七層模型理論模型層級功能說明應(yīng)用層上層業(yè)務(wù)數(shù)據(jù)文件傳輸、郵件等表示層數(shù)據(jù)加密解密、壓縮解壓縮會話層建立維護會話通道傳輸層數(shù)據(jù)傳輸控制TCP/UDP端口網(wǎng)絡(luò)層路由選路IP 協(xié)議路由器數(shù)據(jù)鏈路層封裝幀局域網(wǎng)通信ARP交換機物理層比特流傳輸網(wǎng)線、光纖硬件2. TCP/IP 四層工業(yè)實際使用應(yīng)用層合并 OSI 應(yīng)用層、表示層、會話層 常見協(xié)議HTTP、HTTPS、FTP、TFTP、DNS、MQTT傳輸層TCP、UDP網(wǎng)絡(luò)層IP 協(xié)議網(wǎng)絡(luò)接口層合并數(shù)據(jù)鏈路層 物理層3. 五層網(wǎng)絡(luò)模型教學(xué)常用應(yīng)用層 → 傳輸層 → 網(wǎng)絡(luò)層 → 數(shù)據(jù)鏈路層 → 物理層二、IP 地址IPv4 是32 位使用點分十進制表示分為網(wǎng)絡(luò)位 主機位。子網(wǎng)掩碼區(qū)分網(wǎng)絡(luò)位和主機位掩碼 1 對應(yīng)網(wǎng)絡(luò)位0 對應(yīng)主機位。網(wǎng)段號網(wǎng)絡(luò)位不變主機位全部置 0廣播號網(wǎng)絡(luò)位不變主機位全部置 1發(fā)給廣播號局域網(wǎng)所有主機接收網(wǎng)關(guān)跨網(wǎng)段訪問的出口設(shè)備IP 地址分類類別地址范圍默認子網(wǎng)掩碼私有 IP 段A 類1.0.0.0~126.255.255.255255.0.0.010.0.0.0/8B 類128.0.0.0~191.255.255.255255.255.0.0172.16?172.31C 類192.0.0.0~223.255.255.255255.255.255.0192.168.x.xD 類224~239組播使用?E 類240~255實驗保留?私有 IP局域網(wǎng)內(nèi)部使用不能直接訪問互聯(lián)網(wǎng)公有 IP 由運營商分配可訪問外網(wǎng)。 127.x.x.x 回環(huán)地址本機內(nèi)部通信。三、端口號端口16 位無符號短整型0?65535。作用IP 定位主機IP 端口定位主機上的進程。1?1023知名端口系統(tǒng)服務(wù)占用80HTTP443HTTPS21FTP1883MQTT69TFTP1024?49151注冊端口49152?65535動態(tài) / 私有端口程序臨時使用四、數(shù)據(jù)包封裝和解封裝發(fā)送數(shù)據(jù)時從上到下逐層封裝頭部接收從下到上逐層剝離頭部應(yīng)用層原始業(yè)務(wù)數(shù)據(jù)傳輸層加上 TCP/UDP 頭部 →報文網(wǎng)絡(luò)層加上 IP 頭部 →數(shù)據(jù)包數(shù)據(jù)鏈路層加上 MAC 頭部、尾部校驗 →幀物理層轉(zhuǎn)為比特流 0/1通過網(wǎng)線傳輸五、網(wǎng)絡(luò)字節(jié)序計算機主機一般是小端序網(wǎng)絡(luò)傳輸強制使用大端序。大端低字節(jié)存高地址小端低字節(jié)存低地址。字節(jié)序轉(zhuǎn)換 APIhtons()short 主機序 → 網(wǎng)絡(luò)序2 字節(jié)端口htonl()long 主機序 → 網(wǎng)絡(luò)序4 字節(jié)IPntohs()short 網(wǎng)絡(luò)序 → 主機序ntohl()long 網(wǎng)絡(luò)序 → 主機序IP 字符串轉(zhuǎn)換inet_addr()點分字符串 IP → 32 位網(wǎng)絡(luò)序整數(shù) ipinet_ntoa()網(wǎng)絡(luò) ip 結(jié)構(gòu)體 → 點分字符串 IP六、網(wǎng)絡(luò)配置常用命令ifconfig查看網(wǎng)卡信息LinuxipconfigWindows 查看網(wǎng)卡ping ip/域名測試網(wǎng)絡(luò)連通性虛擬機橋接模式虛擬機網(wǎng)卡和物理網(wǎng)卡同一網(wǎng)段可以局域網(wǎng)其他設(shè)備訪問虛擬機。七、UDP 協(xié)議UDP (User Datagram Protocol) 用戶數(shù)據(jù)報協(xié)議。UDP 核心特點無連接通信前不需要建立連接面向數(shù)據(jù)報一次發(fā)送一整個數(shù)據(jù)包不會拆分拼接不可靠盡最大努力交付會丟包、亂序沒有重傳確認機制開銷小實時性高適合直播、游戲音視頻場景。UDP 通信模型 C/S客戶端 / 服務(wù)端C/S客戶端服務(wù)端模型B/S 瀏覽器服務(wù)端模型。表格UDP 客戶端UDP 服務(wù)端socket () 創(chuàng)建套接字socket () 創(chuàng)建套接字sendto () 發(fā)送報文bind () 綁定本機 IP 端口recvfrom () 接收報文recvfrom () 接收報文close () 關(guān)閉套接字sendto () 回復(fù)報文close () 關(guān)閉套接字核心 API 說明1.socket 創(chuàng)建套接字int socket(int domain, int type, int protocol);domainAF_INETIPv4typeSOCK_DGRAMUDP 數(shù)據(jù)報套接字protocol填 0 返回成功返回套接字文件描述符失敗返回?12.bind 綁定 IP 端口服務(wù)端專用int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);服務(wù)端必須 bind 固定端口客戶端可以不 bind操作系統(tǒng)自動分配隨機端口。3.sendto 發(fā)送 UDP 數(shù)據(jù)報ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);dest_addr對端的 IP 端口信息結(jié)構(gòu)體flags 一般填 0。4.recvfrom 接收 UDP 數(shù)據(jù)報ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);src_addr 會保存發(fā)送方的 IP 和端口回復(fù)數(shù)據(jù)直接使用這個地址。5.sockaddr_in 地址結(jié)構(gòu)體IPv4struct sockaddr_in { sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* 網(wǎng)絡(luò)字節(jié)序端口 */ struct in_addr sin_addr; /* 網(wǎng)絡(luò)序IP */ }; struct in_addr { uint32_t s_addr; };UDP 報文頭部8 字節(jié)固定源端口 (2B)目標(biāo)端口 (2B)UDP 總長度 (2B)校驗和 (2B)抓包工具 WiresharkLinux 安裝sudo apt install wireshark過濾 udpudp.port 50000過濾指定端口數(shù)據(jù)包。