计算机网络课程设计 基于ICMPTCP的网段端口扫描 C语言编写(3)

2019-06-11 10:53

ronnie

现在分别介绍各个字段的具体含义。(1)源端口和目的端口 各占两个字节。端口是运输层与应用层的服务。(2)序号 占4个字节。TCP把传送的数据流中的每一个字节都编上一个序号。(3)确认号 占4个字节。是指期望对方的下一个报文段的数据的第一个字节的序号。(5)数据偏移 占4位。它指出TCP报文段的数据起始处距离TCP报文段的起始距离有多远。(6)保留。(7)紧急比特URG 当URG=1时,表明紧急指针字段有效。告诉系统有紧急数据,应尽快发送。(8)确认比特ACK 只有当ACK=1时确认号字段才有效。(9)推送比特PSH 将数据流尽快的推送给应用进程。而不是等到缓冲区满后才将数据送至应用程序。(10)复位比特RST 当RST=1时,表明TCP出现错误,必须释放连接,然后重新建立运输连接。复位比特还用来拒绝一个非法报文或拒绝打开一个连接。(11)同步比特SYN 当SYN=1而ACK=0是表明这是一个请求连接报文,若同意连接则

11

ronnie

对方应该回送SYN=1,ACK=1。(12)终止比特 FIN。用于释放一个连接。(13)检验和 占2个字节。

设客户进程运行在本地计算机上。它首先向其TCP发出主动打开(active open)命令,表明要与某个IP地址的某个端口建立运输连接。 首先发送SYN=1,SEQ=X的报文给目标主机的某端口,当本地计算机收到SYN=1,ACK=1的报文时,表明对方主机同意连接,这是还需发送一个ACK以确认连接。这样,经过三次握手,一条TCP连接链路就建立完成。

在Winsock2环境下,系统类库提供了connect()接口函数。一下是函数原型:

connect function

int connect( _In_ SOCKET s,

_In_ const struct sockaddr *name, _In_ int namelen );

s表示一个为连接的socket,name表示一个指向sockaddr的结构

体指针,namelen是sockaddr中name域的比特长度。利用此函数,可以非常方便的连接一个套接字。 4.1.2 ICMP网段扫描的原理

因特网控制报文协议ICMP(Internet Control Message Protocol)【RFC792】。ICMP允许主机或路由器报告差错情况和提供有关异常情

12

ronnie

况的报告。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据发送出去。ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。ICMP报文的前4个字节是统一格式,共有三个字段:类型,代码和检验和。对网段的主机扫描就是利用了这三个字段。根据主机发回的不同类型和代码对主机的状态进行判断。 ICMP的差错报文共有5种:

(1)终点不可达 终点不可达分为:网络不可达,主机不可达,协议不可达,端口不可达。

(2)源站抑制 当路由器或主机由于拥塞而丢弃数据包时,就向源站发生源站抑制报文。

(3)时间超时 当路由器手打生存时间为零的数据包时,除丢弃该数据报外,还向源站发送时间超过报文。 (4)参数问题

(5)改变路由(重定向)

对一个网段扫描时,主要利用(1)和(3)两种报文。 ICMP的询问报文主要有4种: (1)回送请求和回答(Ping)

(2)时间戳和回答(常用来记录一个主机到另一个主机的延迟) (3)掩码请求和回答 (4)路由询问和回答

同样,主要利用(1)和(2)两种报文。

Winsock2提供sendto()和recvfrom()两个函数分别来发送IP层数

13

ronnie

据报。函数原型分别为:

sendto function

int sendto(

_In_ SOCKET s, _In_ const char *buf, _In_ int len, _In_ int flags,

_In_ const struct sockaddr *to, _In_ int tolen );

recvfrom function

int recvfrom(

_In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags,

_Out_ struct sockaddr *from, _Inout_opt_ int *fromlen );

结合原始套接字可以很方便做到将一个ICMP数据包封装到IP数据包中,以及从一个IP数据报中解析出包含ICMP报文。下面对原

14

ronnie

始套接字做下简单的介绍。

原始套接字提供普通的TCP和UDP套接字所不提供的一下3个功能。

? 有了原始套接字,进程可以读写ICMP和IGMP等分组。举例来说ping程序就是使用原始套接字收发ICMP分组,网段扫描也是基于这个原理。

? 有了原始套接字,进程可以读写内核不处理其协议字段的IPv4数据包。

? 有了原始套接字,进程还可以使用IP_HDRINCL套接字选项自行构造IPv4首部。这一点是非常强大的。

在利用Winsock编写原始套接字时要注意程序应该取得管理员权限,因为大多数操作系统对原始套接字的创建有较为严格的限制。如果没有取得管理员权限,那么在创建原始套接字的时候会报出10013--Permission denied.的错误,从而无法创建套接字。 4.2 函数实现

4.2.1 初始化winsock动态链接库

void InitializeWinsock()

{ int status; WSADATA wsa; if (status=WSAStartup(MAKEWORD(2,2),&wsa)!=0) { printf(\ exit(EXIT_FAILURE); } }

函数调用Winsock2提供的WSAStartup()函数,初始化动态链接库。

15


计算机网络课程设计 基于ICMPTCP的网段端口扫描 C语言编写(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:XX医院医疗制度汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: