Linux——原始套接字

 

缅怀Stevens大师。

本文只是,对UNPv1前几节的转载!!!并非原创!!!!!要想真的学会raw socket 把UNPv1 28章的3个程序从头到尾好好看看一下!!

最好的参考资料:

1.师从互联网。

2.Linux man 命令:man  7 raw。

3.UNP v1第28章 。

4.http://www.cublog.cn/u2/62281/showart_1096746.html

http://linux.chinaitlab.com/c/389513.html

 

第一条:概述

使用原始套接字(raw socket)可以发送和接收到主机网卡上的数据帧或者数据包,简而言之,可以编写基于IP协议的程序。

man中指出:Raw  sockets 允许用户创建新的IPv4协议。原始套接口收发的原始数据报(raw  datagram)不包括链路层的头部。 

UNPV1中:原始套接口提供了普通TCP和UDP socket不能提供的3个能力如下:

1.进程使用raw socket 可以读写ICMPv4、IGMPv4、ICMPv6等分组。这个能力还使得使用ICMP或IGMP构造的应用程序能够完全作为用户进程处理,而不必往内核中添加额外代码。从下一条可以看出内核中是包括ICMP和IGMP协议的处理代码的。

 

2.大多数内核只处理IPv4数据报中一个名为协议的8位字段的值为1(ICMP)、2(IGMP)、6(TCP)、17(UDP)四种情况。然而该字段的值还有许多其他值。进程使用raw socket 就可以读写那些内核不处理的IPv4数据报了。

3.通过使用raw socket ,进程可以使用IP_HDRINCL套接口选项自行构造IPv4头部。这个能力可用于构造TCP或UDP分组等。//Head is include with data。

本文中只涉及数据报相关的内容,至于以太网帧,留待下一篇文章

第二条:创建Raw socket

1.只有root用户才能创建raw socket,以防止普通用户向Internet输入他们自行构造的IP数据报。

int sockfd=socket(AF_INET,SOCK_RAW,protocol);

protocol参数其值如下:定义在netinet/in.h

如果指定protocol为0时,原始套接字可以接收内核传递给原始套接字的任何IP数据包

    IPPROTO_IP = 0,   /* Dummy protocol for TCP.  *///这个协议的Dummy的意思是系统什么也不做。

 

    IPPROTO_HOPOPTS = 0,   /* IPv6 Hop-by-Hop options.  */

    IPPROTO_ICMP = 1,   /* Internet Control Message Protocol.  */

    IPPROTO_IGMP = 2,   /* Internet Group Managem

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值