一个完整的socket连接则用一个相关描述: (协议,本地地址,本地端口,远地地址,远地端口)
每一个socket有一个本地唯一的socket号,由操作系统分配。
最重要的是,socket是面向客户——服务器模型而设计出来的,针对客户和服务器程序提供不同的socket系统调用。客户随机申请一个socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号,服务器拥有全局公认的socket(在LINUX中,/etc/services用于存储全局公认的socket号),任何客户都可以向它发出连接请求和信息请求。
下面我们一一给出重要的socket系统调用。
函数socket()可以创建一个socket对象,socket()函数的原型如下:
SOCKET socket(int af, int type, int protocol);
创建一个socket实际上是向系统申请一个属于自己的socket号。
af(Address Family)俗称套接字地址族,如表1所示。
表1 Linux支持的套接字地址族
套接字地址族 描述
UNIX UNIX域套接字
INET 通过TCP/IP协议支持的Internet地址族
AX25 Amater radio X25
IPX Novell IPX
APPLETALK AppleTalk DDP
X25 X25
协议族、socket类型和协议常用的组合如表2所示:
表2 系统调用三参数组合关系
协议族(af) Socket类型(type) 协议(UNIX表示) 实际协议
AF_INET Sock_DGRAM IPPROC_UDP UDP
Sock STREAM IPPROC_TCP TCP
Sock RAM IPPROC_ICMP ICMP
Sock RAM IPPROC_RAM 某低级协议
指定本地地址使用函数bind()一一绑定
socket()系统调用创建socket时,只指定了相关五元组的协议元,没有指定其余四元(本地地址、本地端口、远地地址、远地端口),因此需要别的系统调用加以补充。
bind()将本地socket地址(包括本地主机地址和本地端口)与所创建的socket号联系起来,即将本地socket地址赋予socket,以指定本地半相关。其用于Linux性能评估的测试工具的设计与实现调用格式为: bind(sockid, localaddr, addrlen)
总的来说,各种socket地址数据结构包括两大部分:地址类型和协议地址。网络协议地址又包括主机地址和端口号。
监听— listen()
对于服务器来说,在它接受客户机的连接之前,首先要监听。只有进入了监听模式,才能接受来自客户机的连接。这一点可以通过listen()函数来实现,它的原型如下:
int listen(SOCKET s, int backlog);
各参数意义如下:
s:进行监听的套接字。
Backlog:正在等待连接的最大队列的长度。如果backlog的只为3,有4个客户机同时发出连接请求,则前3个会放在等待连接队列中,最后一个将被忽略。
如果函数成功,则返回0;否则返回SOCKET_ERROR。
当客户机和服务器的连接建立起来后,用函数send()和recv()来进行数据传输。
4基于原始套接字的设计与实现
4.1原始套接字简介
原始套接字是网络的基本构件。套接字是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行了新的扩充。这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制。套接字由两部分组成:开发组件和运行组件。开发组件是指套接字实现文档、应用程序接口(API)引入库和一些头文件。运行组件是指套接字应用程序接口的动态链接库(WINSOCK.DLL)。它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连听进程。套接字存在通信区域(通信区域又称地址簇)中。套接字只与同一区域套接字只支持一个中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。WINDOWS 中的域——网际域。套接字具有类型,WINDOWS SOCKET 2.1 版本支持两种套接字:流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。本文使用的WINDOWS SOCKET 2.1 版本。
4.2数据包截获技术需求分析
数据包截获技术是开发网络管理工具软件的重要基础之一,因为许多故障及入侵判断都是建立在网络流量或数据的分析基础上的。具体来说,数据包截获可以应用在检测网络流量,分析网络故障;网络协议工作原理及过程分析;非法数据截获与入侵检测;网络设备开发。
程序可以设置针对IP地址和协议类别包过滤器,专门截获某一协议(如TCP,UDP,ICMP)或某一主机的数据包。对数据进一步分析可以了解该类协议的各种过程及协议内容,这在计算机网络课程的教学对网络知识的掌握。另外,也可以对数据包的内容进行分析与理解,获得所需的信息。
入侵检测是网络安全领域一个重要的研究方向,如请检测系统由探测器、分析器、用户接口等三个部分组成,其中探测器负责采集数据(如网络数据报、日志文件和系统调用记录等);分析器则主要是设定一系列规则,对探测器送来的数据进行分析,用户接口负责与用户交互。显然,数据包截获是入侵检测系统信息的重要来源之一。
4.3数据包截获程序设计流程图
利用套接字开发数据包截获程序时的一般步骤如图7所示
如图7所示,在利用套接字开发数据包截获程序时的一般步骤是:首先,创建原始套接字,其次将原始套接字绑定到本地网卡地址上;设置网卡为混杂模式,这样网卡就