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