Raw Socket

Linux小知识--原始套接字(raw socket)之模拟ping 利用原始套接字模拟ping 阅读详情

1.原始套接字(raw socket)

  1.1 原始套接字工作原理与规则
         原始套接字是一个特殊的套接字类型,它的创建方式跟TCP/UDP创建方法几乎是
一摸一样,例如,通过

       int sockfd;
 
       sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);


这两句程序你就可以创建一个原始套接字.然而这种类型套接字的功能却与TCP或者UDP类型套接字的功能有很大的不同:TCP/UDP类型的套接字只能够访问传输层以及传输层以上的数据,因为当IP层把数据传递给传输层时,下层的数据包头已经被丢掉了.而原始套接字却可以访问传输层以下的数据,,所以使用raw套接字你可以实现上至应用层的数据操作,也可以实现下至链路层的数据操作.
         比如:通过

sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))

方式创建的raw socket就能直接读取链路层的数据.


1)使用原始套接字时应该注意的问题(参考<<unix网络编程>>以及网上的优秀文档)

(1) 对于UDP/TCP产生的IP数据包,内核不将它传递给任何原始套接字,而只是将这些数据交给对应的UDP/TCP数据处理句柄(所以,如果你想要通过原始套接字来访问TCP/UDP或者其它类型的数据,调用socket函数创建原始套接字第三个参数应该指定为htons(ETH_P_IP),也就是通过直接访问数据链路层来实现.(我们后面的密码窃取器就是基于这种类型的).

(2) 对于ICMP和EGP等使用IP数据包承载数据但又在传输层之下的协议类型的IP数据包,内核不管是否已经有注册了的句柄来处理这些数据,都会将这些IP数据包复制一份传递给协议类型匹配的原始套接字.

(3) 对于不能识别协议类型的数据包,内核进行必要的校验,然后会查看是否有类型匹配的原始套接字负责处理这些数据,如果有的话,就会将这些IP数据包复制一份传递给匹配的原始套接字,否则,内核将会丢弃这个IP数据包,并返回一个ICMP主机不可达的消息给源主机.

(4)  如果原始套接字bind绑定了一个地址,核心只将目的地址为本机IP地址的数包传递给原始套接字,如果某个原始套接字没有bind地址,核心就会把收到的所有IP数据包发给这个原始套接字.

(5)  如果原始套接字调用了connect函数,则核心只将源地址为connect连接的IP地址的IP数据包传递给这个原始套接字.

(6) 如果原始套接字没有调用bind和connect函数,则核心会将所有协议匹配的IP数据包传递给这个原始套接字.

2).编程选项
     原始套接字是直接使用IP协议的非面向连接的套接字,在这个套接字上可以调用bind和connect函数进行地址绑定.说明如下:

(1)bind函数:调用bind函数后,发送数据包的源IP地址将是bind函数指定的地址。如是不调用bind,则内核将以发送接口的主IP地址填充IP头. 如果使用setsockopt设置了IP_HDRINCL(header including)选项,就必须手工填充每个要发送的数据包的源IP地址,否则,内核将自动创建IP首部.

(2)connetc函数:调用connect函数后,就可以使用write和send函数来发送数据包,而且内核将会用这个绑定的地址填充IP数据包的目的IP地址,否则的话,则应使用sendto或sendmsg函数来发送数据包,并且要在函数参数中指定对方的IP地址。

    综合以上种种功能和特点,我们可以使用原始套接字来实现很多功能,比如最基本的数据包分析,主机嗅探等.其实也可以使用原始套接字作一个自定义的传输层协议.

1.2一个简单的应用

    下面的代码创建一个直接读取链路层数据包的原始套接字,并从中分析出源MAC地址和目的MAC地址,源IP和目的IP,以及对应的传输层协议,如果是TCP/UDP协议的话,打印其目的和源端口.为了方便阅读,程序中避免了使用任何与协议有关的数据结构,如
struct ether_header ,struct iphdr  等,当然, 要完全理解代码,你需要关于指针以及位运算的知识

/***************SimpelSniffer.c*************/
 
//auther:duanjigang@2006s
 
#include <stdio.h>
 
#include <unistd.h>
 
#include <sys/socket.h>
 
#include <sys/types.h>
 
#include <linux/if_ether.h>
 
#include <linux/in.h>
 
#define BUFFER_MAX 2048
 

int main(int argc, char *argv[])
 
