Linux--原始套接字

Linux原始套接字实现分析 图中TCP、UDP和ICMP协议的接收处理函数分别为tcp_v4_rcv()、udp_rcv()和icmp_rcv()。对于IP报文,在协议栈的ip_local_deliver_finish()函数中会匹配是否有注册的网络层原始套接字,若匹配上就通过skb_clone()克隆报文并交给相应的原始套接字来处理。对于IP报文,在协议栈的ip_local_deliver_finish()函数中会匹配是否有注册的网络层原始套接字,若匹配上就通过skb_clone()克隆报文并交给相应的原始套接字来处理。 阅读详情

         原始套接字可以用来自行组装IP数据包,然后将数据包发送到其他终端。必须在管理员权限下才能使用原始套接字。(总结自《UNIX网络编程 卷1:套接字联网API》)

         (1)原始套接字的创建

         int sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_xxx);后面的xxx可以是ICMP,UDP,TCP等。

         可以在这个套接字上调用bind函数,但是比较少见。bind函数仅仅设置本地地址,因为原始套接字不存在端口的概念。就输出而言,调用bind设置的是将用于从这个原始套接字发送的所有数据报源IP地址。如果不调用bind,内核就把源IP地址设置为外出接口的主IP地址。

        (2)原始套接字的输出

                如果IP_HDRINCL套接字选项未开启,那么由进程让内核发送的数据的起始位置指的是IP首部之后的第一个字节,因为内核将构造IP首部并把它置于来自进程的数据之前。内核把所有构造IPv4首部的协议字段设置成来之sock调用的第三个参数。

               如果IP_HDRINCL套接字选项已开启,那么由进程让内核发送的数据的起始位置指的是IP首部的第一个字节。进程调用输出函数写出的数据量必须包括IP首部的大小。整个IP首部都是由进程构造,不过IP的标识字段可以设置为0,从而告知内核设置该值IPv4首部校验和字段总是由内核计算并存储,IPv4的选项字段是可选的。

             内核会对超出外出接口MTU的原始分组进行分片。

              开启IP_HDRINCL的代码是

             const int on =1;

             if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)

             错误处理;

       (3)原始套接字的输入

             首先要考虑内核将哪些接收到的IP数据报传递到原始套接字?这要遵循下面的规则

            a:接收到的UDP或者TCP分组绝不传递到任何原始套接字,如果一个进程想要读取含有UDP分组或TCP分组的IP数据报,它就必须在数据链路层读取这些分组。

            b:大多数ICMP分组在内核处理完其中的ICMP消息后传递到原始套接字。IGMP亦是如此。

            c:内核把不认识其协议字段的所有IP数据报传递给原始套接字。内核把这些分组执行的唯一处理是针对某些IP首部字段的最小验证:IP版本,IPv4校验和,首部长度,以及目的地址。

            d:如果某个数据报以片段的形式到达,那么在它的所有片段均到达且重组出该数据报之前,不传递任何片段分组给原始套接字。

            当内核有一个需要传递到原始套接字的数据报时,它将检查所有进程上的所有原始套接字,以寻找所有匹配的套接字。每个匹配的套接字将被传递送以该IP数据报的一个副本。内核对每个原始套接字均执行以下3个测试,只有这三个测试均为真,内核才把接收到的数据报发送给这个套接字。

           a:如果创建这个原始套接字时指定了非0的协议参数(socket的第三个参数),那么接收到的数据报协议字段必须匹配该值。

           b:如果这个套接字已由bind调用绑定了某个IP地址,那么接收到的数据报的目的地址必须匹配这个绑定地址。

           c:若该套接字调用了connect,那么接收到的数据报的源地址必须匹配这个已连接地址。 

          注意,如果一个原始套接字是以0值协议参数传递的,并且没有调用bind,connect,那么该套接字将接收可由内核传递到原始套接字的每个原始数据报的一个副本。

而且无论何时往一个原始IPv4套接字上递送一个IP数据报,传递到该套接字所在进程的都是包括IP首部在内的完整数据报,然后对于IPv6原始套接字,传递套接字的只是扣除了IPv6首部和所有扩展首部的payload。


