第7讲 原始套接字
利用原始套接字构造并发送数据包的方法

利用原始套接字构造并发送数据包的方法摘要:一、原始套接字概述1.定义与作用2.分类与应用场景二、构造数据包1.数据包结构2.常用协议及其封装三、发送数据包1.发送原理2.发送方法与实例四、原始套接字的安全性1.安全风险2.防范措施五、实践与应用1.操作步骤与注意事项2.应用案例分享正文:一、原始套接字概述1.定义与作用原始套接字(Raw Socket)是一种允许用户直接操作网络底层协议的套接字类型。
它允许用户在操作系统层面上构造和发送数据包,而不受协议栈的限制。
原始套接字广泛应用于网络数据包捕获、分析、发送等领域,为开发者提供了极大的灵活性。
2.分类与应用场景原始套接字根据底层协议可分为以下几类:(1)ICMP原始套接字:主要用于处理ICMP协议,如ping命令。
(2)UDP原始套接字:用于无连接的UDP数据传输。
(3)TCP原始套接字:用于建立和维护连接的TCP协议。
(4)IP原始套接字:用于处理IP层数据包,如IPv4和IPv6。
二、构造数据包1.数据包结构网络数据包从下到上分为:链路层、网络层、传输层和应用层。
原始套接字直接操作网络层,因此需要了解各层的数据结构。
(1)链路层:以太网帧,包含目的MAC地址、源MAC地址、类型字段等。
(2)网络层:IP数据报,包含版本、首部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、头部校验和、源IP地址、目的IP地址等。
(3)传输层:TCP或UDP段,包含源端口、目的端口、序列号、确认号等。
(4)应用层:根据不同协议,如HTTP、DNS等,包含请求头、响应头、查询字符串等。
2.常用协议及其封装了解各层协议后,需要熟悉如何将这些协议封装到数据包中。
以下以IP协议和UDP协议为例:(1)IP协议封装:设置IP数据报的版本、首部长度、服务类型等,填充源IP地址、目的IP地址,计算头部校验和。
(2)UDP协议封装:设置UDP段的首部,包括源端口、目的端口、长度和校验和。
计算机网络课程原始套接字编程实验的实践探索

计算机网络课程原始套接字编程实验的实践探索摘要:简述计算机网络课程及实验体系的发展状况,指出原有实验模式的不足,改革实验体系并新增了部分原始套接字实验模块,以网络嗅探程序设计为例给出原始套接字程序设计实验的目的、要求和实现方法,分析总结了原始套接字实验的特色和优势。
关键词:网络实验;原始套接字;协议分析;综合设计作为计算机科学与技术、软件工程、网络工程等专业重要的学位课和考研课,计算机网络课程在我校开设已整整20年,先后历经多次课程和实验体系改革,在IT人才培养和专业建设方面发挥着重要作用。
1990年,计算机网络课程在我校计算机应用87级本科班正式开设;1996年,计算机网络课程从OSI开放式系统互连模型转向到TCP/IP协议体系;2001年,计算机网络课程实施双语教学并成为我校首批双语示范课程;2003年,Cisco网络技术引入网络课程教学;2004年,计算机网络课程被评为校优质课和首批校级精品课。
2004年以后,计算机网络实验课程主要采用Java套接字编程和思科网络配置管理相结合,在学生动手能力培养方面取得了积极效果。
然而,Java套接字技术只能进行应用层编程,路由配置管理则只关注网络互连设备的操作管理,这对于理解底层网络协议是不够的。
在此背景下,课程组对网络实验课程进行了改革,在原有实验环节中增加了原始套接字实验,将操作、验证、分析和设计结合起来,在提高动手能力的同时,加深了学生对于网络协议的理解和运用。
1计算机网络课程实验体系目前,我院网络课程体系包括了计算机网络原理、TCP/IP协议分析、网络安全、路由与交换、无线网络技术、网络编程以及网络管理等7门专业课程。
其中,计算机网络原理为必修课和研究生入学统考课,面向计算机科学与技术、通信工程、软件工程等专业开设,而不同专业的后续网络课程安排有所差异。
从有利于学生综合素质和创新能力的培养角度出发,课程组对计算机网络原理实验课程进行了调整,增加了两个原始套接字编程设计实验,将网络编程深入到底层协议,旨在强化学生深入理解网络协议和报文格式。
《原始套接字编程》课程设计报告

《原始套接字编程》课程设计报告姓名:***班级:9班学号:********《原始套接字编程》课程设计报告班级:11级9班学号:54110904 姓名:王延兴一、设计任务分析(一)实验环境操作系统:Windows编程工具及集成开发环境:VC++(二)实验目的和要求实验目的:掌握原始套接字编程。
实验要求:完成下列功能:(1)利用RAW SOCKET捕获网络数据包的程序模型SOCKET_STREAM 流式套接字SOCKET_DGRAMSOCKET_RAW 原始套接字IPPROTO_IP IP协议IPPROTO_ICMP INTERNET控制消息协议,配合原始套接字可以实现ping的功能IPPROTO_IGMP INTERNET 网关服务协议,在多播中用到在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。
SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW 则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。
RAW SOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。
(2)能够抓取第二节课的并发服务器程序的服务器端或客户端的应用层数据,即:时间值,打印输出。
二、设计方案同一台主机不同进程可以用进程号来唯一标识,但是在网络环境下进程号并不能唯一标识该进程。
TCP/IP主要引入了网络地址、端口和连接等概念来解决网络间进程标识问题。
套接字(Socket)是一个指向传输提供者的句柄,TCP/IP协议支持3种类型的套接字,分别是流式套接字、数据报式套接字和原始套接字。
流式套接字(SOCKET_STREAM)提供了面向连接、双向可靠的数据流传输服务。
数据报式套接字(SOCKET_ DGRAM)提供了无连接服务,不提供无错保证。
第7讲 传送——(4)原始套接字编程

原始套接字输入
使用原始套接字接收数据是在无连接的方 式下进行数据接收,原始套接字很可能接 收到很多非预期的数据报 考虑数据过滤能力
原始套接字输出
发送数据的目标
连接模式:在connect中指明 非连接模式:在sendto中指明
发送数据的内容
IP首部 UDP首部 UDP数据 IP_HDRINCL选项未开启 IP_HDRINCL选项开启
a)IPv4标志字段可置0,告知内核设置 b)IPv4头部校验和字段置0,总是由内核计算并存储 c)IPv4选项字段可选
原始套接字输出
发送数据——sendto
int sendto(SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen) Buf的内容:
1.原始套接字的能力
2.原始套接字编程模型
3.原始套接字创建、输入与输出
原始套接字创建——1)创建函数
SOCK_RAW
SOCKET socket( int af, int type, int protocol )
协议 IPPROTO_IP IPPROTO_ICMP IPPROTO_IGMP BTHPROTO_RFCOMM IPPROTO_IPV4 IPPROTO_TCP IPPROTO_UDP IPPROTO_ IPV6 IPPROTO_ ICMPV6 IPPROTO_ RAW 值 0 1 2 3 4 6 17 41 58 255 IP协议 ICMP协议 IGMP协议 蓝牙通信协议 IPv4协议 TCP协议 UDP协议 IPv6协议 ICMPv6协议 原始IP包 含义
增加了与原始套接字定义相关的协议首部,如IP头、 UDP头、TCP头、ICMP头等。
Windows网络编程复习重点

