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
设备接收或发送不含链接层报头的原始数据包。只有激活接口选项 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.的更多相关文章
- linux内核中socket的创建过程源码分析(总结性质)
在漫长地分析完socket的创建源码后,发现一片浆糊,所以特此总结,我的博客中同时有另外一篇详细的源码分析,内核版本为3.9,建议在阅读本文后若还有兴趣再去看另外一篇博文.绝对不要单独看另外一篇. 一 ...
- ip - Linux IPv4 协议实现
SYNOPSIS(总览) #include <sys/socket.h> #include <net/netinet.h> tcp_socket = socket(PF_INE ...
- Linux中查看socket状态(转)
Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...
- Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- Linux学习之socket编程(二)
Linux学习之socket编程(二) 1.C/S模型——UDP UDP处理模型 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实 ...
- Linux Kernel ‘/net/socket.c’本地信息泄露漏洞
漏洞名称: Linux Kernel ‘/net/socket.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201312-037 发布时间: 2013-12-04 更新时间: 2013-12- ...
- 如何正确可视化RAW(ARW,DNG,raw等格式)图像?
为了正确可视化RAW图像,需要做好:白平衡.提亮以及色彩映射. import numpy as np import struct from PIL import Image import rawpy ...
- linux中高并发socket最大连接数的优化详解
linux中高并发socket最大连接数的优化详解 https://m.jb51.net/article/106546.htm?from=singlemessage
随机推荐
- AJAX——理解XMLHttpRequest对象
AJAX大家已经都知道了,XMLHttpRequest对象则是AJAX的核心.这篇博客重点总结一下这个对象的使用. XMLHttpRequest对象的属性和方法: 属性 说明 readyState 表 ...
- ZROI2019 提高十连测
额 掰手指头一数 特么又是第三年十连测了= = 2017一场没打 那时候好像一场比赛也就100人左右 2018前几场还都好好补了 后来开始放飞自我了 这时候一场有150人还多了 2019想让今年的No ...
- ORM多表查询下
一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...
- vue对特殊特性的研究
key 预期:number | string key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes.如果不使用 key,Vue 会使用一种最大限度减少 ...
- python学习笔记(七)模块
一个python文件就是一个模块 1.标准模块 python自带的,不需要你安装的 2.第三方模块 需要安装,别人提供的,例:pip install radis 如果提示没有pip,把python下s ...
- Jira插件安装
以下操作需要反编译 1.反编译的jar包 1)E:\JIRA安装路径\atlassian-jira\WEB-INF\atlassian-bundled-plugins\atlassian-univer ...
- BZOJ 3306: 树 LCT + set 维护子树信息
可以作为 LCT 维护子树信息的模板,写的还是比较优美的. 本地可过,bzoj 时限太紧,一直 TLE #include<bits/stdc++.h> #define setIO(s) f ...
- JavaScript学习第一篇
在学习之前让我们了解了解JavaScript的由来 Javascript是一种web技术,最初起名叫LiveScript,它是Netscape开发出来一种脚本语言,其目的是为了扩展基本的Html的功能 ...
- [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)
题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...
- css中div垂直居中的方法。
利用绝对定位实现的居中 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...