linux 原始套接字 绑定网卡,Linux原始套接字实现分析 之所以要转这篇文章,是因为这篇文章是我看到的同类博客中写得最好的,但非常可惜,这篇博客中只有一篇文章,没有什么收藏价值,故将其原文转载,以供今后学习查阅。本文从IPV4协议栈原始套接字的分类入手,详细介绍了链路层和网络层原始套接字的特点及其内核实现细节。并结合原始套接字的实际应用,说明各类型原始套接字的适应范围,以及在实际使用时需要注意的问题。一、原始套接字概述协议栈的原始套接字从实现上可以分为“... 阅读详情

相关推荐

Linux——原始套接字

缅怀Stevens大师。最好的参考资料:1.师从互联网。2.Linux man 命令:man  7 raw。3.UNP v1第28章 。4.http://www.cublog.cn/u2/62281/showart_1096746.htmlhttp://linux.chinaitlab.com/c/389513.html 第一条:概述使用原始套接字(raw socket)可以发送和接收到主机网卡上的数据帧或者数据包,简而言之,可以编写基于IP协议的程序。man中指出:Raw  sockets 允许用户创建新

I am firo,I am here for you. 3310

[Linux]-原始套接字

原始套接字指的是在传输层下面使用的套接字,之前使用的流式套接字和数据报套接字是工作在传输层的,并且在接受和发送的时候只能对数据部分进行操作,如果想要自己组建一个报文,那么就需要使用原始套接字。并且原始套接字还可以监听所有经过本机网卡的数据帧或者数据包。

levi的博客 2039

linux 原始套接字实现分析

目录 1 原始套接字概述 1.1链路层原始套接字 1.2网络层原始套接字 1.2.1 接收报文 1.2.2 发送报文 2 原始套接字实现 2.1原始套接字报文收发流程 2.2链路层原始套接字的实现 2.2.1套接字创建 2.2.2报文接收 2.2.3报文发送 2.2.4 小结 2.3网络层原始套接字的实现 2.3.1套接字创建 2.3.2报文接收 2.3.3报文发送 2.3.4 小结 3 应用及注意事项 3.1 使用链路层原始套...

2941

Linux网络编程:10. 原始套接字

导读:   我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM、SOCK_DRAGM)。在这一章里面,我们一起来学习另外一种套接字——原始套接字(SOCK_RAW)。应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能。注意原始套接字只能够由有root权限的人创建。   10.1 原始套接字的创建   int sockfd(AF_INET, SOCK_RAW

yingfox的专栏 621

Linux网络编程- 原始套接字(Raw Socket

原始套接字(Raw Socket)提供了一种机制,允许应用程序直接访问底层传输协议,绕过操作系统提供的传输层接口。这种套接字通常用于实现新的协议或对现有协议进行低级别的操作。以下是对原始套接字的详细介绍:定义与用途:创建:特权:工作方式:用途与限制:注意事项:跨平台的差异:总的来说,原始套接字是一个非常强大的工具,但也需要谨慎使用。正确使用它需要对网络协议有深入的理解,而滥用它可能导致网络问题或被视为恶意活动。创建链路层的原始套接字允许我们直接与链路层设备(例如以太网适配器)交互,从而可以发送和接收链路层帧

青衫客36的博客 7432

linux原始套接字实战

本文的主线是一个使用原始套接字发送数据的程序,工作在数据链路层,采用自定义以太网帧协议,靠MAC地址识别目标主机。所以不涉及到IP地址和端口号。程序主要用于互联的两台机器之间进行丢帧率计算。以下部分都是围绕它而展开说明的。内容分为以下几部分: 原始套接字概述 原始套接字的创建 自定义协议 发送端程序流程、实现 接收端程序的开发 一、原始套接字概述 先来看看socket函数原型: ...

牛仔的blog 3964

linux内核原始套接字,Linux网络编程--原始套接字

Linux网络编程--原始套接字(2008-05-14 13:52:53)标签:杂谈原始套接字我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM,SOCK_DRAGM).在这一章里面我们一起来学习另外一种套接字--原始套接字(SOCK_RAW).应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能.注意原始套接字只能够由有root权限的人创建.原始套接字的创建int...

weixin_39973009的博客 303

Linux原始套接字学习总结

 Linux网络编程原始套接字的魔力【上】 http://blog.chinaunix.net/uid-23069658-id-3280895.html 基于原始套接字编程        在开发面向连接的TCP和面向无连接的UD...

weixin_42017225的博客 650

Linux网络编程 深入Linux网络栈:原始套接字链路层实战解析

原始套接字、链路层编程、协议分析、MAC帧、IP报文、TCP/UDP解包、网络实战

2401_87244387的博客 1534

Linux网络编程》: 原始套接字编程

原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据。区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有的数据帧(数据包)。另外,必须在管理员权限下才能使用原始套接字。 1.原始套接字的创建 int socket ( int family, int type, int protocol );...

yexiangCSDN的专栏 434

Linux系统下C语言的原始套接字

指的是用C语言的原始套接字可以发送和接收底层的链路层、网络层的数据包。普通的TCP和UDP协议只能是操作数据包的负载数据部分(无法获取和设置头部)。原始套接字可以收发链路层MAC数据帧、IP数据包、ICMP数据包、ARP数据包、TCP和UDP数据包。(一)操作链路层和以上的协议可以操作MAC链路层、IP、ARP、RARP等协议的数据包。1、格式如下:int socket(PF_SOCKET, 类型, htons(协议))2、参数:1) PF_SOCKET常量是固定的。