Windows⽹络编程复习重点⽬录第⼀章⽹络应⽤程序设计基础 (3)分布式⽹络应⽤程序的特点及分类 (3)⾯向应⽤的⽹络编程⽅法(3点) (3)基于TCP/IP的⽹络编程⽅法 (3)⾯向原始帧的⽹络编程⽅法(4种) (4)第⼆章⽹络程序通信模型 (4)常见的⽹络编程通信模型 (4)客户端、服务器的⼯作过程 (4)P2P模型的特点及其⽹络的拓扑结构 (5)第三章⽹络数据的内容与形态 (6)⽹络字节顺序与主机字节顺序 (6)⽹络字节顺序与主机字节顺序转换的函数 (6)⽹络数据传输形态 (6)字符编码 (7)数据校验 (7)第四章软件协议接⼝ (7)协议软件接⼝的位置与功能 (7)WinSock DLL的初始化与释放 (8)WinSock的地址描述 (9)套接字选项和IO控制命令 (9)处理WinSock的错误 (9)第五章流式套按字编程 (9)流式套接字通信的特点 (9)流式套接字的适⽤场景 (10)基本函数 (10)流式套接字编程的⼀般过程 (12)正确处理流数据的接收 (13)接收定长和变长数据 (13)流式套接字的编程实例 (13)第六章数据报套接字编程 (21)数据报套接字数据通信的特点 (21)数据报套接字的适⽤场景 (21)数据报套接字的编程的⼀般过程 (21)数据报套接字的常⽤函数 (22)数据报套接字的编程实例 (22)第七章原始套接字编程 (27)原始套接字的特点 (27)原始套接字的适⽤场景 (28)原始套按字的编程的⼀般过程 (28)原始套接字的编程实例 (28)第⼋章⽹络通信中的IO操作 (37)套接字的常见IO模式 (37)同步、异步、阻塞、⾮阻塞的概念及区别 (37)阻塞IO模型的⼯作原理与特点 (38)⾮阻塞IO模型的⼯作原理与特点 (38)IO复⽤模型的⼯作原理与特点(选择模型) (38)异步IO复⽤模型的⼯作原理与特点(WSAAsynsSelect) (38)完成端⼝模型的⼯作原理与特点(异步) (39)第九章WinPcap编程 (39)Wpcap.dll的⼯作流程 (39)Wpcap.dll的编程实例 (40)Packet.dll的⼯作流程 (45)Packet.dll编程实例 (45)第⼀章⽹络应⽤程序设计基础分布式⽹络应⽤程序的特点及分类1、特点:3点A)分布式⽹络应⽤程序将整个应⽤程序的处理分成⼏个部分,分别在不同的机器上运⾏,这⾥的“分布”包含两层含义:地理上的分布和数据处理的分布。
原始套接字tcp包构造

