1.原始套接字是允许访问底层传输协议的一种套接字类型,提供了普通套接字所不具备的功能,能够对网络数据包进行某种程度的控制操作
因此原始套接字通常用于开发简单网络性能监视程序以及网络探测、网络攻击
2.从用户的角度看,在TCP/IP协议簇中,流式套接字和数据报套接字这两类套接字分别对应于传输层的TCP和UDP协议,几乎所有的应用数据传输都可以用这两类套接字实现
3.Barkeley套接字将流式套接字和数据报套接字定义为标准套接字,用于在主机之间通过TCP和UDP来传输数据
4.为了保证Internet的使用效率,除了传输数据之外,操作系统的协议栈还处理了大量的非数据流量,如果程序员在创建应用时也需要对这些非数据流量进行控制,那么需要原始套接字,这种套接字越过了TCP/IP协议栈的部分层次,为程序员提供了完全且直接的数据包级的Internet访问能力
5.对于使用普通流式套接字和数据报套接字的应用程序,它们只能控制数据包的数据部分,也就是除了传输层首部和网络层首部以外的,需要通过网络传输的数据部分
而传输层首部和网络层首部则由协议栈根据创建套接字时指定的参数负责填充
6.通过原始套接字可以控制传输层的首部,也可以控制网络层的首部,这给程序员提供了很大的灵活性
原始套接字为网络程序提供的这种灵活性给网络安全带来了一定的安全隐患
7.具体而言,原始套接字提供普通TCP和UDP套接字不提供的以下三种能力
①发送和接收ICMPv4、IGMPv4和ICMPv6等分组。原始套接字能够处理在IP头中预定义的网络层上的协议分组,如ICMP、IGMP等
举例来说,ping程序使用原始套接字发送ICMP回射请求并接受ICMP回射应答。多播路由守护程序也使用原始套接字发送和接收IGMPv4分组
②发送和接受内核不处理其协议字段的IPv4数据包。对于8位IPv4协议字段,大多数内核仅仅处理该字段值为1(ICMP协议)、2(IGMP协议)、6(TCP协议)、17(UDP协议)的数据报
举例来说,OSPF路由协议既不使用TCP也不使用UDP,而是直接通过IP协议承载,协议类型为89
如果想在一个没有安装OSPF路由协议的系统上处理OSPF数据报文,那么实现OSPF的程序必须使用原始套接字读写这些IP数据包,因为内核不知道如何处理协议字段为89的IPv4数据包,这个能力还延续到IPv6
③控制IPv4首部。使用原始套接字不仅能够直接处理IP协议承载的协议分组,而且能够直接控制IP首部,通过设置IP_HDRINCL套接字选项可以控制IPv4首部字段的自行构造,我们可以利用该选项构造特殊的IP首部以达到某些探测和访问需求
8.尽管原始套接字的功能强大,可以构造TCP和UDP的协议数据完成数据传输,但是这种套接字类型也并不是在所有的情况下都适用
在网络层上,原始套接字基于不可靠的IP分组传输服务,与数据报套接字类似,这种服务的特点是无连接、不可靠
无连接的特点决定了原始套接字的传输非常灵活,具有资源消耗小、处理速度快的优点
不可靠的特点意味着在网络质量不好的环境下,数据包丢失会比较严重
9.结合原始套接字的开发层次和能力,原始套接字适合于在以下场合选择使用:
①特殊用途的探测应用。原始套接字提供了直接访问硬件通信的相关能力,其工作层次决定了此类套接字具有灵活的数据构造能力,应用程序可以利用原始套接字操控TCP/IP数据包的结构和内容,实现面向特殊用途的探测和扫描
原始套接字适用于要求数据包构造灵活高的应用
②基于数据包捕获的应用
对于从事协议分析或网络管理的人来说,各种入侵检测、流量监控以及协议分析软件是必备的工具,这些软件都具有数据包捕获和分析的功能
原始套接字能够操控网卡进入混在模式的工作状态,从而达到捕获流经网卡的所有数据包的目的
使用原始套接字可以满足数据包捕获和分析的应用需求
③特殊用途的传输应用
原始套接字能够处理内核不认识的协议数据,对于一些特殊应用,我们希望不增加内核功能,而是完全在用户层面完成对某类特殊协议的支持,原始套接字能够帮助应用数据在构造过程中修改IP首部协议字段值,并接受处理这些内核不认识的协议数据,从而完成了协议功能在用户层面的扩展
原始套接字的灵活性决定了这种编程方法受到了许多黑客和网络管理人员的欢迎,但是由于涉及复杂的控制字段构造和解释工作,使用这种套接字类型完成网络通信并不容易,需要程序设计者对TCP/IP协议有深入的理解,同时具备深厚的网络程序设计经验
10.使用原始套接字编写的程序往往面向特定应用,侧重于网络数据的构造与发送或者捕获与分析
使用原始套接字传送数据与使用数据报套接字的过程类似,不需要建立连接,而是在网络层上直接根据目的地构造IP分组进行数据传送
11.基于原始套接字的数据发送过程:
在通信过程中,数据发送方根据协议要求,将要发送的数据填充进发送缓冲区,同时给发送数据附加上必要的协议首部,全部填写好后,将数据发送出去
①Windows Sockets DLL初始化,协商版本号。在数据发送前,应用程序需要首先进行Windows Sockets DLL初始化,并创建好原始套接字,为网络通信分配必要的资源
②创建套接字,指定使用原始套接字进行通信,根据需要设置IP控制选项。根据应用的不同,原始套接字有两种选择:仅构造IP数据或构造IP首部和IP数据
③指定目的地址和通信端口
④填充首部和数据
⑤发送数据
⑥关闭套接字
⑦结束对Windows Sockets DLL的使用,释放资源
12.基于原始套接字的数据接收过程:
在通信过程中,数据接收放设定好接收条件后,从网络中接收到与预设条件相匹配的网络数据,如果出现了噪声,对数据进行过滤
①Windows Sockets DLL初始化,协商版本号。在数据发送前,应用程序需要首先进行Windows Sockets DLL初始化,并创建好原始套接字,为网络通信分配必要的资源
②创建套接字,指定使用原始套接字进行通信,并声明特定的协议类型
③根据需要设定接收选项
④接收数据
⑤过滤数据
⑥关闭套接字
⑦结束对Windows Sockets DLL的使用,释放资源
网络接口提交给原始套接字的数据并不一定是网卡接收到的所有数据,如果希望得到特定类型的数据包,在步骤3,应用程序可能需要对套接字的接受进行控制,设定接受选项
由于原始套接字的传输也是无连接的,网络接口提交给原始套接字的数据很可能存在噪声,因此在接收到数据后,需要对数据进行一定条件的过滤
综上所述:在使用原始套接字进数据传输的编程过程中,增加了很多操作,如套接字选项的设置、传输协议首部的构造、网卡工作模式的设定以及接收数据的过滤与判断等,这些操作要求程序设计人员在原始套接字的创建、接收与发送过程中充分理解其操作技巧和数据形态
|