{
 
        
        int sock, n_read, proto;        
        char buffer[BUFFER_MAX];
 
        char  *ethhead, *iphead, *tcphead, 
                         *udphead, *icmphead, *p;
 
        
if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
 
    {
 
        fprintf(stdout, "create socket error\n");
 
        exit(0);
 
    }
 
        
while(1) 
{
 
     n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
 
        /*
 
        14   6(dest)+6(source)+2(type or length)
 
        +
 
        20   ip header 
        +
 
        8   icmp,tcp or udp header
 
        = 42
 
        */
 
if(n_read < 42) 
   {
 
      fprintf(stdout, "Incomplete header, packet corrupt\n");
 
      continue;
 
   }
 
                
        ethhead = buffer;
 
        p = ethhead;
 
        int n = 0XFF;
 
                printf("MAC: %.2X:%02X:%02X:%02X:%02X:%02X==>"
 
                           "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
 
        p[6]&n, p[7]&n, p[8]&n, p[9]&n, p[10]&n, p[11]&n,
 
        p[0]&n, p[1]&n, p[2]&n,p[3]&n, p[4]&n, p[5]&n);
 

                   iphead = ethhead + 14;  
 
                   p = iphead + 12;
 
        
 
           printf("IP: %d.%d.%d.%d => %d.%d.%d.%d\n",
 
           p[0]&0XFF, p[1]&0XFF, p[2]&0XFF, p[3]&0XFF,
 
           p[4]&0XFF, p[5]&0XFF, p[6]&0XFF, p[7]&0XFF);
 
            proto = (iphead + 9)[0];
 
            p = iphead + 20;
 
             printf("Protocol: ");
 
            switch(proto)
 
              {
 
                case IPPROTO_ICMP: printf("ICMP\n");break;
 
                case IPPROTO_IGMP: printf("IGMP\n");break;
 
                case IPPROTO_IPIP: printf("IPIP\n");break;
 
                case IPPROTO_TCP :
 
                case IPPROTO_UDP : 
    printf("%s,", proto == IPPROTO_TCP ? "TCP": "UDP"); 
    printf("source port: %u,",(p[0]<<8)&0XFF00 |  p[1]&0XFF);
 
    printf("dest port: %u\n", (p[2]<<8)&0XFF00 | p[3]&0XFF);
 
         break;
 
    case IPPROTO_RAW : printf("RAW\n");break;
 
    default:printf("Unkown, please query in include/linux/in.h\n");
 
        }
 
   }
 
}

 

源地址:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=876233

有关raw socket的一些知识     众所周知,通过socket编程,我们能够实现机器之间的通信.在TCP/IP协议簇(PF_INET)中,可以建立面向连接的SOCK_STREAM类型的socket,非连接的SOCK_DGRAM类型的socket.事实上,在所有的网络程序中,也是这两种socket用的最为广泛.除此之外,还有一些不常用的socket类型,它们却是在某些网络通信中担当重要的角色.这里要讲的就是这么一种sock 阅读详情

相关推荐

Linux Raw Socket使用总结

学过socket基础编程的同学都知道,应用层socket(如使用SOCK_STREAM创建的TCP socket,SOCK_DGRAM创建的UDP socket)都只能收发应用层的数据,出于业务应用的需要,可能需要获取IP层甚至是以太层的数据,这就需要用到socket接口中另一种更加强大的类型RAW socket。 使用SOCK_RAW创建的RAW socket,可以收发包含IP层的报文

sprintwind的专栏 3218

raw socket编程例子

前几天看了看>第一卷,为了加深理解,便写了几个简单的程序,最近好忙,但是又怕忘记前面所学的知识,就粗糙的整理了一下,贴出来,希望能给初学者以指导,同时借助CU的论坛做个备份,呵呵. 内容安排: 1.原始套接字介绍   1.1 原始套接字工作原理与规则   1.2 简单应用 2 FTP密码窃取器实现(简单的rootkit)   2.1 设计思路   2.2 实现   2.3 不足与改

husterfisher的专栏 1652

python raw socket 介绍

因为要使用 python 底层发包模块,也就是 raw socket 发包模式,所以在此深入了解一下 python socket 通信。 涉及到的函数: import socket socket() setsockopt() sendto() recvfrom() 因为使用的是原始套接字,所以我们不使用bind/connect函数,参照《unix 网络编程》 bind 函数仅仅设置本地...

weixin_30340617的博客 1350

RAW socket

