TCP/IP协议课程设计
设计说明书
数据包的捕获与分析
起止日期: 2013 年 11 月 25 日 至 2013 年 11 月 29 日
学班学成
生姓名 级 号 绩
指导教师(签字)
计算机与通信学院(部) 2013年 12 月 29日
目录
1 课程设计简介 ............................................................................................................................... 1
1.1 课程设计的目的 ............................................................................................................... 1 1.2 课程设计内容 ................................................................................................................... 1 2课程设计实现过程 ........................................................................................................................ 2
2.1 ip数据包的格式 ................................................................................................................. 2 2.2系统流程图 ........................................................................................................................ 3 2.3程序设计 ............................................................................................................................ 3 3设计总结...................................................................................................................................... 16 参考文献......................................................................................................................................... 17
1 课程设计简介
1.1 课程设计的目的
(1)使学生掌握网络通信协议的基本工作原理; (2)培养学生基本掌握网络编程的基本思路和方法; (3)能提高学生对所学计算机网络理论知识的理解能力; (4)能提高和挖掘学生对所学知识的实际应用能力和创新能力; (5)提高学生的科技论文写作能力。
1.2 课程设计内容
1)ip数据包的格式 2) 系统流程图 3) 程序设计 4)运行测试
1
2课程设计实现过程
2.1 ip数据包的格式
IP数据包格式包含了标头固定部分,标头可变部分和数据区三部分。IP数据报标头部分固定为20个字节,其中包含了12个参数域,各参数域隐含着网间协议的传输机制。IP具体的标头格式如图1所示。 各参数域的具体含义如下:
1) 版本号:长度4位,表示所使用的IP协议的版本。IPv4版本号字段值为4;IPV6版本号字段号的值为6.
2) 标头长:长度4位,定义了一个以4B为一个单位的IP包的报头长度 3) 服务类型:共8位,高3位组成优先级子域,随后4位组成服务类型子域。 4) 数据报总长度:总长度为2B(即6位)。定义了以字节为单位的数据报的总长度。
5) 重装标识:长度16位,用于识别IP数据报的编号,让目的主机判断新来的数据属于哪个分组。
6) 分片标识:共3位,最高位为0;DF禁止分片标识。DF=0,可以分片;DF=1,不能分片。MF:分片标识。MF=0,表示接的是最后一个分片;MF=1,不是最后一个分片。
7) 片偏移值:共13位,说明分片在整个数据报中的相对位置。
8) 生存周期:8位,用来设置数据数据报在整个网络传输过程中的寿命。常以一个数据报可以经过的最多的路由器跳步数来控制。 9) 协议类型:共8位,表示该IP数据报的高层协议类型。 10) 标头校验和:共16位,用于存放检查报头错误的校验码。
11) 源、宿主机地址:共32位,分别表示发送和接受数据报的源主机和宿主机的IP地址。
12) 选项数据域:0-40B,用于控制和测试。 IP数据包的格式为:
4位版本4位首部长度8位服务类型(TOS)3位标志8位协议32位源IP地址32位目的IP地址16位总长度(字节为单位)13位片偏移16位首部检验和16位标识8位生存时间(TTL)
2
2.2系统流程图
开始 构造程序运行文件,生成输出文件 创建并初始化原始套接字 设置网卡混杂模式 监听网卡 捕获和解析IP数据报 输出解析信息,并存入文档 No
是否达到需要次数 Yes 结束
2.3程序设计
1)ip数据包定义
typedef struct _IP_HEADER //定义IP头 {
union
BYTE Version; //版本(前4位)
BYTE HdrLen; //IHL(后4位),报头标长
3
{
};
BYTE ServiceType; //服务类型 WORD TotalLen; //总长 WORD ID; //标识 union { };
BYTE TimeToLive; //生命期 BYTE Protocol; //协议 WORD HdrChksum; //头校验和 DWORD SrcAddr; //源地址 DWORD DstAddr; //目的地址 BYTE Options; //选项
WORD Flags; //标志(前3位) WORD FragOff; //分段偏移(后13位)
}IP_HEADER;
//逐位解析IP头中的信息
2)界面设计
class CAboutDlg : public CDialog { public:
// Dialog Data
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA CAboutDlg();
support
4
//}}AFX_VIRTUAL
// Implementation protected: };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { }
void CAboutDlg::DoDataExchange(CDataExchange* pDX) { }
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
/////////////////////////////////////////////////////////////////////////////
// CSnipperDlg dialog
CSnipperDlg::CSnipperDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSnipperDlg::IDD, pParent) //{{AFX_MSG_MAP(CAboutDlg)
// No message handlers //}}AFX_MSG_MAP
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP
//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT //{{AFX_MSG(CAboutDlg) //}}AFX_MSG
DECLARE_MESSAGE_MAP()
END_MESSAGE_MAP()
5
{ }
void CSnipperDlg::DoDataExchange(CDataExchange* pDX) { }
BEGIN_MESSAGE_MAP(CSnipperDlg, CDialog)
/////////////////////////////////////////////////////////////////////////////
// CSnipperDlg message handlers
BOOL CSnipperDlg::OnInitDialog() {
CDialog::OnInitDialog(); //{{AFX_MSG_MAP(CSnipperDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSnipperDlg) DDX_Control(pDX, IDC_LIST1, m_list); DDX_Text(pDX, IDC_EDIT1, m_num); //}}AFX_DATA_MAP
//{{AFX_DATA_INIT(CSnipperDlg) m_num = 0; //}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
in Win32
// ON_BN_CLICKED(IDC_BUTTON1, OnStop) END_MESSAGE_MAP()
6
// Set the icon for this dialog. The framework does this // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE);
// TODO: Add extra initialization here
LONG lStyle;
// Set big icon // Set small icon
automatically
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { }
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { }
pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING,
IDM_ABOUTBOX,
// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
// Add \"About...\" menu item to system menu.
strAboutMenu);
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
7
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件 m_list.SetExtendedStyle(dwStyle); //设置扩展风格 }
void CSnipperDlg::OnSysCommand(UINT nID, LPARAM lParam) { }
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
if ((nID & 0xFFF0) == IDM_ABOUTBOX) { } else { }
CDialog::OnSysCommand(nID, lParam); CAboutDlg dlgAbout; dlgAbout.DoModal();
return TRUE; // return TRUE unless you set the focus to a control m_list.InsertColumn( 0, \"字段\插入列 m_list.InsertColumn( 1, \"内容\
8
void CSnipperDlg::OnPaint() { }
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSnipperDlg::OnQueryDragIcon() { }
void CSnipperDlg::OnOK()
return (HCURSOR) m_hIcon; } else { }
CDialog::OnPaint(); // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
// Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2;
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); if (IsIconic()) {
CPaintDC dc(this); // device context for painting
9
{
FILE * file;
if((file=fopen(\"课程设计.txt\{ }
各种方法定义
void getVersion(BYTE b, BYTE & version) { }
void getIHL(BYTE b,BYTE & result) { }
char * parseServiceType_getProcedence(BYTE b) {
switch(b>>5) //获取服务类型字段中优先级子域 {
case 7:
return \"Network Control\"; break;
return \"Internet work Control\"; break;
return \"CRITIC/ECP\"; break;
return \"Flash Override\"; result=(b&0x0f)*4; //获取头部长度字段
version=b>>4; //右移4位,获取版本字段 printf(\"fail to open file %s\"); return ;
// TODO: Add extra validation here nRow = 0;
case 6:
case 5:
case 4:
10
}
}
break;
return \"Flsah\"; break;
return \"Immediate\"; break;
return \"Priority\"; break;
return \"Routine\"; break;
return \"Unknow\"; break;
case 3:
case 2:
case 1:
case 0:
default:
char * parseServiceType_getTOS(BYTE b) {
b=(b>>1)&0x0f; //获取服务类型字段中的TOS子域 switch(b) { case 0:
return \"Normal service\"; break;
return \"Minimize monetary cost\"; break;
return \"Maximize reliability\"; break;
return \"Maximize throughput\";
case 1:
case 2:
case 4:
11
break;
return \"Minimize delay\"; break;
return \"Maximize security\"; case 8:
case 15:
break; default:
return \"Unknow\";
}
}
void getFlags(WORD w,BYTE & DF,BYTE & MF) //{ DF=(w>>14)&0x01; MF=(w>>13)&0x01;
}
void getFragOff(WORD w,WORD & fragOff) //{ fragOff=w&0x1fff; }
char * getProtocol(BYTE Protocol) //{ switch(Protocol) // { case 1: return \"ICMP\"; case 2: return \"IGMP\"; case 4: return \"IP in IP\"; case 6: return \"TCP\"; case 8:
return \"EGP\"; 12
解析标志字段 获取分段偏移字段 获取协议字段共8位以下为协议号说明:
}
case 17: }
return \"UDP\"; return \"IPv6\"; return \"RSVP\"; return \"OSPF\"; return \"UNKNOW\"; case 41: case 46: case 89: default:
3)IP抓包解析程序
void ipparse(FILE* file,char* buffer) // IP抓包解析 {
IP_HEADER ip=*(IP_HEADER*)buffer; //通过指针把缓冲区的内fseek(file,0,SEEK_END); /*解析版本信息*/ BYTE version;
getVersion(ip.Version,version); fprintf(file,\"版本=%d\\r\\n\/*解析IP头长度*/ BYTE headerLen;
getIHL(ip.HdrLen,headerLen);
fprintf(file,\"头长度=%d(BYTE)\\r\\n\/*解析服务类型*/
fprintf(file,\"服务类型=%s,%s\\r\\n\
parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType));
容强制转化为IP_HEADER数据结构
/*解析数据报长度*/
fprintf(file,\"总长度=%d(BYTE)\\r\\n\/*解析数据报ID*/
13
}
fprintf(file,\"标识=%d\\r\\n\/*解析标志位*/ BYTE DF,MF;
getFlags(ip.Flags,DF,MF);
fprintf(file,\"标志 DF=%d,MF=%d\\r\\n\/*解析分段偏移*/ WORD fragOff;
getFragOff(ip.FragOff,fragOff);
fprintf(file,\"分段偏移值=%d\\r\\n\/*解析生存期*/
fprintf(file,\"生存期=%d(hopes)\\r\\n\/*解析协议*/
fprintf(file,\"协议=%s\\r\\n\/*解析头部校验和*/
fprintf(file,\"头部校验和=0x%0x\\r\\n\/*解析源IP地址*/ fprintf(file,\"/*解析目的IP地址*/ fprintf(file,\"
目
的
IP
地
址
源
IP
地
址
=%s\\r\\n\
=%s\\r\\n\
fprintf(file,\"---------------------------------------------\\r\\n\");
4)程序运行测试结果
14
15
3设计总结
这次计算机网络课程设计是解析IP数据包,通过这次上机充分应用了所学的计算机网络和C语言的知识,并上网搜索一部分相当资料,粗略设计出该程序。
通过本次课程设计,充分运用了所学的计算机网络知识,设计出了如何解析IP数据包,从而更加深刻的了解到了IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
在课程设计的过程也碰到的不少问题。该程序也存在着不少的缺陷,比如并不是所有的数据包都能捕获,如:IP数据包以外的数据包都抓不到;只支持ICMP、IGMP、TCP、UDP这些协议。
16
参考文献
[1] 袁庆龙,候文义.Ni-P合金镀层组织形貌及显微硬度研究[J].太原理工
大学学报,2001,32(1):51-53.
[2] 刘国钧,王连成.图书馆史研究[M].北京:高等教育出版社,1979:15-18,
31.
[3] 孙品一.高校学报编辑工作现代化特征[C].中国高等学校自然科学学报
研究会.科技编辑学论文集(2).北京:北京师范大学出版社,1998:10-22.
17
因篇幅问题不能全部显示,请点此查看更多更全内容