2401_89847635的博客 385

Linux系统编程(37)—— socket编程原始套接字

原始套接字的特点 原始套接字(SOCK_RAW)可以用来自行组装IP数据包,然后将数据包发送到其他终端。也就是说原始套接字是基于IP数据包的编程(SOCK_PACKET是基于数据链路层的编程)。另外,必须在管理员权限下才能使用原始套接字。原始套接口提供了普通TCP和UDP socket不能提供的3个能力:1、进程使用raw socket 可以读写ICMP、IGMP等分组。这个能力还使得使用ICMP

尹成的技术博客 2883

linux原始套接字详解

一、原始套接字概述   协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类。本节主要描述各自的特点及其适用范围。 链路层原始套接字可以直接用于接收和发送链路层的MAC帧,在发送时需要由调用者自行构造和封装MAC首部。而网络层原始套接字可以直接用于接收和发送IP层的报文数据,在发送时需要自行构造IP报文头(取决是否设置IP_HDRINCL选项)。   1.1

sinat_27261621的博客 4687

linux网络编程--原始套接字

Linux网络编程--10. 原始套接字 --11. 后记 来源:http://linuxc.51.net 作者:hoyt (2001-05-08 11:26:09) 10. 原始套接字      我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM,SOCK_DRAGM).在这一章 里面我们一起来学习另外一种套接字--原始套接字(SOCK_RAW). 应用原始套

王世宏的专栏 390

Linux网络编程原始套接字的魔力【下】

原文链接:Linux网络编程原始套接字的魔力【下】 Linux网络编程原始套接字的魔力【下】 可以接收链路层MAC帧的原始套接字        前面我们介绍过了通过原始套接字socket(AF_INET, SOCK_RAW, protocol)我们可以直接实现自行构造整个IP报文,然后对其收发。提醒一点,在用这种方式构造原始IP报文时,第三个参数protocol不能用IPPROTO_IP,这样会让系统疑惑,不知道该用什么协议来伺候你了。  

jin787730090的博客 386

Linux网络编程》: 原始套接字介绍

通常情况下程序员接所接触到的套接字(Socket)为两类 (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用; (2)数据报式套接字(SOCK_DGRAM):一种无连接的 Socket,对应于无连接的 UDP 服务应用。 从用户的角度来看,SOCK_STREAM、SOCK_DGRAM 这两类套接字似乎的确涵盖了 TCP/IP 应用的...

yexiangCSDN的专栏 532

Linux网络编程-原始套接字

原始套接字是低级网络接口,允许程序绕过传输层(TCP/UDP),直接操作网络层(IP)甚至数据链路层(以太网);必须使用root/管理员权限运行(涉及底层网络操作,存在安全风险);原始套接字(SOCK_RAW)是底层网络接口,需root权限,可绕过传输层直接解析 / 构造网络包;网络包解析核心:按协议栈分层解析(以太网头 14 字节 → IP 头最小 20 字节 → TCP 头最小 20 字节);

weixin_74435488的博客 691
上一篇: Linux笔記(简单命令摘抄)
下一篇: 基于Mysql Connector(C++)的数据库连接池的实现
csc_csc_csc
博客等级 码龄15年 169粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值