Provided by:
manpages-zh_1.5-1_all 
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 );
æy z
Raw sockets 使得使用者端å¯ä»¥å¯¦ç¾æ–°çš„ IPv4 å”è°ã€‚ raw socket
è¨å‚™æŽ¥æ”¶æˆ–發é€ä¸å«éˆæŽ¥å±¤å ±é çš„é´l數據包。 åªæœ‰æ¿€æ´»æŽ¥å£é¸é … IP_HDRINCL
時 IPv4 å±¤æ‰æœƒåœ¨å‚³è¼¸åŒ…ä¸ æ·»åŠ IP å ±é 。而且當激活時,包ä¸å¿…é ˆå«æœ‰ IP
å ±é 。包ä¸å« 有 IP å ±é æ‰èƒ½è¢«æŽ¥æ”¶ã€‚
åªæœ‰ user id 為 0 或具有 CAP_NET_RAW 能力æ‰èƒ½æ‰“é–‹ raw sockets.
所有匹é…ç‚ºæ¤ raw socket è²æ˜Žçš„å”è°è™Ÿçš„包或錯誤都將被傳 é€åˆ°è©² socket.-
n察看許å¯çš„å”è°åˆ—表, è«‹åƒè€ƒ 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 å‰‡ç›®çš„åœ°å€ æ‡‰æŒ‡å‘æŸ-
茈誚a接å£ã€‚å¦å‰‡æœƒé€²è¡Œè·¯æœ‰è¡¨æŸ¥æ‰¾ï¼Œä½†æ˜¯ç¶²é—œè·¯ç”±æœƒè¢« 忽略。如果未è¨å®š
IP_HDRINCL 則å¯é€šéŽ setsockopt (2) 在 raw socket ä¸è¨å®š IP header
é¸é …。åƒè€ƒ ip (7) 了解更多信 æ¯ã€‚
在 Linux 2.2 下å¯ä»¥ç”¨ IP socket é¸é …è¨ç½®æ‰€æœ‰çš„ IP å ±é 域和é¸é ….
這æ„å‘³è‘—é€šå¸¸åªæœ‰æ–°çš„å”è° æˆ–æ²’æœ‰ä½¿ç”¨è€…ç•Œæ‚¸æ¼•é¬Žé ‚æ„¯ raw socket (å°±åƒ
ICMP). 當收到一茈]時,它漸被傳給ç¶å®šåˆ°åŒ…å”è°çš„任何 raw socket
然後æ‰å‚³çµ¦å…¶ä»–å”è°å¥æŸ„(handler)。 (æ¯”å¦‚ï¼Žæ ¸å¿ƒå”è°æ¨¡å¡Š).
åœaå}æ ç’å¼
raw socket 使用在 ip (7) ä¸å®šç¾©çš„æ¨™æº– sockaddr_in 地å€çµæ§‹ã€‚ sin_port
域用於指定 IP å”è°è™Ÿï¼Œä½†æ˜¯åœ¨ Linux 2.2 䏋傳逿™‚應將
其忽略,而且應該一直è¨ç‚º0 (åƒè¦‹ BUGS).
å°æ–¼æŽ¥æ”¶çš„包,sin_port 被è¨ç½®ç‚ºè©²åŒ…çš„å”è°è™Ÿã€‚ åƒè€ƒ å…¶ä¸åŒ…括介紹有效的
IP å”è°çš„æª”案.
SOCKETICMP_FILTER
激活ç¶å®šåˆ° IPPROTO_ICMP å”è°çš„ä¸€èŒˆå³ raw socket ç‰¹æ®Šçš„éŽæ¿¾å™¨ã€‚
è©²ï ƒç¿µC種 ICMP 消æ¯éƒ½æœ‰ä¸€èŒ¼é½]掩碼), å¯ä»¥æŠŠé‚£ç¨® ICMP
消æ¯éŽæ¿¾æŽ‰ï¼Žé è¨æ™‚是ä¸éŽæ¿¾ ICMP 消æ¯ï¼Ž
å¦å¤–ï¼Œé‚„æ”¯æŒæ‰€æœ‰å°æ•¸æ“šå ± socket 有效的 ip(7) SOL_IP socket
é¸é ….
æ³`æ„N
raw socket åŒ…é•·è¶…éŽæŽ¥å£ MTU 時會把包分æˆç¢Žç‰‡ã€‚(å¦è¦‹ BUGS). å¦ä¸€-
èéŸç©»nå’Œå¿«é€Ÿçš„é¸æ“‡æ˜¯ä½¿ç”¨è·¯å¾‘ MTU 查找。 在 ip (7) IP_PMTU_DISCOVER
一段有詳細æz。
使用 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
碎片進行垓æ¸C
如果想n為一 datagram socket 接收的所有 ICMP 包,那麼最好 在那 socket
上使用 IP_RECVERR。詳見: ip (7).
raw socket èƒ½ç«Šè½æ‰€æœ‰çš„ IP å”è°, å³ä½¿åƒ ICMP 或 TCP
é€™æ¨£åœ¨æ ¸å¿ƒä¸æœ‰å”è°æ¨¡å¡Šçš„也ä¸ä¾‹å¤–。這時唹]æœƒåŒæ™‚傳é€åˆ° æ ¸å¿ƒæ¨¡å¡Šå’Œraw
socket. 一茈iç§»æ¤çš„程å¼ä¸èƒ½ä¾è³´é€™è…S性, 許多其他 BSD socket
實ç¾åœ¨é€™æ–¹æƒ˜é‡¦ç¿©D
Linux å¾žä¸æ”¹è®Šä½¿ç”¨è€…傳輸的包 (é™¤äº†å‰ æŽ¢ã„—é´˜ IP_HDRINCL
,填入一些0å—æ®µ).這與其他 raw socket å¯¦ç¾æ–¹å¼æ˜¯ä¸åŒçš„.
RAW socket 通常很難移æ¤. socket 傳輸時使用 sin_port ä¸è¨ç½®çš„ å”è°ï¼Œä½†
Linux2.2 下ä¸è¡Œäº†ï¼Œè§£æ±ºè¾¦æ³•是使用 IP_HDRINCL.
éŒæ¬èª~è™Bçz
åªæœ‰é€£æŽ¥äº† 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 è£æƒ˜é‡§M BSD è£ç›¸å®¹çš„ raw
socket 代碼錯誤, 在 2.2 è£å·²ç¶“袑氻F.
BUGS
沒有æz逿˜Žä»£ç†æ“´å±•.
ç•¶è¨ç½® IP_HDRINCL é¸é …後datagramsï¼ˆè‡ªå°‹å€æ•¸æ“šåŒ…ï¼‰ä¸æœƒè¢«åˆ†æ®µ ä¸¦å— MTU
制. 這是 Linux 2.2 的制.
在 Linux 2.2 sin_port ä¸è¨ç½®çš„ IP å”è°æœƒä¸Ÿå¤±ã€‚使用的是ç¶å®šäº† socket
çš„å”è°ï¼Œæˆ–在 socket (2)åˆå§‹åŒ–èª¿ç”¨ä¸æŒ‡å®šçš„å”è°ã€‚
ä½@者
Andi Kleen.
åt見
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
ã€mä¸ä»åœç˜linuxan:
http://cmpp.linuxforum.net