第7章 解析IP数据包
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建原始套接字后,IP头就会包含在接 收的数据中。 我们可以设置IP头操作选项,调用 setsockopt函数。其中flag设置为true, 并设定IP_HDRINCL选项,表明用户可 以亲自对IP头进行处理。
BOOL flag=true; setsockopt(sock, IPPROTO_IP,IP_HDRINCL, (char*)&flag,sizeof(flag));
7.3 相关知识-协议字段
协议字段 -8位 表示使用此IP数据包的高层协议类型, 常用的协议号如下表所示:
协议名称 序号 ICMP 17 IGMP 41 IP in IP 46 TCP 89 EGP 协议名称 UDP IPv6 RSVP OSPF
序号 1 2 4 6 8
7.3 相关知识-头校验和字段(1/2)
7.3 相关知识-片偏移字段
片偏移字段-13位 说明分片在整个数据包中的相对位置。 片偏移值是以8B为单位来计数的,因此 选择的分片长度应该是8B的整数倍。 分片在目的地址重组,其中之一条件就 是根据偏移值来决定的。
7.3 相关知识-生存时间(TTL)
生存时间(TTL)-8位 设置数据包在互联网络的传输过程的寿 命,通常是用一个数据包可以经过的最 多的路由器跳步数来限定的。 可以避免数据包在无休止地在网络中死 循环流动。该域为“0”时,报文被删除。
b7 b6 b5
优先级
b4
D
b3
T
b2
R
b1
C
b0
0
7.3 相关知识-优先级
优先级有8种,优先级越高表明数据包越 重要。下表列出优先级所代表的意义:
位数(b7b6b5) 意义
111 110 101 100 011 010 001 000
网络控制 网络间控制 重要(CRITIC/ECP) 即时,优先 即时 立刻 优先 普通
7.4 课程设计分析
-原始套接字(Raw Socket) (5/7)
第6个参数WSA_FLAG_OVERLAPPED是标志 位,表明可以使用发送接收超时设置。 注意:本课程设计把这个标志位设置为 NULL,因为本设计没有考虑超时情况。
7.4 课程设计分析
-原始套接字(Raw Socket) (6/7)
7.3 相关知识-标识字段
标识字段长度-16位 用于识别IP数据包的编号。每批数据都 要有一个标识值,用于让目的主机判断 新来的数据属于哪个分组。
7.3 相关知识-标志字段
标志字段-3位,最高位是0
0 DF MF
禁止分片(段、组)标志DF(do not fragment) DF=1,不能分片 DF=0,可以分片 分片(段、组)标志MF(more fragment) MF=1,非最后分片 MF=0,最后分片
第2个参数SOCK_RAW 是套接字类型,在三种套接字
类型中,我们选择第3个原始套接字类型: SOCK_STREAM,SOCK_DGRAM,SOCK_RAW√
7.4 课程设计分析 -原始套接字(Raw Socket) (4/7)
第3个参数IPPROTO_IP依赖于第2个参数, 用于指定套接字所使用的特定协议,这 里使用IP协议。 第4个参数为WSAPPROTOCOL_INFO位, 该位可以置空。 第5个参数保留,永远置0。
7.3 相关知识-源地址/目的地址
地址字段包括源地址和目的地址- 32位/32位 源地址表示发送数据包的源主机IP地址 目的地址表示接收数据包的目的主机的 IP地址
7.3 相关知识-选项字段
选项字段-0~40B, 主要用于控制和测试。 对于出现报头部分的长度不是32位的整 数倍的情况,需要通过填充位来凑齐为 32的整数倍。
互联网络层是TCP/IP协议参考模型中的关键部 分。IP协议把传输层送来的信息封装成IP数据 包,并把IP数据包传递给数据链路层。IP协议 在TCP/IP协议族中处于核心地位,IP协议制定 了统一的IP数据包格式,以消除各通信子网间 的差异,从而为消息发送方和接收方提供了透 明的传输通道。 编制本程序前,首先要了解IP包的格式。
7.4 课程设计分析-注意(1/3)
填写sockaddr_in内容,其地址值应填写为本机 IP地址。本机IP地址可以通过gethostbyname() 函数获取;端口号可以随便填写,但不能与系 统冲突;协议族应填写为AF_INET。 sockaddr_in结构的值必须是以网络字节顺序表 示的值。使用htons()函数可以将无符号短整型 的主机数据转换为网络字节顺序的数据。最后 使用bind()函数将socket绑定到本地网卡上。
头校验和字段-16位 用于存放检查报头错误的校验码。 校验的范围是整个IP包的报头。 校验和计算: 1)将头校验和的字段置为0。 2)将报头部分的所有数据以16位为单位进行累 加,累加方式是求异或。 3)将累加的结果取反码,就得到头校验和。
7.3 相关知识-头校验和字段(2/2)
当收到一个IP包时,检查报头是否出错。 把报头中的所有数据以16位为单位进行 累加,若累加的结果为0,则报头没有出 错。
7.2 课程设计要求(2/2)
2) 在标准输出和日志文件中写入捕获IP包 的如下信息: 版本/头长度/服务类型/数据包总长度/数 据包标识/分段标志/分段偏移值/生存时 间/上层协议类型/头检验和/源IP地址和 目的IP地址等内容。 3) 当程序接收到键盘输入Ctrl+C时退出。
7.3 相关知识- IP包的格式
网络的SOCKET数据传输是一种特殊的 I/O。 SOCKET也是一种文件描述符,socket具 有一个类似于打开文件的函数调用 socket(),该函数返回一个整型的socket 描述符,随后的连接建立,数据传输等 操作都是通过该socket实现的。
预备知识-套接字(2/2)
常用的socket类型有三种: 流式socket(SOCK_STREAM)-面向连接的socket,针对 于面向连接的TCP服务; 数据报式socket(SOCK_DGRAM)-无连接的socket,对 应于无连接的UDP服务。 原始套接字(raw socket)-保存数据包中的完整IP 头,前面两种套接字只能收到用户数据。因此可以通 过原始套接字对IP层数据进行分析
7.3 相关知识-服务类型
在4位服务类型子域中,b4,b3,b2,b1分别 表示D(延迟),T(吞吐量),R(可靠性)与C(成 本),下表列出了服务类型子域的构成:
位数(b4b3b2b1)
意义
1111 1000 0100 0010 0001 0000
安全级最高 延迟最小 吞吐量最大 可靠性最大 金钱成本最小 普通服务
计算机网络课程设计
第七章 解析IP数据包
刘玉华
华中师范大学计算机科学系
2012年5月
7.1 课程设计目的
设计一个解析IP数据包的程序,并根 据这个程序,说明IP数据包的结构及IP 协议的相关问题,从而对IP层的工作原 理有更好的理解和认识。
7.2 课程设计要求(1/2)
本程序的目标是捕获网络中的IP数据包, 解析数据包的内容,将结果显示在标准 输出上,并同时写入日志文件中。 程序的具体要求如下: 1) 以命令行形式运行:ipparse logfile ipparse 程序名 logfile 记录结果的日志文件名
7.4 课程设计分析-注意(2/3)
绑定网卡后,需要用WSAIoctl()函数把网卡设 置为混杂模式,使网卡可以接收所有网络数据, 其关键代码如下:
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) DWORD dwBufferLen[10]; memset(&dwBufferLen,0,sizeof(dwBufferLen)); DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; WSAIoctl(sock,IO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
创建原始套接字的代码如下: SOCKET sock;
sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL, 0,WSA_FLAG_OVERLAPPED);
第1个参数AF_INET指定通信发生的区字段;是 针对Internet网络,允许在远程主机之间通信。
7.3 相关知识-总长度字段
总长度字段- 2B 总长度=包头+数据 定义以字节为单位的数据包的总长度 IP数据包的最大长度为216=65535B
预备知识-报文的分片和重组控制
由于IP互连的物理网络处理的最大报文长度不 同,所以IP数据包在传输过程中可能被分片。 IP数据包使用“标识”、“标志”、“片偏移” 三个域对分片进行控制。 分片后的报文独立选择路由路径传输,最后在 目的地进行重组。
IP数据包格式
0 4 8 16 19 24 31
版本
报头标 长
服务类型
总长度 标志 片偏移
标识
生存时间
协议
源IP地址
头校验和
报头
目的IP地址
选项 填充域
数据部分
7.3 相关知识-版本字段
版本字段 -占用4位 表示所使用的IP协议的版本. 目前的版本是IPV4,版本字段的值为4, 下一代版本是IPV6,版本字段的值为6。 本程序针对版本值为4的IP数据包解析。
IP数据包格式图
0 4
报头标 长
8
16
19
24
31
版本
服务类型
总长度 片偏移 头校验和
标识 标志 生存时间 协议 源IP地址 目的IP地址 选项 数据部分
报头
填充域
7.4 课程设计分析
课程设计程序由三部分组成: 初始化原始套接字 反复监听捕获IP数据包 解析IP数据包
预备知识-套接字(1/2)
7.4 课程设计分析 -原始套接字(Raw Socket) (7/7)
使用如下代码完成对socket初始化工作:
//获取主机名 char hostName[128]; gethostname(hostName,100); hostent * pHostIP; pHostIP=gethostbyname(hostName); //填充SOCKADDR_IN结构的内容 sockaddr_in addr_in; addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0]; addr_in.sin_family=AF_INET; addr_in.sin_port=htons(6000); //绑定socket bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
7.4 课程设计分析 -套接字(socket)(1/7)
为了获取网络中的IP数据包,必须对网卡进行 编程,我们使用套接字(socket) 编程。 通常网络通信的套接字程序只能响应与自己硬 件地址相匹配的数据包或是以广播形式发出的 数据包。对于其它形式的数据包,如已到达网 络接口但却不是发送到此地址的数据包,网络 接口在验证目的地址非自身地址后将不响应, 即应用程序无法收取与自己无关的数据包。 要想获取流经网络设备的所有数据包,必须将 网卡设为混杂模式。
7.4 课程设计分析 -套接字(socket) (2/7)
套接字分为3种: 流套接字(Stream Socket) 数据报套接字(Datagram Socket) 原始套接字(Raw Socket) 要进行IP层数据包的接收/发送,应使 用原始套接字。
7.4 课程设计分析 -原始套接字(Raw Socket) (3/7)
7.3 相关知识-报头标长(IHL)字段
报头标长(IHL)字段-占用4位 定义了以4B为一个单位的IP包的报头长 度。报头中除了选项字段和填充域字段 外,其他各字段是定长的。 IP数据包的头长度在20B~60B之间,是 可变的。
Leabharlann Baidu
7.3 相关知识-服务类型字段
服务类型字段- 8位 指示路由器如何处理该数据包。该字段 长度由4位服务类型(TOS)子域和3位优 先级(precedence)子域组成,1位为保留 位。