当网卡处于这种“混杂”模式时,它对所有遇到的每一个数据帧都产生一个硬件中断,以提醒操作系统处理流经该物理媒体上的每一个报文包。要注意的是send/recv函数使用MSG_WAITALL的时候,sockfd 必须是处于阻塞模式下,否则WAITALL不能起作用。socket(PF_PACKET, SOCK_RAW, htons(ETH_P_XXX)) // 发送、接收数据链路层。查资料发现:默认情况下,网卡接收一个包,网卡只把发给本机的包(包括广播包)传到上层的APP。【以ptp报文帧为例】

zion--6135的博客 3545

原始套接口(RAW SOCKET)

原始套接口(RAW SOCKET) 原始套接口提供三种TCP和UDP套接口不提供的功能:1). 可以读写ICMPv4, IGMPv4和ICMPv6分组. 例如Ping和Traceroute程序就是利用ICMP分组2). 可以读写特殊的IPv4数据报, 内核不处理这些数据报IPv4协议字段3). 使用IP_HDRINCL选项可以构造自己IPv4头部. 可以用这个特性来构造自己的T

liqinghua1653的专栏 4496

运用Raw Socket进行以太网帧解析

RAW SOCKETRAW Socket提供了一种方法来绕过整个网络堆栈遍历,并直接将以太网帧输送到一个应用程序的方法。(跳过网络层和传输层的过滤解析,因而可以直接处理新的或是自定义的数据包格式)常用创建RAW Socket格式的方法:AF_PACKET和PF_SOCKET。AF_PACKET用于win和mac系统。本篇介绍基于Linux的PF_PACKET创建方法。基于PF_PACKET的PF_...

Athrun_misou的博客 2451

Linux网络编程- 原始套接字(Raw Socket)

原始套接字(Raw Socket)提供了一种机制,允许应用程序直接访问底层传输协议,绕过操作系统提供的传输层接口。这种套接字通常用于实现新的协议或对现有协议进行低级别的操作。以下是对原始套接字的详细介绍:定义与用途:创建:特权:工作方式:用途与限制:注意事项:跨平台的差异:总的来说,原始套接字是一个非常强大的工具,但也需要谨慎使用。正确使用它需要对网络协议有深入的理解,而滥用它可能导致网络问题或被视为恶意活动。创建链路层的原始套接字允许我们直接与链路层设备(例如以太网适配器)交互,从而可以发送和接收链路层帧

青衫客36的博客 7460

linux raw socket

raw socket即原始套接字,可以通过创建socket时,设置参数SOCK_RAW来创建。相比平时使用SOCK_STREAM创建的应用层的套接字,raw socket可以直接处理ip首部和tcp首部,并且可以监听抓取经过本机的ip数据包和mac帧,可以处理ICMP和IGMP等网络控制报文。通常有两种方式: //发送接收ip数据包 socket(PF_INET,SOCK_RAW,IPPROTO_T

cplusplus 3083

【RawSocket】RawSocket的使用方法

RawSocket是数据链路层的socketRaw socket(原始套接字)是一种特殊的网络套接字类型,它允许应用程序直接发送和接收底层的网络数据包,而不需要经过标准的传输层协议(如TCP或UDP)的处理。3.4.5.6.7.

qq_38089448的博客 2586

rawsocket抓包工具源码

利用rawsocket、winpcap两种技术实现的监控http数据的C#源码,网上上搜集,代码有点凌乱,适合配上《tcp/ip详解》这本书研究用。

raw socket demo

raw socket demo,原始套接字

Raw Socket 接收和发送数据包

snippet/raw-socket.md at master · xgfone/snippet · GitHubhttps://github.com/xgfone/snippet/blob/master/snippet/docs/linux/program/raw-socket.md Raw Socket 接收和发送数据包 前言 对于网络层IP数据包的接收、发送,RAW SOCKET 接口是通用的,具有可移植性。 但对于数据链路层数据帧的接收、发送,不同的系统有不同的机制,不具有可移植性。 对于

maimang1001的专栏 2万+

Linux环境下基于Raw socket技术的多线程追击抓包法.pdf

Linux环境下基于Raw socket技术的多线程追击抓包法.pdf

raw socket

ipv4: 1.创建收发二层报文的raw socket: socket(PF_PACKET, SOCK_RAW, 0); 或者 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 2.创建收发三层(IP层)报文的raw socket: socket (PF_INET, SOCK_RAW, IPPROTO_RAW); setsockopt

