linux原始套接字(1)-arp请求与接收】的更多相关文章

一.概述                                                   以太网的arp数据包结构: arp结构op操作参数:1为请求,2为应答. 常用的数据结构如下: .物理地址结构位于netpacket/packet.h struct sockaddr_ll { unsigned short int sll_family; unsigned short int sll_protocol; int sll_ifindex; unsigned short in…
一.概述                                                    上一篇arp请求使用的是链路层的原始套接字.icmp封装在ip数据报里面,所以icmp请求可以直接使用网络层的原始套接字,即socket()第一个参数是PF_INET.如下: sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); icmp报文不同的类型有不同的格式,我们以icmp回显请求和会显应答报文格式(即ping程序使用的报文类型)为例…
http://blog.chinaunix.net/uid-27074062-id-3388166.html 本文从IPV4协议栈原始套接字的分类入手,详细介绍了链路层和网络层原始套接字的特点及其内核实现细节.并结合原始套接字的实际应用,说明各类型原始套接字的适应范围,以及在实际使用时需要注意的问题. 一.原始套接字概述 协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类.本节主要描述各自的特点及其适用范围. 链路层原始套接字可以直接用于接收和发送链路层的MAC帧…
1.原始套接字使用场景 我们平常所用到的网络编程都是在应用层收发数据,每个程序只能收到发给自己的数据,即每个程序只能收到来自该程序绑定的端口的数据.收到的数据往往只包括应用层数据,原有的头部信息在传递过程中被隐藏了.某些情况下我们需要执行更底层的操作,比如监听所有本机收发的数据.修改报头等,而像SOCK_STREAM.SOCK_DGRAMZ则通常用于应用层,并不能满足该需求. 通过原始套接字,我们可以抓取所有发送到本机的IP包(包括IP头和TCP/UDP/ICMP包头),也可以抓取所有本机收到的…
关于linux 网络编程最权威的书是<<unix网络编程>>,但是看这本书时有些内容你可能理解的不是很深刻,或者说只知其然而不知其所以然,那么如果你想搞懂的话那么我建议你可以看看网络协议栈的实现. 函数原型是 int socket(int domain, int type, int protocol); 其中domain 中AF_INET , AF_UNIT 较为常用,分别创建inet 域套接字和unix域套接字,unix套接字与文件相关.平时80%用的套接字都是AF_INET.这…
一.概述                                                    同上一篇tcp一样,udp也是封装在ip报文里面.创建UDP的原始套接字如下: (sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_UDP); 同样,如果要构造udp的ip首部,要开启IP_HDRINCL选项! udp首部格式: udp的不可靠性,比tcp报文简单很多.上面的16位UDP长度是UDP首部+普通数据的总长度,这点跟ip首部的16位总长度…
一.概述                                                    tcp报文封装在ip报文中,创建tcp的原始套接字如下: sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP); 此时只能构造tcp报文,如果想进一步构造ip首部,那么就要开启sockfd的IP_HDRINCL选项: ; setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); i…
如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑定到本地一个接口上,然后该套接字就只接收从该接口收上来的对应的数据包.今天我们用原始套接字来手工实现链路层ARP报文的发送和接收,以便大家对原始套接字有更深刻的掌握和理解. ARP全称为地址解析协议,是链路层广泛使用的一种寻址协议,完成32比特IP地址到48比特MAC地址的映射转换.在以太网中,当一台主机需要…
原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有的数据帧(数据包).另外,必须在管理员权限下才能使用原始套接字.   原始套接字的创建: int socket ( int family, int type, int protocol ); 参数: family:协议族 这里写 PF_PACKET type:  套接字类,这里写 SOCK_RAW…
arp请求示例 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/if_et…