原始套接字

Posted Rosanne

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始套接字相关的知识,希望对你有一定的参考价值。

原始套接字

  一般情况下程序设计人员主要接触以下两类套接字:

  • 流式套接字(SOCK_STREAM): 面向连接的套接字,对应于 TCP 应用程序。
  • 数据包套接字(SOCK_DGRAM): 无连接的套接字,对应于UDP 应用程序。

  这一类套接字为标准套接字。此外,还有一类原始套接字,它是一种对原始网络报文进行处理的套接字。原始套接字的用途主要有:

  • 发送自定义的IP 数据报
  • 发送ICMP 数据报
  • 网卡的侦听模式,监听网络上的数据包。
  • 伪装IP地址。
  • 自定义协议的实现。

  原始套接字主要应用在底层网络编程上,同时也是网络黑客的必备手段。eg:sniffer、拒绝服务(DoS)、IP 地址欺骗等都需要在原始套接字的基础上实现。

  原始套接字与标准套接字之间的关系如下图所示。标准套接字与网络协议栈的TCP、UDP 层打交道,而原始套接字则与IP层级网络协议栈核心打交道。

 

  原始套接字的创建:

int rawsock = socket(AF_INET, SOCK_RAW, protocol);

  常用协议的类型如下:

  • IPPROTO_IP : IP 协议, 接收或者发送IP数据包,包含IP头部。
  • IPPROTO_ICMP: ICMP 协议, 接收或者发送ICMP 的数据包,IP 的 头部不需要处理。
  • IPPROTO_TCP: TCP 协议,接收或者发送TCP 数据包
  • IPPROTO_UDP: UDP 协议,接收或者 UDP 数据包
  • IPPROTO_RAW : 原始IP包

 

以上是关于原始套接字的主要内容,如果未能解决你的问题,请参考以下文章

使用原始套接字 (c++)

即使设置 cap_net_raw 也无法在 linux 容器中打开原始套接字

原始套接字的数据包碎片

为啥数据不通过 Windows 中的原始套接字发送

如何在 Python 中使用原始套接字?

原始 UDP 套接字卡在 recvfrom 上