总 览

#include <sys/socket.h>
#include
<netinet/in.h>
raw_socket = socket(PF_INET, SOCK_RAW, int protocol
);

描 述

Raw sockets 使得用户端可以实现新的 IPv4 协议。 raw socket
设备接收或发送不含链接层报头的原始数据包。只有激活接口选项 IP_HDRINCL 时 IPv4 层才会在传输包中添加 IP 报头。而且当激活时,包中必须含有
IP 报头。包中含有 IP 报头才能被接收。

只有 user id 为 0 或具有 CAP_NET_RAW 能力才能打开 raw sockets.

所有匹配为此 raw socket 声明的协议号的包或错误都将被传送到该 socket.要察看许可的协议列表,请参考 RFC1700 给出的代号和
getprotobyname (3).

IPPROTO_RAW 意味着 IP_HDRINCL 处于激活状态,也意味着接收所有 IP 协议. 但是不允许传送。

IP_HDRINCL 会在传送时修改 IP 报头。
IP Checksum 总是写入。
Source Address 为 0 时写入。
Packet Id 为 0 时写入。
Total Length 总是写入。

如果指定了 IP_HDRINCL 且 IP 报头含有的目的地址不是 0,那么该 socket 的目的地址用于路由该包。如果指定了
MSG_DONTROUTE 则目的地址应指向某个本地接口。否则会进行路有表查找,但是网关路由会被忽略。如果未设定 IP_HDRINCL 则可通过
setsockopt (2) 在 raw socket 中设定 IP header 选项。参考 ip (7) 了解更多信息。

在 Linux 2.2 下可以用 IP socket 选项设置所有的 IP 报头域和选项. 这意味着通常只有新的协议或没有用户界面的协议需要 raw
socket (就象 ICMP). 当收到一个包时,它首先被传给绑定到包协议的任何 raw socket 然后才传给其他协议句柄(handler)。
(比如.内核协议模块).

地址格式

raw socket 使用在 ip (7) 中定义的标准 sockaddr_in 地址结构。 sin_port 域用于指定 IP
协议号,但是在 Linux 2.2 下传送时应将其忽略,而且应该一直设为0 (参见 BUGS).

对于接收的包,sin_port 被设置为该包的协议号。参考 其中包括介绍有效的 IP 协议的文件.

SOCKET选项

raw socket 选项可使用 setsockopt (2) 进行设置,用 getsockopt (2)进行读取(通过传递
SOL_RAW 族标志).

ICMP_FILTER
激活绑定到 IPPROTO_ICMP 协议的一个用于 raw socket 特殊的过滤器。该值对每种 ICMP 消息都有一个位(掩码),可以把那种
ICMP 消息过滤掉.缺省时是不过滤 ICMP 消息.

另外,还支持所有对数据报 socket 有效的 ip(7) SOL_IP socket 选项.

注 意

raw socket 包长超过接口 MTU 时会把包分成碎片。(另见 BUGS). 另一个更友好和快速的选择是使用路径 MTU 查找。
在 ip (7) IP_PMTU_DISCOVER 一段有详细描述。

使用 bind (2) 可将 raw socket 绑定到指定的本地地址。如果没有绑定,则接收所有符合指定的 IP 协议的包。另外用
SO_BINDTODEVICE 可以将 RAW socket 绑定到指定的网络设备。 详见: socket (7).

IPPROTO_RAW 只能传送。如果你确实想接收所有的 IP 包用 packet (7) socket 和 ETH_P_IP 协议. 请注意
packet socket不象 raw socket 那样对 IP 碎片进行重组。

如果想要为一个 datagram socket 接收的所有 ICMP 包,那么最好在那个 socket 上使用 IP_RECVERR。详见: ip
(7).

raw socket 能窃听所有的 IP 协议, 即使象 ICMP 或 TCP 这样在内核中有协议模块的也不例外。这时候包会同时传送到核心模块和raw
socket. 一个可移植的程序不能依赖这个特性,许多其他 BSD socket 实现在这方面有局限.

Linux 从不改变用户传输的包 (除了前面提到的 IP_HDRINCL ,填入一些0字段).这与其他 raw socket 实现方式是不同的.

RAW socket 通常很难移植. socket 传输时使用 sin_port 中设置的协议,但 Linux2.2 下不行了,解决办法是使用
IP_HDRINCL.

错误处理

只有连接了 socket 或 IP_RECVERR 设置为有效时,网络错误才会传送给用户。因为兼容性的原因只有 EMSGSIZE 和
EPROTO 被传送给 socket.

