《UNIX 网络编程-卷1》原始套接字
原始套接字(Raw Sockets)
原始套接字允许应用程序直接读写内核未处理的网络层协议数据包,常用于网络诊断和协议开发。引用[2]对其核心特性进行了系统总结。
1. 核心特性
- 权限要求:
- 创建原始套接字需超级用户权限(
root或SUID程序)
- 创建原始套接字需超级用户权限(
- 套接字类型:
intsockfd=socket(AF_INET,SOCK_RAW,IPPROTO_XXX);// IPPROTO_ICMP、IPPROTO_UDP 等 - 数据包构造:
- 默认接收包含 IP 首部的完整数据包
- 设置
IP_HDRINCL选项可手动构造 IP 首部:inton=1;setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
2. 关键编程细节
- IP 首部构造:
- 需手动填充
ip_v(版本)、ip_hl(首部长度)、ip_tos(服务类型)等字段 - 校验和计算要求:
structip*ip_header=(structip*)packet_buf;ip_header->ip_sum=0;ip_header->ip_sum=in_cksum((u_short*)ip_header,sizeof(structip));
- 需手动填充
3. 典型应用场景
| 类型 | 工具示例 | 实现原理简述 |
|---|---|---|
| 网络诊断 | ping | 构造 ICMP Echo 请求/响应 |
| 路径追踪 | traceroute | 发送 TTL 递增的 UDP/ICMP 包并解析超时 |
| 协议验证 | 自定义协议实现 | 构造非标准协议头部用于测试 |
4. 安全与权限约束
- 原始套接字可能被滥用(如伪造源地址攻击),需严格控制权限
- 现代系统通常限制原始 ICMP/UDP 包的构造