原始套接字tcp包构造想象一下,我们要给远方的小伙伴寄一个超级特别的包裹。
这个包裹就像是tcp 包。
那这个包裹怎么构造呢?我们先来说说包裹里最基本的东西。
就好像我们写信的时候,要有收信人的地址一样,tcp包里面得有目标的地址信息。
比如说,你要把你的小秘密分享给住在隔壁街的好朋友,那你得知道他家的地址才能把你的信送过去。
在tcp包里面,这个地址信息就像是告诉网络这个包裹要送到哪里去。
再说说包裹里的内容。
假如你要给朋友送一个自己画的小画,这个小画就是内容。
在tcp包里面,也有内容部分,这个内容可能是一些文字信息,或者是一些数据。
就像你在纸上写了“今天我看到一只超级可爱的小猫咪”,这就是包裹里的内容。
那这个包裹怎么包起来呢?它有一定的格式。
就像我们折纸盒子包东西的时候,有一定的折法。
tcp包也是这样,它有头部和数据部分。
头部就像是包裹外面写着地址、包裹类型之类信息的地方。
比如说,头部可能会写着这是一个紧急的包裹还是普通的包裹。
如果是紧急的包裹,那网络就会优先把它送到目的地。
我给大家讲个小故事吧。
有一天,小猴子想给小兔子送一个特别的果子。
小猴子把果子放在一个小盒子里,这个小盒子就像是tcp包。
小猴子在盒子上写了小兔子的家的地址,这就是地址信息。
然后小猴子还在盒子上画了一个小标记,表示这个果子是刚摘下来的很新鲜,这就像是tcp包里面的一些特殊标记。
小猴子把盒子包好后,就交给森林邮递员小鸟。
小鸟就根据盒子上的地址把果子送到小兔子家了。
在构造tcp包的时候,还有一些小细节。
比如说,要有一个顺序号。
这个顺序号就像是我们给故事书的每一页标上页码一样。
这样接收的一方就能按照顺序把内容整理好。
就像你把画的好多小画按顺序寄给朋友,朋友就能按照你标的顺序一张一张看,知道这个故事是怎么发展的。
还有一个确认号呢。
这就像是你的朋友收到你的包裹后,给你回了一个小纸条说“我收到包裹啦”。
这个确认号就是告诉发送方,这个包裹已经安全到达啦。
套接字所用的类型
题目:套接字所用的类型摘要:本文探讨了在网络编程中使用的套接字类型,重点介绍了流套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)三种类型。
文章解释了每种类型的套接字如何工作以及它们在网络通信中的优缺点。
一、引言套接字(Socket)是计算机网络编程中的重要概念,它们被用来实现网络通信的不同层和模型中的数据交互和收发。
套接字类型决定了数据在网络中的传输方式,不同的套接字类型适用于不同的应用场景。
本文将深入探讨网络编程中常见的套接字类型以及它们的适用范围和特点。
二、流套接字(SOCK_STREAM)流套接字是一种面向连接的套接字类型,通常用于TCP协议。
它提供了一种可靠的、双向的、基于字节流的通信方式。
流套接字确保数据的按序交付和错误控制。
因此,它是实现基于TCP的应用层协议(如HTTP、SMTP等)的理想选择。
优点:1. 可靠的数据传输:通过确认机制、重传丢失的数据包和流量控制来确保数据的可靠传输。
2. 按序交付:确保数据包的顺序与发送时的顺序一致。
3. 错误控制:检测并处理数据传输过程中的错误。
缺点:1. 较高的开销:为确保可靠传输,TCP协议需要维护连接状态,这可能导致较高的开销。
2. 可能产生拥塞:在网络拥堵的情况下,流套接字的性能可能受到影响。
三、数据报套接字(SOCK_DGRAM)数据报套接字是一种无连接的套接字类型,通常用于UDP协议。
它提供了一种不可靠的、无连接的通信方式,适用于对实时性要求较高或能容忍数据丢失的应用场景。
数据报套接字以独立的数据包形式发送数据,不保证数据的按序交付或可靠性。
优点:1. 低开销:UDP协议开销小,适合于传输较少数据的场景。
2. 实时性:无需建立连接,传输延迟低,适合于实时应用场景如语音通话或视频流。
3. 灵活性:允许发送不同大小的数据包,且数据包独立传输。
缺点:1. 不可靠的数据传输:不保证数据包的可靠传输,可能会丢失或重复接收数据包。
原始套接字(Raw Socket)解析
2. socket(PF_PACKET, SOCK_RAW, htons(x));
这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧.从上面看就是20+20+8+100.最后一个以太网crc从来都不算进来的,因为内核已经判断过了,对程序来说没有任何意义了.
==SOCKET_ERROR)
{
printf("setsockopt IP_HDRINCL error!\n");
return false;
}
nTimeOver = 1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*) &nTimeOver, sizeof
tcpHeader.th_sport = htons(SOURCE_PORT); //源端口号
tcpHeader.th_seq = htonl(0x12345678);
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader) / 4 << 4 | 0);
3. socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL)),这个一般用于抓包程序。
总结使用方法:
1.只想收到发往本机某种协议的ip数据包的话用第一种就足够了
2. 更多的详细的内容请使用第二种.包括ETH_P_ALL参数和混杂模式都可以使它的能力不断的加强.
理解一下SOCK_RAW的原理, 比如网卡收到了一个 14+20+8+100+4 的udp的以太网数据帧.
原始套接字网络嗅探器的实现与应用
1 . 3 U D P协议结构
U D P 数 据段 头 比较 简单 .由一 个 8 字 节 的头和 数 据部 分 组成 具体 格式 如表 2 所示。
表2 U D P报 文 格 式
源端 口 ( 1 6 位 )I 目的端 口 ( 1 6位)
U D P长度 ( 1 6位 U D P校验和
#d e f i n e I P DAD DR
9 1 2
1 6
g e t h o s t n a me函数获取 本地 主机 的名称 。
( 2) g e t h O S t b Y n a m e( h O S t —n a m e
#d e f i n e H I — I C M P
G MP #d e f i n e H II
—Байду номын сангаас
#d e f i n e H I — T C P
D P #d e f i n e H IU
—
#d e f i n e HI — OS P F
5
1 . 4 T C P协议结构
2 . 3实现的具体 函数
( 1 )g e t h o s t n a me (h o s t _ n a me .s i z e o f ( h o s t _ n a me ))
术
#d e f i n e I P — H I T Y P E #d e f i n e I P — S A D D R
而T C P 数 据 头则 比较 复 杂 ,以 2 0个 固定 字 节开
始 在 固定头 后 面还可 以有一 些长 度不 固定 的可 选项
2 . 2具体实现
根 据 前文 提 到的把 网卡设 置成 混杂模 式 ,进 而实
原始套接字
传输层 (TCP、UDP)
网络互联层 (IP)
主机到网络 (网络接口层)
应用程序
13.1
原始套接字概述
标准套接字
TCP/UDP IP
网络 核心
原始套接字 用户空间 内核空间
ICMP
套接字与内核的访问关系
13.1
原始套接字概述
原始套接字能够提供以下3种标准套接字不具备的功能:
(0 – 40字节)
数据
全长 ip_len
分片偏移 ip_off
首部校验和 ip_cksum
13.3.1 IP首部结构
31
20 字节
最大 65535 字节
Linux中 struct ip 结构体说明:
struct ip {
#if __BYTE_ORDER == __LITTLE_ENDIAN
接收时间戳
发送时间戳
13.3.2ICMP首部结构
类型:13或14,时间戳请求和应答 代码:0
Linux中 struct icmp 结构体说明(BSD):
struct icmp {
u_int8_t
u_int8_t
icmp_type; icmp_code;
u_int16_t
icmp_cksum;
③ 如果IP以分片形式到达,则所有分片都已经接收到并重组后才传给原始 套接字 。
④ 内核不能识别的协议、格式等传给原始套接字,因此,可以使用原始套 接字实现自定义协议格式。
13.2.3
原始套接收报文
⑤ 如果收到的数据中的协议类型与自定义的原始套接字匹配,则将接收到
的数据复制到原始套接字接收缓冲区中。
② 原始套接字创建完成后,一般还需要指定套接字数据格式类型,使得 原始套接字可确定以从网络接收哪种格式的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UDP client fputs
“abc…”
UDP ECHO server
IP首部
UDP首部
UDP数据
IP首部校验和:
覆盖:IP首部 填充:置0后系统填写
2014-6-18
UDP首部校验和:
覆盖:UDP伪头+UDP数据 填充:手工填写
26
二、基于原始套接字的服务器回射程序
过程
要求整数值或结构的选项
optval指向一个包含选项要求值的整数或结构 optlen为此整数或结构的长度
2014-6-18 15
②IP首部控制——setsockopt()
举例
布尔选项设置
BOOL blnFlag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
8
原始套接字编程模型
接收数据过程:
① ② ③ ④ ⑤ ⑥ ⑦
socket初始化; 创建套接字,指定使用原始套接字进行通信; 设置接收选项; 接收数据; 过滤数据; 关闭套接字; 结束对windows sockets dll的使用。
2014-6-18
9
原始套接字编程模型
问题1:原始套接字与流式套接字和数据报套接字在编程 过程中增加了哪些附加操作?
2014-6-18
7
原始套接字编程模型
发送数据过程:
① socket初始化; ② 创建套接字,指定使用原始套接字进行通信,指定IP头 选项; ③ 指定目的地址和通信端口; ④ 填充头和数据; ⑤ 发送数据; ⑥ 关闭套接字; ⑦ 结束对windows sockets dll的使用。
2014-6-18
2014-6-18
3
4 6 17 41 58 255
蓝牙通信协议
IPv4协议 TCP协议 UDP协议 IPv6协议 ICMPv6协议 原始IP包
13
②IP首部控制——setsockopt()
函数定义:
int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen );
Outline
2014-6-18
1
Outline
2014-6-18
2
怎样发送一个自定义的IP数据包?
原始套接字的能力
怎样接收ICMP协议承载的差错报文? 怎样使主机捕获网络中其它主机间的报文? 怎样伪装本地的IP地址? 怎样模拟TCP或UDP协议的行为实现对协议的灵活操 控?
问题2:应用程序能够接收到哪些数据?
2014-6-18
10
Outline
2014-6-18
11
①创建套接字——socket()
函数定义: 输入参数:
af:指定网络地址类型,一般取AF_INET,表示该套接字在 Internet域中进行通信; type:指定套接字类型,这里取SOCK_RAW,表示创建的套 接字是原始套接字; protocol:指定网络协议。
2014-6-18 12
①创建套接字——socket()
协议 IPPROTO_IP IPPROTO_ICMP IPPROTO_IGMP
值 0 1 2
含义 IP协议 ICMP协议 IGMP协议
BTHPROTO_RFCOMM
IPPROTO_IPV4 IPPROTO_TCP IPPROTO_UDP IPPROTO_IPV6 IPPROTO_ICMPV6 IPPROTO_RAW
部由应用进程构造,但排除以下三个内容:
a)IPv4标志字段可置0,告知内核设置 b)IPv4头部校验和字段置0,总是由内核计算并存储 c)IPv4选项字段可选
原始套接字输出
2014-6-18
22
在Windows7、Windows Vista、Windows XP SP2和Windows
Windows对原始套接字的限制
Windows在Server版的操作系统中对原始套接字支持较好, 上述限制不适用于Windows Server 2003、Windows Server 2008、以及Windows SP2以前的操作系统
2014-6-18 23
Outline
2014-6-18
24
SOCKET socket(int af, int type, int protocol);
返回值:
正确:创建的套接字句柄SOCKET 错误:INVALID_SOCKET (WSAGetLastError)
功能:创建一个套接字,用于以后的数据传输 说明:创建者的权限——administrator
一、Ping的实现
功能
发送ICMP echo请求,接收目的主机返回的应答,判断 对方是否存活
过程
创建socket 填充数据 发送数据 接收 显示结果 关闭socket
2014-6-18
25
二、基于原始套接字的服务器回射程序
“abc…” “abc…”
fgets
原始套接字的能力
原始套接字的适用场合
特殊用途的探测应用 基于数据包捕获的应用 特殊用途的传输应用
2014-6014-6-18
6
原始套接字编程模型
传输方式
客户机/服务器方式
特点
无连接
过程
服务器进程和客户端进程在通信前必须创建各自的套接 字,然后对相应的套接字进行“读”、“写”操作,实 现数据的传输
2014-6-18 16
③端点地址关联
bind()
可以在原始套接字上调用bind函数,不过比较少见 功能
指定从这个原始套接字发送的所有数据报的源IP地址
作用范围
原始套接字不存在端口号概念,bind函数仅设置本地地址
connect()
原始套接字中可以调用connect函数,也比较少见 功能
2014-6-18
20
原始套接字输出
发送数据的目标
连接模式:在connect中指明 非连接模式:在sendto中指明
发送数据的内容
IP首部 UDP首部 UDP数据
IP_HDRINCL选项未开启 IP_HDRINCL选项开启
2014-6-18
21
在IP_HDRINCL套接口选项开启的情况下,整个IP头
XP SP3中,通过原始套接字发送数据的能力受到了诸多限 制,这些限制主要包括:
TCP的数据不能通过原始套接字发送; 如果源IP地址不正确,则UDP的数据不能通过原始套接字发 送。所谓不正确是指为数据报设置的源地址不属于本机有效 的IP地址,这样限制了恶意代码通过伪造源IP地址进行拒绝 服务攻击的能力,同时还限制了发送IP欺骗数据包的能力; 当设置协议类型为IPPROTO_TCP时,不允许将原始套接字绑 定到本地地址(当协议类型为其它协议时,绑定是允许的)
2014-6-18
19
原始套接字输入
接收到的类型
一个原始套接口能够收到哪些数据?
SOCKET(协议):匹配数据报的协议字段 bind:匹配数据报的目的IP地址 connect:匹配数据报的源IP地址
注意
如果一个原始套接口是以0值协议参数创建的,而且既 未对它调用过bind,也未对它调用过connect,那么该套 接口将被传送以可由内核传递到原始套接口的每个原始 数据报的一个拷贝
创建原始套接字 设置套接字选项,指明控制IP首部 填充UDP数据报文 发送数据 接收数据 显示结果 关闭套接字
2014-6-18
27
三、UDP端口扫描
思路
用rawsocket实现,类型指定为IP
发送:使用原始套接字,构造UDP请求; 接收:判断接收到的数据类型
UDP应答:服务器开放 ICMP端口不可达报文:端口不开放
整数值选项设置
例1 int ttl = 7 ; // TTL value. setsockopt(sock, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)) 例2 int nTimeOver=1000; setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver,sizeof(nTimeOver))
输入参数:
s:套接字描述符; level:选项定义的层次,如IPPROTO_IP; optname:指定套接字选项的名字,设置为IP_HDRINCL 表示要构造IP头部; optval:指向请求选项数据缓冲区的指针; optlen:选项数据optval缓冲区的长度。
2014-6-18
recvfrom()
原始套接口发送缓存
原始套接口接收缓存 套接口实现
②
流式套接口 接 收 接 收 原始套接口 数据报套接口 接 收
①
TCP/IP协议实现
2014-6-18
网络
18
原始套接字输入
接收到的类型
内核把哪些接收到的IP数据报传递到原始套接口?
不传递任何UDP分组和TCP分组到原始套接口 不传递任何片段分组到原始套接口 大多数ICMP、IGMP分组在内核完成处理其识别的消息 后传递到原始套接口 不认识其协议字段的所有IP数据报传递到原始套接口
2014-6-18 3
原始套接字的能力