错 误

IP_RECVERR
使得所有的错误存储到 error queue(错误队列).

EMSGSIZE
包太大。或者因为路径 MTU 查找 (IP_PMTU_DISCOVER)设置为有效,或者因为包的尺寸超过 IPv4 规定的包最大尺寸 64KB.

EACCES
用户试图传送到某广播地址但是并未事先在socket中设置广播标志。

EPROTO
ICMP 错误报告有参数问题。

EFAULT
无效内存地址。

EOPNOTSUPP
传送给 socket 的标志无效(比如:MSG_OOB ).

EINVAL
无效参数.

EPERM
用户无权打开 raw socket. 只有用户 id 为 0 或具有 CAP_NET_RAW 属性方可。 

raw, SOCK_RAW - Linux IPv4 raw socket.的更多相关文章

  1. linux内核中socket的创建过程源码分析(总结性质)

    在漫长地分析完socket的创建源码后,发现一片浆糊,所以特此总结,我的博客中同时有另外一篇详细的源码分析,内核版本为3.9,建议在阅读本文后若还有兴趣再去看另外一篇博文.绝对不要单独看另外一篇. 一 ...

  2. ip - Linux IPv4 协议实现

    SYNOPSIS(总览) #include <sys/socket.h> #include <net/netinet.h> tcp_socket = socket(PF_INE ...

  3. Linux中查看socket状态(转)

    Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...

  4. Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

    主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...

  5. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  6. Linux学习之socket编程(二)

    Linux学习之socket编程(二) 1.C/S模型——UDP UDP处理模型 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实 ...

  7. Linux Kernel ‘/net/socket.c’本地信息泄露漏洞

    漏洞名称: Linux Kernel ‘/net/socket.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201312-037 发布时间: 2013-12-04 更新时间: 2013-12- ...

  8. 如何正确可视化RAW(ARW,DNG,raw等格式)图像?

    为了正确可视化RAW图像,需要做好:白平衡.提亮以及色彩映射. import numpy as np import struct from PIL import Image import rawpy ...

  9. linux中高并发socket最大连接数的优化详解

    linux中高并发socket最大连接数的优化详解 https://m.jb51.net/article/106546.htm?from=singlemessage

随机推荐

  1. git & gerrit & shell

    g公司使用Gerrit改善评审流程. 比较麻烦.gerrit提交后会触发vertifyCI, 实施代码扫描. 这一堆过程, 打印出一堆信息, 都在log中, 所以处理log就需要自己写shell了. ...

  2. vsto c# 获取word里面的图片并保存

    internal void GetEmbeddedImages() { ; Document doc = Globals.ThisAddIn.Application.ActiveDocument; f ...

  3. Web上传文件的三种解决方案

    第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname =  ...

  4. 【HDOJ6699】Block Breaker(模拟)

    题意:给定一个n*m的网格块,如果一个块水平或垂直方向没有相邻支撑就会掉下去 有q次询问,每次会掉下去一块,问连锁反应新掉下的块数 n,m<=2e3,q<=1e5 思路: #include ...

  5. 30 August

    DP 复习. 参考 redbag 博客 提供的题表. P2858 [USACO06FEB] Treats for the Cows 区间 DP. 转换思路,题面从外往里递推,我们采用从里往外递推,权值 ...

  6. html5 figure和figcaption

    figure标签和figcaption标签是html5新增的语义化标签. figure标签,html5语义化标签. 用于规定独立的流内容(图像.图表.照片.代码等等). figcaption标签,ht ...

  7. 重写LayoutParams,读取子View自定义属性

    在EasyConstraintLayout内部定义一个静态类LayoutParams继承ConstraintLayout.LayoutParams,然后在构造方法中读取上面自定义的属性.我们通过裁剪的 ...

  8. CSU 1553 Good subsequence(RMQ问题 + 二分)

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n nu ...

  9. pillow模块快速学习

    一.pillow的简单使用 1.安装 方式一: 如果配置了python中的script路径为环境变量,直接cmd中执行如下命令: pip3 install pillow 方式二: 通过编译器环境,如p ...

  10. 搞死人不偿命的 Bank系统

    每一个成功者都有一个开始.勇于开始,才能够找到通往成功的路. 最近C#进行到第三章:升级Mybank,发现这是一个我个人觉得比较难搞的一个东西,一下是我对Bank系统难点的叙述,请大神笔下留情~ 1. ...