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
随机推荐
- Android App渗透测试工具汇总
网上搜集了一些App安全学习教程及工具,项目地址:https://github.com/Brucetg/App_Security 一. drozer简介 drozer(以前称为Mercury)是一款A ...
- python NameError: name 'file' is not defined
import sys import time import os poem='''\ 测试读写文件 ''' print(os.getcwd()) f=file(os.getcwd()+'/python ...
- man DMIDECODE
DMIDECODE(8) DMIDECODE(8) NAME/名称 dmideco ...
- selenium 自动化的坑(4)
今天要讲的坑是....输入框有请求的. 问题是这样的,我们公司的业务有些输入框选项是联想的,这些联想都会发送请求,怎么办呢? 先 正常输入,然后强制等待几秒,最好多等会,谁知道第三方会不会有问题,这里 ...
- Proto3语法翻译
本文主要对proto3语法翻译.参考网址:https://developers.google.com/protocol-buffers/docs/proto3 defining a message t ...
- CentOS下安装Chrome浏览器
1. 下载安装脚本, 在下载目录中,执行以下命令,将安装脚本下载到本地 wget https://intoli.com/install-google-chrome.sh 2.然后授予可执行权限 chm ...
- UIWebView和WKWebView一些琐事
WebViewJavascriptBridge 1.load加载 ,去本地查找html路径方式 NSString* htmlPath = [[NSBundle mainBundle] pathForR ...
- 项目部署到tomcat,浏览器能够访问,手机不能访问。
问题:有这样一个问题,把项目部署到tomcat上,浏览器能够访问,但是手机不能访问. 解决:在 tomcat中找到conf文件夹,然后找到web.xml
- PL/SQL 循环
----PL/SQL基本循环语句 LOOP DECLARE x ; BEGIN LOOP dbms_output.put_line(x); x :; THEN exit; END IF; END LO ...
- 测量TSQL语句的性能
你怎样确定你的应用程序执行的怎么样?你可以使用什么工具?每一个开发人员需要确定每一条应用程序TSQL语句是最优的.通过调整每一个查询你可以确定你的应用程序运行得尽可能的高效.你使用开发环境时更容易对应 ...