1,先看看各层的数据格式以及它们之间的相互包含关系 参考:http://www.360doc.com/content/07/0805/16/36481_654962.shtml 注意:这都是链路层的数据,因为可以看见MAC地址。 先看看类型(2Byte) 类型为0800的,是ip数据包 类型为0806的,是arp数据包 也即ip包和arp包是平等关系,不是包含关系。 这里看看socket函数, sockfd=socket(int family,int type,int proto); 这个family参数可以是:AF_INET,AF_IENT6,AF_PACKET 第一个和第一个都是捕捉ip数据的,即在网络层工作,包的第一个字节就是ip的头部的第一个字节 第三个,可以捕捉链路层的包,包的第一个字节是Mac地址的第一个字节。 例子: sockfd=socket(AF_PACKET,SOCK_RAW,ETH_P_IP),这个就是专门捕捉ip包的,可以看到mac地址。 代码: 注意看type。 sockfd=socket(AF_PACKET,SOCK_RAW,ETH_P_ARP),这个是专门没捕捉arp包的,可以看到mac地址。 代码:直接改掉第三个参数即可 type为0806. 接着,详细地看看每个包的格式 IP包: 和IP包同等级的ARP包: 说明: 1,arp包总共有28字节,这是不变的。 2,arp包有两种类型,请求和应答。 3,结合第一张图可以仔细看看。 4,嵌在ip里面的tcp包 4,嵌在ip里面的udp包 5,嵌在ip里面的icmp包2,看在网络层的工作 例子: sockfd=socket(AF_INET,SOCK_STREAM,IPPROT_TCP) 这个捕捉的数据是从ip头部开始的,且只捕捉tcp包(tcp嵌在ip中的,这个都知道) 其实,最后一个参数可以写为0,即前面两个参数会默认后面的参数是IPPORT_TCP.
各个数据包格式图示
最新推荐文章于 2023-12-08 16:15:16 发布