Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9547667
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-13 17:58:42

1、引言
    前段时间编写了一个网络监听工具。 为了分析抓到的数据包,要熟悉各种网络协议。本人痛苦的发现网上很少有集中讲解这方面的文章,而图书大部分讲解得不够仔细,小部分专门研究网络协议的图书又太大,不适合我们的要求。故把常用的以太网协议写出来和大家分享。

2、以太网的特点
    以太网采用的是CSMA/CD技术,即带碰撞检测的载波侦听多址访问。在CSMA/CD技术中,如果网络上没有数据,则任何时候都可以将数据传送出去。如果网络被使用,那就要等到网络空闲时再传送。在以太网中传输的数据是无选择的发送到所有网卡的。这就为网络监听创造了条件。

3、以太网数据包
    在以太网中,数据是以被称为帧的数据结构体为单位进行交换的。这种数据包结构如下图所示:
 
报头 报文

    在以太网桢的报头中包含接收端及发送端的地址,桢的报文部分包含的是数据种类。最后放置的是错去校验和修正码。通常我们抓到的数据包已经去掉了同步码和桢分界符。下面先给出报头部分的定义:

以太网桢报头格式
接收端MAC地址(48位) 发送端MAC地址(48位) 类型字段(16位)

注意:这里提到的是位,一位就是二进制数据中的一位。通常,一个字节是由8位组成的。

类型字段意义(参考RFC1700)
类型(十六进制) 协议
0800 IP
0806 ARP
8035 RARP
809B Appletalk
8137-8138 Novell
814C SNMP

4、IP数据报的构成
    当以太网数据桢的类型字段为十六进制0800时,表示以太桢报文部分是一个IP数据报。其格式如下所示,其中报头部分存储了版本、头长度、生存时间、接收和发送端IP地址等重要信息。
 
报头 报文


IP数据报报头定义
字段 位数 说明
版本 4 表示IP的版本。现目前的版本号为4
报头长度 4 表示报头的长以32位为一个单位
服务类型 8 优先级和可靠性等服务品质要求的数值
数据报长度 16 IP数据报的全部长度,以8位(字节)为单位
标识 16 识别IP数据报的编号
标志 3 标示有无碎块
数据块偏移 13 产生碎块时应该比达到的数据块早到的数据块大小
生存时间 8 存放控制IP数据报寿命长短的数值
协议 8 标示上层协议
报头校验码 16 检查报头错误用的校验码
发送端地址 32 发送端的IP地址
目的地地址 32 接收端的IP地址
 

5、TCP协议
    传输控制协议(TCP)是在传输层使用的协议。当IP数据报的协议字段的值为6时,表示本IP数据报的报文部分是TCP数据报。

TCP数据报头定义
字短名 长度(位) 意 义
发送端端口 16 发送端及客户夫端程序的端口号
接收端端口 16 接收端及服务器端程序得端口号
顺序号 32 标示消息段的数据位于全体数据块的眸字节的数值
确认号 32 表示接受端对于发送端接收到的数据块数值
数据偏移 4 报头长,以32位为一个单位
预留 6 扩展用(预留)
控制位 6 表示某字段意义的位
窗口 16 窗口的大小(一次可以发送的数据量)
校验码 16 错误检查用
紧急数据指针 16 插入信号等紧急数据的结束位置
选项和填充 32 选相等


6、UDP数据报
    当IP数据报的协议字段的值等于17,表示IP数据报的报文部分携带的是UDP数据报。下面是UDP数据报头的构造。

UDP数据报  
发送端端口(16位) 接收端端口(16位) 数据报长度(16位) 校验码(16位) 数据

7、关于程序
    为了更好的理解本文提到的协议,及它们之间的一些简单关系,作者开发了一个简单的网络监控软件,读者可以参照程序的运行理解本文。

阅读(1339) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~