RAW 7
目录
- NAME raw, SOCK_RAW
- 总 览
#include
.br #include .br raw_socket = socket(PF_INET, SOCK_RAW, int protocol ); .SH 描 述 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 协议. 但是不允许传送。 .TS tab(:) allbox; c s l l. IP_HDRINCL 会在传送时修改 IP 报头。 IP Checksum: 总是写入。 Source Address:为 0 时写入。 Packet Id:为 0 时写入。 Total Length:总是写入。 .TE .PP 如果指定了 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)。 (比如.内核协议模块). .SH 地址格式 raw socket 使用在 ip (7) 中定义的标准 sockaddr_in 地址结构。 sin_port 域用于指定 IP 协议号,但是在 Linux 2.2 下传送时应将 其忽略,而且应该一直设为0 (参见 BUGS). 对于接收的包,sin_port 被设置为该包的协议号。 参考 其中包括介绍有效的 IP 协议的文件. .SH SOCKET选项 raw socket 选项可使用 setsockopt (2) 进行设置,用 getsockopt (2)进行读取(通过传递 SOL_RAW 族标志). .TP .B ICMP_FILTER 激活绑定到 IPPROTO_ICMP 协议的一个用于 raw socket 特殊的过滤器。 该值对每种 ICMP 消息都有一个位(掩码), 可以把那种 ICMP 消息过滤掉.缺省时是不过滤 ICMP 消息. 另外,还支持所有对数据报 socket 有效的 ip(7) SOL_IP socket 选项. .SH 注 意 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. .SH 错误处理 只有连接了 socket 或 IP_RECVERR 设置为有效时,网络错误才会 传送给用户。因为兼容性的原因只有 EMSGSIZE 和 EPROTO 被传送 给 socket. .SH 错 误 .TP .B IP_RECVERR 使得所有的错误存储到 error queue(错误队列). .TP .B EMSGSIZE 包太大。或者因为路径 MTU 查找 (IP_PMTU_DISCOVER) 设置为有效,或者因为包的尺寸超过 IPv4 规定的包 最大尺寸 64KB. .TP .B EACCES 用户试图传送到某广播地址但是并未事先在socket中设置广播 标志。 .TP .B EPROTO ICMP 错误报告有参数问题。 .TP .B EFAULT 无效内存地址。 .TP .B EOPNOTSUPP 传送给 socket 的标志无效(比如:MSG_OOB ). .TP .B EINVAL 无效参数. .TP .B EPERM 用户无权打开 raw socket. 只有用户 id 为 0 或具有 CAP_NET_RAW 属性方可。 .SH 版 本 IP_RECVERR 和 ICMP_FILTER 是 Linux 2.2 的新实现. 不能用于可移植程序。 如果设置了 SO_BSDCOMPAT 标志, Linux 2.0 里面有和 BSD 里兼容的 raw socket 代码错误, 在 2.2 里已经修补了. .SH BUGS 没有描述透明代理扩展. 当设置 IP_HDRINCL 选项后datagrams(自寻址数据包)不会被分段 并受 MTU 限制. 这是 Linux 2.2 的限制. 在 Linux 2.2 sin_port 中设置的 IP 协议会丢失。使用的是绑定了 socket 的协议,或在 socket (2)初始化调用中指定的协议。 .SH 作 者 Andi Kleen. .SH 另 见 .BR ip (7), .BR socket (7), .BR recvmsg (2), .BR sendmsg (2). .PP RFC1191 for path MTU discovery. .br RFC791 and the include file for the IP protocol. .br .SH - [中文版最新更新]
- 《中国linux论坛man手册页翻译计划》:
- 跋
RAW
NAMEæ» è§
æ è¿°
å°åæ ¼å¼
SOCKETé项
注 æ
é误å¤ç
é 误
ç æ¬
BUGS
ä½ è
å¦ è§
[䏿çç»´æ¤äºº]
[ä¸æçææ°æ´æ°]
ãä¸å½linux论åmanæå页翻è¯è®¡åã:
è·
NAME
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 æ¥å¤´å«æçç®çå°å䏿¯ 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 屿§æ¹å¯ã |
ç æ¬
IP_RECVERR å ICMP_FILTER æ¯ Linux 2.2 çæ°å®ç°. ä¸è½ç¨äºå¯ç§»æ¤ç¨åºã
å¦æè®¾ç½®äº SO_BSDCOMPAT æ å¿ï¼ Linux 2.0 é颿å BSD éå¼å®¹ç raw socket 代ç éè¯¯ï¼ å¨ 2.2 éå·²ç»ä¿®è¡¥äºï¼
BUGS
没ææè¿°éæä»£çæ©å±.
å½è®¾ç½® IP_HDRINCL é项ådatagramsï¼èªå¯»åæ°æ®åï¼ä¸ä¼è¢«å段 å¹¶å MTU éå¶. è¿æ¯ Linux 2.2 çéå¶.
å¨ Linux 2.2 sin_port ä¸è®¾ç½®ç IP åè®®ä¼ä¸¢å¤±ã使ç¨çæ¯ç»å®äº socket çåè®®ï¼æå¨ socket (2)åå§åè°ç¨ä¸æå®çåè®®ã
ä½ è
Andi Kleen.
å¦ è§
ip(7), socket(7), recvmsg(2), sendmsg(2).
RFC1191 for path
MTU discovery.
RFC791 and the include file for the IP protocol.
[䏿çç»´æ¤äºº]
RedCandle <redcandle51@chinaren.com>
[ä¸æçææ°æ´æ°]
2000/10/15
ãä¸å½linux论åmanæå页翻è¯è®¡åã:
http://cmpp.linuxforum.net
è·
æ¬é¡µé¢ä¸æçç±ä¸æ
man
æå页计åæä¾ã
䏿 man
æå页计åï¼https://github.com/man-pages-zh/manpages-zh