什么是套接字编程中的RAW套接字

kar*_*kar 22 sockets linux

当我通过套接字编程时,我无法清楚地理解RAW_SOCKET.

我的理解是

如果我打开一个带有此选项AF_INET的套接字,RAW_SOCKET意味着我可以在AF_INET标头之前创建我现在的标头,但最后数据是以AF_INET协议的格式发送的.我的理解是否正确.如果有错,可以解释一下.

谢谢

SuB*_*SuB 49

在每一层中,数据包都有两个不相交的部分:Header,Payload

非Raw套接字意味着您只需确定传输层有效负载即可.即,创建传输,网络和数据链路层标头是OS任务.

原始套接字意味着您可以确定数据包的每个部分,包括标头或有效负载.请注意,原始套接字是一般词.我将原始套接字分类为:网络套接字和数据链接套接字(或者替代L3套接字和L2套接字)

在L3 Socket中,您可以确定网络层中数据包的标头和有效负载.例如,如果网络层协议是IPv4,则可以确定IPv4标头和有效负载.因此,您可以设置传输层标头/有效负载,ICMP标头/有效负载,路由协议标头/有效负载.

在L2 Socket中,您可以在数据链路层中设置数据包的头和有效负载,即数据包中的所有内容.因此,您可以使用L3 Socket完成所有操作,并确定ARP报头/有效负载,PPP报头/有效负载,PPPOE报头/有效负载,....

现在编程:

  • socket(AF_INET,RAW_SOCKET,...)表示L3套接字,网络层协议= IPv4
  • socket(AF_IPX,RAW_SOCKET,...)表示L3套接字,网络层协议= IPX
  • socket(AF_INET6,RAW_SOCKET,...)表示L3套接字,网络层协议= IPv6
  • socket(AF_PACKET,RAW_SOCKET,...)表示L2套接字,数据链路层协议=以太网

第三参数指定有效载荷协议


KBa*_*art 15

RAW_SOCKET允许用户在互联网(IP)级别上实现自己的传输层协议.您负责创建和解析传输级别标头及其背后的逻辑.数据包看起来像:

-------------------------------------------------------------------
| Ethernet (typically) header | IP header | Your header | payload |
-------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

编辑:有原始套接字上很好的说明Linux手册页,或者在这里,如果你使用的是Windows.


For*_*med 6

您还可以将 SOCK_RAW 与“数据包套接字”一起使用,这将允许您完全控制 L2(以太网)和 L3(IP)层。这意味着您可以完全自定义渲染来自 NIC 的数据包。

详细信息在这里:

http://www.kernel.org/doc/man-pages/online/pages/man7/packet.7.html

http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/