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