ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux网络编程‑UDP学习笔记

Linux网络编程‑UDP学习笔记 一、网络协议模型1. OSI 七层模型应用层要传输的业务数据表示层数据加密、编码转换会话层建立/维护会话链接传输层选择传输方式代表协议TCP、UDP网络层路由选择数据走哪条路径IP 协议数据链路层局域网内部传输MAC 地址物理层网线、网卡等物理硬件介质2. TCP/IP 四层模型实际 Linux 使用应用层业务数据HTTP、HTTPS、FTP、DNS、TFTP传输层选择传输协议 TCP / UDP网络层IP实现跨主机寻址路由网络接口层网卡硬件、驱动处理帧传输层两大协议对比UDP 用户数据报协议无连接通信前不需要握手不可靠内核不做重传确认头部只有 8 字节开销小速度快使用函数socket() sendto() recvfrom()TCP 传输控制协议面向连接三次握手建立连接四次挥手断开可靠传输应答确认、丢包重传、去重拥有滑动窗口、拥塞控制、掉线检测资源开销大二、IPv4 地址基础IP 地址构成IP 网络位 主机位网络位局域网编号同一个局域网所有主机网络位相同主机位局域网内部区分不同主机示例192.168.0.175网络号192.168.0.0广播地址网络位不变主机位全部置 1 →192.168.0.255向局域网所有主机发消息局域网内部通信依靠MAC 地址跨网段通信依靠 IP 地址。子网掩码子网掩码用来区分网络位和主机位二进制1→ 对应 IP 的网络位二进制0→ 对应 IP 的主机位例255.255.255.0简写192.168.0.175/24IP 地址分类分类范围用途私有网段A 类1.0.0.0‑126.255.255.255超大型网络10.0.0.0‑10.255.255.255B 类128.0.0.0‑191.255.255.255大中型网络172.16.0.0‑172.31.255.255C 类192.0.0.0‑223.255.255.255中小型局域网192.168.0.0‑192.168.255.255D 类224‑239组播广播‑E 类240‑255实验保留‑公有 IP公网可直接访问私有 IP仅局域网内部使用不能直接上互联网。三、VMware 两种网络模式NAT 模式Windows 主机上网虚拟机就可以上网Ubuntu 的 IP 是虚拟机虚拟出来的 IP外部机器无法主动访问虚拟机虚拟机可以访问外面适合开发上网不适合做服务器测试桥接模式虚拟机和物理主机处于同一个局域网分配同网段真实局域网 IP外部主机、同局域网其他设备可以访问 Ubuntu 虚拟机做网络编程UDP/TCP 套接字实验必须使用桥接模式网络编程踩坑NAT 模式下外部无法访问虚拟机的端口写 UDP 测试代码会收不到报文。Ubuntu 配置 IP 常用命令# 查看网卡信息ifconfigifconfig-a# 临时设置 IP重启失效sudoifconfigens33192.168.0.125/24 up# 配置文件修改 DHCP 自动获取 IPsudovim/etc/network/interfaces测试网络连通pingwww.baidu.com四、UDP 套接字核心 APIUDP 特点无连接通信收发都需要带上对方 IP 端口发送端socket→sendto→close接收端socket→bind→recvfrom→close1. socket 创建套接字intsocket(intdomain,inttype,intprotocol);domain协议族IPv4 填AF_INETtypeSOCK_STREAM→ TCPSOCK_DGRAM→ UDP 数据报protocol填 0 自动匹配协议返回值成功返回文件描述符失败返回‑12. sockaddr_in IPv4 地址结构体structsockaddr_in{sa_family_tsin_family;// 协议族 AF_INETin_port_tsin_port;// 端口号网络字节序structin_addrsin_addr;// IP 地址网络字节序};structin_addr{uint32_ts_addr;};注意网络通信统一使用大端字节序主机小端必须转换。3. htons 主机字节序转网络字节序uint16_thtons(uint16_thostshort);把本地 short 端口号转为网络大端。端口必须 htons千万不要忘记。4. inet_addr 字符串 IP 转网络字节序in_addr_tinet_addr(constchar*cp);把192.168.0.175字符串转为二进制网络大端 IP。5. inet_ntoa 网络 IP 转回字符串char*inet_ntoa(structin_addrin);二进制网络 IP → 打印可读的点分十进制字符串。6. sendto UDP 发送数据ssize_tsendto(intsockfd,constvoid*buf,size_tlen,intflags,conststructsockaddr*dest_addr,socklen_taddrlen);sockfdsocket 返回套接字buf发送缓冲区len发送字节长度flags一般填 0dest_addr目标对方地址强转为struct sockaddr *addrlen地址结构体大小返回值成功返回发送字节数失败返回 ‑1。UDPsendto 成功只代表交给内核不代表对方收到。7. bind 绑定 IP 端口接收端必须intbind(intsockfd,conststructsockaddr*addr,socklen_taddrlen);将套接字绑定本机 IP 端口UDP 接收端必须 bind别人才能向你的端口发数据。限制只能绑定本机自己的 IP端口被占用会绑定失败。8. recvfrom UDP 接收数据ssize_trecvfrom(intsockfd,void*buf,size_tlen,intflags,structsockaddr*src_addr,socklen_t*addrlen);接收 UDP 数据包同时拿到发送方的 IP 和端口src_addr输出参数保存发送者地址addrlen传入地址结构体长度的指针返回值成功返回收到字节数0 代表对端关闭‑1 出错。五、UDP 开发踩坑总结字节序端口一定要htons()转换忘记则端口错乱收不到包。模式网络实验虚拟机优先桥接模式NAT 模式外部无法访问虚拟机端口。发送端 UDP不需要 bind接收端必须 bind 绑定端口。sendto每次发送必须填写目标地址recvfrom会自动拿到发送方地址。UDP 不可靠丢包不会返回错误sendto 成功不等于对方收到。IP 填写要写对方真实局域网 IP注意防火墙。
返回列表