Linux下原始套接字的原理

创建原始套接字:
socket(AF_NET, SOCK_RAW, protocol);

1. 参数protocol用来致命所接收的协议包,如果是像IPPROTO_TCP(6)这种非0、非255的协议,能接收ip头为protocol域的数据包,包括IP头,协议头以及数据;发送数据时,默认只需构建protocol协议头及数据,不需构建IP头。可以通过设置原始套接字的IP_HDRINCL属性,使用户自己构建IP头。
setsockopt (rawsock, IP, IP_HDRINCL, “1”, sizeof (“1”));
2. 如果protocol为IPPROTO_RAW,创建的原始套接字只能用来发送IP数据包,且默认开启IP_HDRINCL属性,需要用户自己构建IP包头,计算校验和。
3. 对于protocol为IPPROTO_IP的原始套接字,可以接收任何的IP数据包。其中的校验和验证和协议分析由程序自己完成。
4. 若要监测所有输入与输出的数据包,而且不仅限制于IP包(tcp/udp/icmp),监测 arp/rarp包,以及以太网头部,需要通过以下语句建立原始套接字:
sock_raw = socket( AF_PACKET , SOCK_RAW , htons(ETH_P_ALL)) ;

原始套接字在windows下的局限

Limitations on Raw Sockets
On Windows 7, Windows Vista, Windows XP with Service Pack 2 (SP2), and Windows XP with Service Pack 3 (SP3), the ability to send traffic over raw sockets has been restricted in several ways:

  • TCP data cannot be sent over raw sockets.
  • UDP datagrams with an invalid source address cannot be sent over raw sockets. The IP source address for any outgoing UDP datagram must exist on a network interface or the datagram is dropped. This change was made to limit the ability of malicious code to create distributed denial-of-service attacks and limits the ability to send spoofed packets (TCP/IP packets with a forged source IP address).
  • A call to the bind function with a raw socket for the IPPROTO_TCP protocol is not allowed.

Note The bind function with a raw socket is allowed for other protocols (IPPROTO_IP, IPPROTO_UDP, or IPPROTO_SCTP, for example).

These above restrictions do not apply to Windows Server 2008 R2, Windows Server 2008 , Windows Server 2003, or to versions of the operating system earlier than Windows XP with SP2.

参考:

  • 浅谈原始套接字 SOCK_RAW 的内幕及其应用
  • http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=876233
  • Linux网络编程:原始套接字的魔力
  • raw socket遇上windows

原始套接字编程(1)相关推荐

  1. 【Linux网络编程】原始套接字编程

    原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...

  2. linux sock_raw原始套接字编程

    sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket   1.socket(AF_INET, SOCK_R ...

  3. Linux网络编程——原始套接字编程

    Linux网络编程--原始套接字编程 转自:http://blog.csdn.net/tennysonsky/article/details/44676377 原始套接字编程和之前的 UDP 编程差不 ...

  4. 原始套接字编程”中的Teardrop代码编程

    原始套接字编程"中的Teardrop代码编程 (1)实验代码: #include <stdio.h> #include <stdlib.h> #include < ...

  5. 原始套接字编程 | ping程序实现

    [实验目的] 熟悉原始套接字编程的基本流程 理解ping程序的实现机制 理解ICMP协议的基于作用和报文格式. 完成原始套接字的配置. [实验内容] 1.构造ICMP协议首部结构 2.构造IC ...

  6. Teardrop原始套接字编程

    目录 一.含义介绍 二.Teardrop代码编程 参考 一.含义介绍 1.什么是原始套接字 原始套接字的含义就是在传输层之下使用的套接字,它提供了一些 TCP 和 UDP 套接字无法提供的功能,即: ...

  7. Windows平台的原始套接字编程的知识点概要(备忘)

    其实从大学学习了C语言后,翻看整本教材只有C语言的语法,根本没有网络编程相关的任何内容,现在回想起来,都记不起自己何时在哪本书上学习了套接字编程,说起TCP.UDP,能知道他们的区别,相关的编程的&q ...

  8. 105-网络编程——第七章原始套接字编程(上)

    1.原始套接字是允许访问底层传输协议的一种套接字类型,提供了普通套接字所不具备的功能,能够对网络数据包进行某种程度的控制操作 因此原始套接字通常用于开发简单网络性能监视程序以及网络探测.网络攻击 2. ...

  9. 原始套接字编程——Teardrop

    文章目录 一.介绍套接字 二.著名的Teardrop 三.伪造虚假地址的IP包 四.在Ubuntu下使用Wireshark抓包进行验证 五.总结 六.参考资料 一.介绍套接字 流套接字(SOCK_ST ...

最新文章

  1. ECMAScript 6 一些有意思的特性
  2. Windows Phone 8本地化多语言支持
  3. postman提取返回值
  4. 2评分标准多少分_高新企业认定评分标准,需要多少分才能拿到高新认证证书...
  5. 解析Java对象的equals()和hashCode()的使用
  6. 小明的烦恼 详解(C++)
  7. (转)周明:未来5-10年,自然语言处理将走向成熟
  8. 智图—源于QQ空间图片WebP化的思考
  9. python 会议室预约系统解决方案_智能会议预约系统解决方案
  10. 《Python语言程序设计基础》嵩天著-第5章程序全练习题答案
  11. sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPath
  12. 二元分类(Binary Classfication)与logistic回归
  13. 救济金发放_通过专门的视频游戏提供癌症救济
  14. 常用求导公式 高阶导公式 莱布尼兹公式
  15. OpenFeign报文内容大报错: {“code“:1,“msg“:“JSON parse error: Illegal character ((CTRL-CHAR, code 31))
  16. 爬虫 (十九) 有趣的例子认识 while 循环 (十)
  17. CV——基于Stitcher类实现图片拼接
  18. stm32 驱动 TFT LCD
  19. Gson JsonParser
  20. 数据人该知道的埋点体系(二)

热门文章

  1. 错误记录:expected single matching bean but found 2
  2. 亚马逊S3文件存储的可视化
  3. python搭建web服务器_Python搭建简单的web服务器
  4. c语言存储大范围整形,C语言整形数值范围问题
  5. python画矩形函数drawrectangle_Python3 tkinter基础 Canvas create_rectangle 画矩形
  6. 计算机的安全设置在哪儿,电脑防火墙在哪里设置
  7. Java 平台有哪几个版本?
  8. c matlab.h,用matlab和c写程序,include的mex.h在哪里?
  9. 如何把本地yum源给其他机器使用_如何使用系统安装盘做yum的本地源?
  10. post 请求 argument type mismatch_Flask-RESTful 请求解析