原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心。然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。总体来说,SOC...
原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心。然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。总体来说,SOC...
原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心。然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。总体来说,SOC...
创建一个原始套接字s,开启IP_HDRINCL 选项(这两步可以直接用 int s = socket (AF_INET, SOCK_RAW, IPPROTO_RAW); ),自己封装IP 头部和tcp 头部,主要是标志位syn 置为1,然后循环端口进行发送数据包。另开一个线程创建另一个原始套接字,仿照packet sniffer 进行数据包的接收,分解tcp 头部看是否syn == 1 ...
SOCK_DGRAM: 数据报套接口,无连接,使用UDP协议 传送的数据格式是预先定义好的 通过原始套接字,可以了解底层协议的实现细节,自己构造协议首部和数据,发送并接受 WinSock提供了另一种类型的套接口SOCK_RAW,也被称为“原始套接口”。 当用选项IP_HDRINCL调用setsockopt时,用户可以自己构造IPv4首部。
接收到的UDP或者TCP分组绝不传递到任何原始套接字,如果一个进程想要读取含有UDP分组或TCP分组的IP数据报,它就必须在数据链路层读取这些分组。 大多数ICMP分组在内核处理完其中的ICMP消息后传递到原始套接字。 所有IGMP分组在内核完成处理其中的IGMP消息后传递到原始套接字。
1.创建原始套接字 int sock_raw_fd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); if(sock_raw_fd < 0) { perror("socket"); exit(-1); } 2.定义接收缓冲区 unsigned char buf[1024]=""; 3.储存源目的MAC地址缓冲区 unsigned char src_mac[18]=""; ...
接收到的UDP或者TCP分组绝不传递到任何原始套接字,如果一个进程想要读取含有UDP分组或TCP分组的IP数据报,它就必须在数据链路层读取这些分组。 大多数ICMP分组在内核处理完其中的ICMP消息后传递到原始套接字。 所有IGMP分组在内核完成处理其中的IGMP消息后传递到原始套接字。
另外还了解到原始套接字在socket的创建上有不同的组合,例如: AF_INET+SOCK_RAW最多只能允许用户层与IP层直接通信,而AF_PACKET+SOCK_RAW就可以允许用户层与数据链路层直接通信了(这一点也是Linux_Unix系统编程手册说得不准确的地方) 另外,关于AF_PACKET+SOCK_RAW可以参考man packet: ...