HTJOY1202的专栏 4228

电镀技术:微型制造的原子级加法工艺与核心优势

电镀是一种利用电解原理在基材表面沉积金属层的表面处理技术,其本质是通过电场控制溶液中金属离子的迁移与还原,实现原子级的可控沉积。这一过程的核心在于对电流密度、温度、添加剂等参数的精密调控,从而实现对镀层结晶结构、性能的“编程”。从技术价值看,电镀作为一种“加法制造”工艺,在微观尺度上具有无与伦比的保形性和材料灵活性,能够实现复杂三维结构的均匀覆盖与功能复合。在应用场景上,它尤其契合现代微型化制造的需求,例如在集成电路的铜互连填充、高密度PCB板微孔金属化、MEMS传感器电极制备以及柔性电子器件制造中发挥着不

weixin_42524842的博客 528

零代码搭建专业知识库:Wiki.js+cpolar让团队协作像写笔记一样简单

"项目文档又找不到了!“团队负责人小张第N次在群里看到这样的抱怨——技术文档分散在邮件、网盘和个人电脑里,新人入职要花一周熟悉文档位置,远程协作时版本混乱更是家常便饭。Wiki.js与cpolar内网穿透服务的出现,就像给团队协作装上了"中央大脑”,用写Markdown笔记的简单方式,搭建一个专业的知识库系统。普通人对知识管理的需求其实很简单:方便记录、容易查找、大家能用。但传统方案把这个过程搞得异常复杂:建服务器、配环境、学语法、搞权限……大部分团队还没开始就放弃了。

Yawesh的博客 2040

python raw socket_python raw socket 介绍

因为要使用 python 底层发包模块,也就是 raw socket 发包模式,所以在此深入了解一下 python socket 通信。涉及到的函数:import socketsocket()setsockopt()sendto()recvfrom()因为使用的是原始套接字,所以我们不使用bind/connect函数,参照《unix 网络编程》bind 函数仅仅设置本地地址。就输出而言,调用bin...

weixin_39605278的博客 1439

别再自己写组件了!用uni-app的midButton属性5分钟搞定中间凸起TabBar(H5/小程序通用)

本文详细介绍了uni-app官方提供的midButton属性,帮助开发者5分钟内实现中间凸起的TabBar效果,无需编写繁琐的自定义组件代码。该方案兼容H5和微信小程序平台,配置简单且维护成本低,大幅提升开发效率和性能表现。

weixin_30431445的博客 348

raw, SOCK_RAW - Linux IPv4 raw socket.

总 览 #include <sys/socket.h> #include <netinet/in.h> raw_socket = socket(PF_INET, SOCK_RAW, int protocol ); 描 述 Raw sockets 使得用户端可以实现新的 IPv4 协议。 raw socket 设备接收或发送不含链接层报头的原始数据...

weixin_30256901的博客 273

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析(Software Composition Analysis,SCA)是一种用于识别和分析软件内部组件及其关系的技术,旨在帮助开发人员更好地了解和管理其软件的构建过程,同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展与软件行业的快速发展密不可分,下面将介绍SCA的发展背景、技术原理以及当前主流SCA工具。

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 5635

强化学习:在智能交通系统中的应用

作者:禅与计算机程序设计艺术 这篇文章将探索如何利用强化学习(RL)这一强大的机器学习方法,在智能交通系统中实现自动驾驶、优化路线规划和提高道路安全等方面的突破。RL通过让智能体与环境互动并从这些互动中学习,从而解决复杂的决策过程问题,这正是现代智能交通系统所需要的。 背景介绍 随着城市化进程的加速,交通拥堵、能源消耗和交通事

AI天才研究院 1121

RAW_SOCKET

sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket   1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包 2.socket(PF_PACKET, SOCK_RAW, htons(ETH_

benpaobagzb的博客 530

pymol 动画简单制作,gif、mp4导出

参考: https://www.youtube.com/watch?v=G77K9Lro8js1、直接Movie下Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec;如果要动画过渡自然,可以在这4sec后面再Append 1sec;如果需要两个视角,既可以再把窗口蛋白定位到比如配体,不用管中间过程怎么定位过去配体,再Program下,Camera Loop下Nutate下选择,这里选择30degover4 sec添加;最后如果要整体形成个循环播放,可以在这4s

weixin_42357472的博客 8445
上一篇: Ping过程详解
下一篇: 云计算基本概念
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值