版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/62协议分析实验在此部分,设计了14个网络协议分析实验,基本涵盖了前面网络原理中介绍的各种协议。学生使用附带的网络协议仿真教学系统完成这些实验,可以对网络协议有更深入的理解。这些实验可以根据教学具体情况选做。实验一以太网帧的构成【实验目的】掌握以太网帧的构成模式,能够识别不同的MAC地址并理解MAC地址的作用,了解网络故障分析仪的基本使用方法。【实验学时】4学时【实验类型】综合型【实验要求】1、了解协议仿真编辑器的五个组成部分及其功能2、了解网络协议分析仪的各组成部分及其功能3、学会使用协议仿真编辑器编辑以太网帧,包括单帧和多帧的编辑4、学会观察并分析地址本中的MAC地址5、学会分析以太网帧的MAC首部6、理解MAC地址的作用7、理解MAC首部中的LLC-PDU长度/类型字段【实验原理】(1)以太网首部以太网目的地址以太网源地址帧类型662帧类型字段:表示后面数据类型。例如0x0806表示ARP请求或应答。(2)太网帧的构成461500字节以太网首部IP首部协议(例TCP)首部应用数据以太网尾部1420-60根据协议而定(TCP20-60)4(3)其他原理请参考教材:2/62第一章:计算机网络的基本概念第二章:局域网技术【实验步骤】一仿真机端练习一:运行ipconfig命令1、启动网络协议仿真编辑器,选择“工具”菜单栏中的IPCONFIG项,观察ipconfig/all命令下的运行结果,获得本机的主机名及以太网地址2、在地址本中找到本机的信息练习二:单帧编辑并发送1、打开协议仿真编辑器,在界面初始状态下,程序会自动新建一个单帧。可以利用协议仿真编辑器打开时默认的以太网帧进行编辑。此时在协议仿真编辑器的各部分会显示出该新帧的信息:(a)多帧编辑器中显示:新帧的序号(为1)、概要信息(b)协议树中显示以太网MAC层协议(c)单帧编辑器中显示新帧各字段的默认值(d)十六进制对照表中显示新帧对应的十六进制信息2、编辑以太网帧;在单帧编辑器中编辑该帧,具体步骤为:(a)填写“目的MAC地址”字段;方法一:手工填写。方法二:选择地址本某主机的MAC地址,复制并粘贴到目的MAC地址栏中,替换掉默认值。(b)填写源MAC地址字段,方法同上;注意:仿真机可以仿真本机发送的MAC帧,也可以仿真另一台机器发送MAC帧,所以,源MAC地址字段可以填写本机MAC地址,也可以填写其他机器的MAC地址。(c)填写“类型或长度”字段;方法一:双击该字段,更改默认设置,填写上一层协议类型值(十六进制表示);方法二:单击“类型或长度”字段,右端会出现一个下拉键头,点击该键头,出现下拉菜单,其中列出可选的上层协议类型,单击其中一个进行选择,该协议对应的十六进制值会自动填写;3、单帧编辑器与十六进制对照表是联动的,观察十六进制对照表中该帧的信息;4、选中单帧编辑器中的某一字段,该字段对应的十六进制值会相应地改变颜色;5、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“按范围发送”或“自定义发送”,正确填写发送的范围后,选择“发送”按钮,发送该帧;6、在监控机一端捕获新发送的帧并分析(捕获数据的方法参考本实验后半部分:监控机端的实验步骤);3/627、重新回到步骤(2)类型和长度字段分别填写以下十六进制值:(a)0800:对应的上层协议是什么?(b)0806:对应的上层协议是什么?(c)0100:对应的上层协议是什么?该值的具体含义是什么?在监控机端捕获该帧,捕获到帧的长度是多少?分析原因。(d)0001:对应的上层协议是什么?这样填写是否正确?分析原因。练习三:编辑并发送帧序列1、按照单帧编辑的步骤编辑多个帧;2、对每一帧可以重新设置发送的时间间隔和发送的重复次数,如不设置,则采用默认值;方法为:点击某一帧左边的“+”,即可展开为两行,在第一行内填写此帧与其上一帧的发送时间间隔(单位:ms默认值:1000),展开项的第二行为设置此帧的重复发送次数(默认值为1)。3、编辑好以后,发送帧序列;点击菜单栏或工具栏中的“发送”按钮,选择弹出菜单上的“按范围发送”并编辑起始帧序号和结束帧序号如果选择“自定义发送”则在“发送序号”面板中选择要发送的单帧序号,并根据需要修改发送时间和发送次数。编辑完成后点击“发送”按钮,即完成帧的发送。4、观察主界面底部“状态”栏中的各数据信息;5、在监控机一端捕获数据并分析。练习四:编辑并发送mac广播帧请同学们考虑mac广播帧的目的mac地址应该如何填写。二监控机端练习一:捕获数据并分析。切换数据采集器的按钮,将监控机通过主控设备接在局域网中。1、启动协议详细解析功能,获得若干以太网帧。对其中的5-10个帧的以太网首部进行观察和分析;分析的内容为:源MAC地址目的MAC地址上层协议类型。2、以MAC地址为过滤条件捕获若干以太网帧。如:捕获源MAC地址为:00-09-74-A5-6F-4C对每一帧的以太网首部进行观察分析;分析的内容为: 源MAC地址;4/62 目的MAC地址; 上层协议类型。3、以本机MAC地址为过滤条件捕获相应的以太网帧(多个);对其中目的MAC地址为本机MAC地址的以太网帧进行观察分析:(a)这些帧的源MAC地址都是什么?(b)对照地址本观察这些MAC地址对应的IP地址有何特点?(c)说明:为什么能收到来自这些源MAC地址的帧?(d)将捕获到的以太网帧保存到文件中,文件名为:实验一.zdt。练习二:学习监控机端其他的协议分析功能。1、点击主机状况,观察分析结果信息。2、点击会话状况,观察分析结果信息。3、点击协议统计,观察分析结果信息。4、点击性能状况,观察分析结果信息。5、察看地址本。【思考问题】结合实验过程中的实验结果,回答下列问题:1、在网络的分层体系结构中,MAC层的作用是什么?2、帧在传送过程中每经过一个网络节点,MAC地址是否要发生变化?为什么?【实验结论】实验二IP地址分类与数据包的组成【实验目的】理解IP层的作用以及IP地址的分类方式,掌握IP数据包的组成,理解子网掩码的作用【实验学时】4学时【实验类型】综合型【实验要求】1、学会根据IP地址的分类方式区分各类IP地址2、掌握IP数据报的格式、长度以及各字段的功能3、学会利用子网掩码确定IP地址的网络号、子网号和主机号4、学会分析给定数据包的IP首部信息5/625、学会手工计算IP校验和的方法【实验原理】(1)IP地址的分类:A类07位网络号24位主机号B类1014位网络号16位主机号C类11021位网络号8位主机号D类111028位多播组号E类1111027位保留(2)各类IP地址的范围类型范围A到55B到55C到55D到55E到55(3)IP数据报格式:11617324位版本号4位首部长度8位服务类型TOS16位总长度(字节数)客户客户recv()connect()Socket()send()数据(回答)数据(请求)建立连接服务员数据处理16位标识3位标志13位片偏移8位生存时间(TTL)8位协议标识16位首部校验和6/6232位源IP地址32位目的IP地址IP选项数据图3-3-1(4)其他原理请参考教材:第三章IP网络协议及技术【实验步骤】练习一:运行ipconfig命令1、启动网络协议仿真编辑器,选择“工具”菜单栏中的“IPCONFIG”项,观察ipcofig/all命令下运行的结果,获得本机的IP地址及子网掩码:2、分析本主机属于哪一类IP地址,网络号和子网号分别是什么。3、利用本机的IP地址及子网掩码,找到地址本中与本机属于同一子网的主机。练习二:运行netstat命令Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。1、在DOS命令行方式下运行:netstat–r显示本机路由表。记录本机的缺省网关的IP地址。2、在DOS环境下运行netstat–s,观察IP协议部分,查看本机已经接收和发送的IP报文个数。练习三:运行Ping命令A:在地址本中选择与本主机在同一子网中的另一主机的IP地址(假设为:X.X.X.X);1、在DOS命令行方式下运行:pingX.X.X.X2、在监控机端捕获数据,观察记录每一帧的MAC层的源、目的MAC地址和IP层的源、目的IP地址。3、对照地址本中的记录,分析捕获数据的MAC地址与IP地址的对应关系。B:这个实验要求不同网段的两个小组密切配合。在地址本中选择与本主机属于不同子网的另一主机的IP地址(假设为:Y.Y.Y.Y);1、在不同网段的两台主机的DOS命令行方式下运行arp–d分别清除ARP高速缓存中的内容。然后运行ping命令:pingY.Y.Y.Y2、在监控机端捕获数据,观察记录每一帧的MAC层的源、目的MAC地址和IP层的源、目的IP地址。3、对照地址本中的记录,分析捕获数据的MAC地址与IP地址是否具有对应关系。C:比较A、B两个实验的实验结果,分析二者有何不同,为什么?7/62练习四:编辑并发送IP数据包1、打开协议仿真编辑器。2、填写该帧的“源MAC地址”和“目的MAC地址”字段;注意:当目的主机与本机不在同一子网中时,目的MAC地址字段该如何填写,才能保证帧能够到达目的地?3、填写该帧的以太网协议首部:“类型或长度”字段值为:0800(即IP协议的类型值)或者选择下拉菜单中的IP协议,此时:(a)协议树上将显示上层协议类型为“IPV4”,点击左端的“+”(b)点击协议树上的“IP”协议或者点击单帧编辑器右下方的“下一步”,在单帧编辑器中会出现IP层各个字段及其默认值;4、写IP协议头信息:(a)源IP地址;注意:仿真机可以仿真本机发送的IP数据包,也可以仿真另一台机器发送IP数据包,所以,源IP地址字段可以填写本机IP地址,也可以填写其他机器的IP地址。(b)目的IP地址:从地址本中选择一主机的IP地址并填写;(c)填写“版本号”(正常值:4);(d)首部长度(无可选项的情况下为5,即20个字节);(e)服务类型;(f)总长度字段(该值为IP首部长度加上数据部分的长度);(g)标识字段;(h)标志字段;(i)生存时间;(j)协议字段,即上层协议类型(6为TCP,17为UDP,1为ICMP);(k)首部检查和,当上述各字段值均填写完毕,可以通过两种方法计算首部检查和的值:方法一:手工计算。首先把“首部校验和”字段置为0;然后,对IP协议头中的每个16比特进行反码求和(整个首部看成是由若干个16比特的字组成),然后取反,结果即为该字段的值。方法二:利用协议仿真编辑器计算,其步骤如下:①首先把该字段置为0;②在十六进制对照表中找到IP协议头对应的部分(通过点击IP协议的第一个字段和最后一个有效字段来确定范围),并把该部分选中;③点击鼠标右键,选择弹出菜单中的“计算校验和”;④将得到的值填入单帧编辑器中首部检查和字段。5、要发送多个IP数据包,可重复上述步骤,并可在多帧编辑器中设置每一帧的发送次数和发送每帧的时间间隔;6、工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送帧序列;8/627、控机一端截获数据包并分析。练习五:观查分析IP会话状况。1、在监控机端选择“会话状况”,察看其中的IP会话状况统计结果。2、捕获大量IP数据包,分析其中的IP会话状况。步骤为:(a)切换数据采集器上的按钮,将监控机连接到主控设备上。(b)以IP协议为过滤条件,显示捕获的IP数据包,分析其中的IP会话状况。(c)将捕获的IP数据包保存到文件:实验二.zdt。【思考问题】结合实验过程中的实验结果,回答下列问题1、实验所用仿真机的IP地址是什么?子网掩码是什么?该机器属于哪类IP地址?网络号和子网号、主机名分别是什么?2、分析地址本中所有的IP地址,说明实验环境中所有机器(除服务器外)的子网划分情况。3、IP数据包在从源主机出发到达目的主机的过程中,IP首部中的IP源地址和目的地址字段是否发生变化?4、打开浏览器IE,访问国外某站点,如在地址栏中写入:(美国的微软主页地址,IP地址为84),并回车。在监控机一端截获这一过程仿真机发送的数据包,然后进行分析:(a)所发送数据包的目的IP地址是否为84?(b)如果不是,是什么?分析产生这种情况原因。【实验结论】实验三IP地址转换协议:ARP【实验目的】1、理解IP地址与MAC地址的对应关系2、掌握ARP协议的作用和格式【实验学时】4学时【实验类型】综合型【实验要求】1、理解IP地址与MAC地址的对应关系10/622、掌握ARP协议的作用3、掌握ARP协议的工作原理【实验原理】1、ARP请求或应答的分组格式硬件类型协议类型硬件长度协议长度操作发送方首部(八位组0-3)发送方首部(八位组4-5)发送方IP地址(八位组0-1)发送方IP地址(八位组2-3)目标首部(八位组0-1)目标首部(八位组2-5)目标IP地址(八位组0-3)字段说明:硬件类型字段:表示硬件地址类型,例如:1表示以太网。协议类型字段:表示要映射的协议类型,例如0x0800表示IP地址,0x0806表示ARP请求或应答。操作字段:共有四种操作类型,1表示ARP请求,2表示ARP应答,3表示RARP请求,4表示RARP应答2、其他原理请参考教材: 第三章IP网络协议及技术【实验步骤】注意:在没有强调在‘监控机’一端操作时,以下操作均是在仿真机上进行的练习一:仿真发送ARP请求报文1、在命令提示符下运行arp–d命令,清空ARP高速缓存2、编辑并发送ARP请求帧(1)打开协议仿真编辑器。(2)填写该帧的“源MAC地址”和“目的MAC地址”字段;(a)源MAC地址可以为本机的MAC地址,也可以仿真其他主机发送ARP请求报文,此时填写的MAC地址为另一台主机的MAC地址,MAC地址可根据主机名在地址本中获得;(b)目的MAC地址:这里要注意分析对于ARP请求来说,目的MAC地址应该是什么?(3)填写“类型或长度”字段值为:0806(即:ARP协议类型值)或者选择细下拉菜单中的“ARP”协议,此时:(a)协议树上将显示上层协议类型为“APR”,点击左端的“+”将该层协议展开,会看到ARP协议的各个字段10/62(b)单击协议树上的“ARP”协议或者点击单帧编辑器右下方的“下一步”,在单帧编辑器中会出现ARP层各个字段及其默认值(4)填写ARP协议头信息:(a)硬件类型:(以太网地址)(b)协议类型:(要映射的协议地址类型为IP地址类型)(c)硬件地址长度:(d)协议地址长度:(e)操作字段(APR请求为1,ARP应答为2,RARP请求为3,RARP应答为4)(f)发送方MAC地址:(g)发送方IP地址:为所选择源主机的IP地址;(h)目的MAC地址:(i)目的IP地址:为所选择源目的主机的IP地址。(5)点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送ARP帧;(6)在监控机一端捕获该报文及ARP响应报文并分析。3、在命令提示符下运行arp–a命令,检查ARP高速缓存中的内容。练习二:运行Ping命令(同一子网内两台机器间的ARP)1、在命令提示符下运行arp–d命令,清空ARP高速缓存2、在命令提示符下运行arp–a命令,检查ARP高速缓存3、从地址本中选择与本机属于同一子网的一主机的IP地址(X.X.X.X)作为Ping命令的参数,然后在命令提示符下运行:PingX.X.X.X在监控机一端捕获数据报文并分析:(a)其中是否有ARP请求及应答报文?(b)分析各ARP报文:源、目的mac地址都是什么?源、目的IP地址都是什么?(c)为什么产生这样的报文?4、在命令提示符下运行arp–a命令,检查ARP高速缓存中的内容是否发生变化,分析原因。练习三:运行Ping命令(经网关连接的不同子网上的两台机器间的ARP)1、在命令提示符下运行arp–d命令,清空ARP高速缓存2、在命令提示符下运行arp–a命令,检查ARP高速缓存3、从地址本中选择与本机属于不同子网的一主机的IP地址(Y.Y.Y.Y),然后在命令提示符下运行:PingY.Y.Y.Y11/62在监控机一端捕获数据报文并分析:(a)其中是否有ARP请求及应答报文?(b)分析各ARP报文:源、目的以太网地址都是什么?源、目的IP地址都是什么?(c)为什么产生这样的报文?4、在命令提示符下运行arp–a命令,检查ARP高速缓存中的内容是否发生变化,分析原因。5、比较练习二和练习三两实验中得到的ARP报文,有何不同?分析产生二者区别的原因是什么?【思考问题】结合实验过程中的实验结果,回答下列问题1、观察实验过程中捕获网络上的多个ARP请求帧,观察这些帧的以太网目的地址是否相同,分析其原因。2、观察实验过程中捕获网络上的多个ARP应答帧,观察这些帧的以太网目的地址是否相同,分析其原因。【实验结论】实验四IP控制管理协议:ICMP【实验目的】1、了解ICMP的格式和响应方式及作用2、了解常见的网络故障【实验学时】4学时【实验类型】综合型【实验要求】1、理解和掌握ICMP协议的基本作用2、知道ICMP报文的格式3、理解ICMP协议与IP协议的封装关系4、学会根据各种响应信息进行出错分析的方法5、学会使用ping命令【实验原理】请参考教材:12/62第三章IP网络协议及技术包括:ICMP协议;报文格式;报文类型;时间戳请求和应答报文格式;不可达报文格式;ICMP回显请求和应答报文格式等【实验步骤】练习一:仿真发送各种ICMP报文1、从地址本中选择一台主机,向该主机仿真发送ICMP回显请求报文。(a)打开协议仿真编辑器。(b)填写该帧的以太网协议首部:①“源MAC地址”和“目的MAC地址”字段:注意:当选择的目的主机与本机不在同一子网的情况,目的MAC地址该怎样填写②注意填写“类型或长度”字段值为:0800(即IP协议的类型值)(c)填写IP协议头信息:注意协议字段,即上层协议类型应为1(ICMP协议的类型为1),可手工填写也可选择下拉菜单中的“ICMP”协议;2、填写ICMP协议头信息:(a)类型字段值为:8;(b)代码字段值为:0;(c)标识符:任选16位二进制数(如0x1234);(d)序列号:任选16位二进制数(如0x5677);(e)数据字段:任选;(f)校验和:首先把该字段置为0,接下来计算ICMP首部的校验和。ICMP协议校验和字段覆盖整个ICMP报文,包括数据部分。3、击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送ICMP报文;4、在监控机一端截获相应的请求报文及应答报文并分析,注意当源MAC与源IP属于另一台主机的时候,响应报文的情况。5、从地址本中选择一台主机,向该主机仿真发送ICMP时间戳请求报文。(a)步骤同上。注意对于ICMP时间戳请求报文,类型字段值为13,代码字段值为0。(b)在监控机一端截获相应的请求报文及应答报文并分析。6、编辑IP数据包并主动引入一些错误:(a)向目标主机发送一个只有IP头的IP数据包;(b)向目标主机发送一个数据包,版本号字段填入7;(c)向目标主机发送一个数据包,协议类型字段填入120;(d)向目标主机发送一个数据包,填写不正确的IP报头长度;向另一台主机发送上述数据包;在监控机一端捕获响应报文并分析。13/62练习二:运行ping命令选择菜单栏中的“工具”,运行下拉菜单中的ping命令1、从地址本中选择与本机属于同一子网的一主机的主机名或IP地址,作为ping命令的参数;2、从地址本中选择与本机属于不同子网的一主机的主机名或IP地址,作为ping命令的参数;对于上述两种情况,在仿真机和监控机端分别进行观察和分析:在仿真机端观察:(a)是否收到响应包?(b)如果收到,观察响应包的个数,并对每个响应包的各信息字段进行分析。(c)比较两种次实验中TTL字段值是否相同,为什么?监控机一端捕获数据并分析:(a)是否捕获到响应包?(b)如果捕获到,观察并分析每个响应包的ICMP协议头部分。(c)比较两次实验中监控机一端捕获到的响应包的个数是否相同,为什么?3、同时打开多个DOS命令提示符窗口,在每个窗口中运行一个ping程序在监控机一端捕获数据,分析各程序如何识别属于自己的返回信息?练习三:运行netstat命令在Dos环境下运行netstat–s,观察ICMP协议部分,查看本机已经接收和发送的ICMP报文类型及报文个数。练习四:运行tracert命令在命令提示符下运行类似以下的命令:tracerttracert观察运行结果并分析。【思考问题】结合实验过程中的实验结果,回答下列问题:1、根据练习一的实验结果说明:实验室环境所使用操作系统默认的TTL最大值是多少?2、运行ping,再运行ping本机名(或本机IP地址)。在监控机端是否捕获到相应的ICMP回显请求报文?为什么?【实验结论】14/62实验五UDP数据报的传送【实验目的】1、理解UDP协议的工作原理及工作过程2、了解基本的端口分配3、理解DNS的工作原理【实验学时】4学时【实验类型】综合型【实验要求】1、理解UDP协议的通信过程2、学会手工计算UDP校验和3、理解DNS的作用及原理4、初步学会应用C语言与WinSock2进行网络程序设计【实验原理】请参考教材第三章IP网络协议及技术。主要包括UDP的封装,UDP首部格式,以及UDP校验和的计算方法。尽管UDP校验和的基本计算方法与IP首部校验和的计算方法类似(16bit字的二进制反码和),但是它们之间存在不同的地方。首先,UDP数据报长度可以为奇数字节,但是校验和的算法是把若干个16bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了校验和的计算(也就是说,可能增加的填充字节不被传送)。其次,UDP数据报和TCP段都包含一个12字节长的伪首部,它是为了计算校验和而设置的。伪首部包含IP首部一些字段。其目的是让UDP两次检查数据是否已经正确到达目的地(例如,IP有没有接受地址不是本主机的数据报,以及IP有没有把应传给另一高层的数据报传送给UDP)。UDP数据报中的伪首部格式如图:015163132位目的IP地址015163132位目的IP地址08位协议016位UDP长度16位源端口号16位目的端口号16位UDP长度16UDP检查和数据数据填充字节(0)32位源IP地址UDP伪首部UDP伪首部15/62【实验步骤】练习一:编辑并发送UDP数据包1、打开协议仿真编辑器。2、填写该帧的以太网协议首部:(a)源MAC地址”和“目的MAC地址”字段,注意:当选择的目的主机与本机不在同一子网的情况,目的MAC地址该怎样填写(b)“类型或长度”字段值应为:0800(即IP协议的类型值)3、填写IP协议头信息:注意协议字段,即上层协议类型应为17(UDP协议的类型为17);4、填写UDP协议信息:(a)16位源端口号:自选(b)16位目的端口号:自选(c)数据字段:可有可无(d)16位UDP长度:UDP报头长度与UDP数据长度之和(e)校验和:覆盖UDP首部(含伪首部)和数据两部分。请先根据参考原理的内容进行手工计算,然后利用协议仿真编辑器来计算(方法二),比较二者的结果,检验手工计算结果的正确性。方法一:手工计算。按照参考原理(3)中介绍的内容,计算好UDP伪首部和首部中的各项值,然后按16bit进行反码求和(方法同计算IP校验和),将结果填入相应字段。方法二:利用协议仿真编辑器来计算。步骤为:①将UDP长度填写到16位UDP校验和字段中作为伪首部中UDP长度字段值;②选中IP首部中的32位源IP地址和32位目的IP地址作为UDP伪首部中的32位源IP地址和32位目的IP地址;③选中IP首部中8位的协议字段作为UDP伪首部中的8位的协议字段;④在8位的协议字段之前选择一个8位的0作为UDP伪首部中的8位0;⑤再选中UDP首部的及数据各字段;⑥点击鼠标右键,选择“计算校验和”;⑦将得到的校验和值填写到16位UDP校验和字段。下面是一个计算UDP校验和的一个例子:一个不含数据部分的UDP数据报的十六进制对照表如下:000102030405060708090A0B0800450016/62004F944840008011E49DC0A80020C0A00520000000000080008其中黑体部分为用来计算校验和的UDP伪首部和UDP首部,其中:0011(十进制的17):为UDP伪首部中8位的0和8位的协议字段;C0A80020:为UDP伪首部中32位源IP地址;C0A80052:为UDP伪首部中32位目的IP地址;0000000000080008:为8字节的UDP首部;由于缺少伪首部中16位UDP长度,故该值暂时存放在16位UDP校验和字段中,在本例中该值为0008;对上述选中部分计算校验和即可。5、如果要发送多个UDP数据报,可重复上述步骤,并可在多帧编辑器中设置每一帧的发送次数和发送每帧的时间间隔;6、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送UDP报文;7、在监控机一端截获相应的报文并分析。练习二:编辑并发送UDP广播包1、实验步骤同上; 注意:以太网协议首部中的目的MAC地址应怎样填写? IP首部中的目的IP地址该怎样填写?2、在监控机一端截获相应的报文并分析。练习三:运行netstat命令点击编辑器菜单栏中“工具”项的IPCONFIG,在DOS命令行方式下运行:netstat–s显示每个协议的使用状态,观察UDP协议的使用情况。练习四:运行ipconfig命令1、在DOS命令提示符下运行:ipcofig/displaydns2、观察运行结果。练习五:运行Winsock网络程序设计一个简单的Winsock网络程序,模拟UDP数据报,加深对DNS作用的理解。按照以下步骤完成该练习:1、启动VisualC++,进入集成开发环境;2、建立一个“Win32ConsolApplication”类型的工程,工程名自拟;3、在该工程下,新建一个源程序文件,即选择“C++SourceFile”,文件名自拟;4、输入以下源程序(注释部分不必输入):17/62////////////////////////////////////////////////////////////////本程序的功能为:////(1)获取本机名(gethostname());////(2)获得给定主机名的IP地址(gethostbyname())////(3)获得给定IP地址的主机名(gethostbyaddr())./////////////////////////////////////////////////////////////////*头文件*/#include<winsock.h>#include<stdio.h>#include<string.h>intmain(){ /*初始化windowssocketsAPI*/ WORDwVersionRequested=MAKEWORD(1,1); WSADATAwsaData; if(WSAStartup(wVersionRequested,&wsaData)){ printf("WSAStartupfailed%s\n",WSAGetLastError()); return-1; } /*获得本主机名*/ charhostname[256]; intres=gethostname(hostname,sizeof(hostname));/*错误处理*/ if(res!=0){ printf("Error:%u\n",WSAGetLastError()); return-1; } /*打印本主机名字*/ printf("本主机名为:%s\n",hostname); /*输入一个主机的域名,可以为本机也可以为其他主机*/ printf("请输入一个主机域名:"); scanf("%s",hostname); /*利用主机名获得主机的地址信息*/ hostent*pHostent=gethostbyname(hostname);/*错误处理*/18/62 if(pHostent==NULL){ printf("Error:%u\n",WSAGetLastError()); return-1; } /*解析返回的主机地址信息:别名、地址类型、地址长度,并打印*/ hostent&he=*pHostent; printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n", he.h_name,he.h_aliases,he.h_addrtype,he.h_length); /*打印主机每一个网卡的IP地址*/ sockaddr_insa; for(intnAdapter=0;he.h_addr_list[nAdapter];nAdapter++){ memcpy(&sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length); /*输出机器的IP地址并以字符串的形式显示出来.*/ printf("Address:%s\n",inet_ntoa(sa.sin_addr)); } printf("\n"); /*输入一个服务器的IP地址*/ unsignedlongaddr; charhostaddr[50]; printf("请输入服务器IP地址:"); scanf("%s",hostaddr); /*将IP地址转化为网络字节序*/ addr=inet_addr(hostaddr); /*利用IP地址获得主机名*/ pHostent=gethostbyaddr((char*)&addr,4,AF_INET); /*错误处理*/ if(pHostent==NULL){ printf("Error:%u\n",WSAGetLastError()); return-1;19/62 } hostent&he1=*pHostent; /*打印返回的地址信息,注意主机名字信息*/ printf("主机名为:%s\naliases=%s\naddrtype=%d\nlength=%d\n", he.h_name,he.h_aliases,he.h_addrtype,he.h_length); /*结束windowssocketsAPI*/ WSACleanup(); return0;}1、使用Winsock函数的程序必须与WS2_32.LIB进行链接,而VisualC++集成开发环境的缺省链接库中没有此项,因此要把ws2_32.lib加入到链接库的列表里面。具体步骤是:a.选择“工程”菜单下的“设置”项。b.在弹出页面中选择“Link”一项。c.将“ws2_32.lib”加入“L对象/库模块”列表当中。2、编译、连接并运行程序。3、观察程序运行的结果,体会程序中几个主要函数的作用。练习六:反复运行上述程序,可以输入以下域名:……在监控机端捕获数据并分析说明:1、名字解析器使用传输层的哪一协议来处理查询请求?2、本地名字服务员的IP地址是什么?3、名字服务员进程的端口号是什么?4、随便输入一个不带后缀的主机名(如:aaa),观察捕获到的数据。【思考问题】1、在监控机一端截获网络中的多个广播报文,观察其源MAC地址及源IP地址,是否都来自同一子网?为什么?2、分析DNS的工作原理。3、域名与IP地址之间是否有一一对应的关系?20/62【实验结论】实验六TCP数据通信【实验目的】1、掌握TCP协议的工作原理2、理解TCP协议通信的原理及通信过程【实验学时】4学时【实验类型】综合型【实验要求】1、理解TCP首部中各字段的含义及作用2、理解三次握手的过程3、能够分析TCP协议的建立连接、会话和断开连接的全过程4、学会计算TCP校验和的方法【实验原理】请参考教材第四章TCP和UDP协议,包括TCP的封装,首部格式等【实验步骤】练习一:运行netstat命令。1、在DOS命令行方式下运行:netstat–s显示每个协议的使用状态,观察TCP协议的使用情况。2、在DOS命令行方式下运行:netstat–a显示所有主机的端口号,观察与TCP协议相关的内容。练习二:运行TELNET。1、实验环境中的主控设备上的TELNET服务已经启动,并且提供一个公共帐号,其用户名:guest;口令:guest。在DOS命令提示符下运行:(a)telnet服务器主机域名;(b)在“Login:”提示符后输入用户名(guest),然后在“Password:”提示符后输入口令(guest);(c)在虚拟终端上进行一些简单的操作(可不作);(d)按“CTRL+]”回到telnet提示符下;(e)输入“quit”退出telnet。2、在监控机一端捕获数据,对该过程中仿真机发送和接收的全部TCP数据包:21/62(a)记录每个TCP数据包的TCP协议头部分,关注其中以下字段的值:源、目的端口号;(telnet服务的端口号是多少?)序号和确认序号;首部长度;ACK、SYN和FIN等标志位;窗口大小。(b)根据各字段的值分析TCP协议的建立连接、会话和断开连接的全过程。(c)根据捕获数据,计算在该TCP会话过程中本地以太网上用户有效数据的实际吞吐量是多少?练习三:编辑并发送TCP数据包。说明:在本实验中由于TCP连接有超时时间的限制,故仿真机端和监控机端的两位同学要默契配合,某些步骤(如计算TCP校验和)要求熟练、迅速。为了实现TCP三次握手过程的仿真,发送第一个连接请求帧之前,查看ARP高速缓存中是否有要与之通信的主机信息,如果没有,请运行ping命令,来获取信息。然后在“本地连接”属性处,取消仿真机端的TCP/IP协议。1、要求帧序列中包括TCP连接建立、数据传输以及断开连接的全过程。在编辑的过程中注意体会TCP首部中的序列号和标志位的作用。2、编辑TCP数据包。首先选择主控设备上的一个进程作服务器进程,并向该服务器进程发送一个建立连接请求报文,其步骤如下:(a)打开协议仿真编辑器。(b)填写该帧的以太网协议首部:①“源MAC地址”和“目的MAC地址”字段.注意如选择的目的主机与本机不在同一子网时,目的MAC地址该怎样填写;②“类型或长度”字段值应为:0800,或选择下拉菜单中的IP协议;③本实验要求源MAC地址为本机MAC地址。(c)填写IP协议头信息,注意:①协议字段,即上层协议类型应为TCP,协议类型值为6;②总长度字段的值的填写;③本实验要求源IP地址为本机IP地址。(d)填写TCP协议信息:①16位源端口号:自定②16位目的端口号:如80(HTTP协议)、110(SMTP协议)等。③32位序号:自己选择一个ISN(并记录下来,以备后面使用),并填写。④32位确认序号:无意义。⑤首部长度:5(当无可选项时)。⑥标志位:SYN必为1,其他为0。23/62⑦窗口大小:自定。⑧紧急指针:⑨选项(e)校验和:覆盖TCP首部(包含伪首部)和TCP数据两部分,计算方法同UDP协议首部中的校验和计算方法。以下是利用协议仿真编辑器计算校验和的一个例子:一个不含数据部分的TCP数据包的十六进制对照表如下:000102030405060708090A0B08004500004F944840008006E49DC0A80020C0A00520015001473C991BD94640FE70014446C727A0000其中黑体部分为用来计算校验和的TCP伪首部和TCP首部,其中:0006:为TCP伪首部中8位的0和8位的协议字段;C0A80020:为TCP伪首部中32位源IP地址;C0A80052:为TCP伪首部中32位目的IP地址;最后面的20字节为TCP首部;伪首部中16位TCP首部长度,暂时存放在16位TCP校验和字段中,在本例中该值为0014(相应字段填写的是十进制数值:20);对上述选中部分计算校验和并填回TCP校验和字段中。3、在发送该TCP连接请求帧之前,先运行一次:ping主控设备。4、暂停仿真机端的TCP/IP协议。5、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送TCP报文;6、在监控机一端截获相应的应答报文并分析。7、要求监控机一端的同学及时准确地捕获应答报文并迅速从中获得应答报文的32位ISN,并告之仿真机一端的同学;根据应答报文提供的序号,对服务器的报文进行确认,以完成TCP连接的建立。编辑该帧的步骤与上面基本相同,但要注意:(a)注意:仿真机一端的同学在完成上一步请求报文的发送后,应立即开始本步骤中除了32位应答序号及校验和以外的字段的填写;(b)32位的序号应为上述自选的ISN加1(为什么?);(c)32位的确认序号应为应答报文中服务器端的ISN加1;(d)标志位中:ACK标志应置为1,其他标志应为0。(e)注意在该步骤中计算校验和要熟练、迅速;8、点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送TCP应答报文,以完成TCP连接的建立;9、发送数据报文:发送数据内容根据具体的上层协议确定。10、断开TCP连接(a)编辑该帧的步骤与上面基本相同,但要注意在标志位中:FIN标志应置为1,其他标志应为0。23/62(b)点击工具栏或菜单栏中的“发送”,在弹出菜单上选择“发送”按钮,发送TCP释放连接请求报文。(c)在监控机一端截获相应的请求及应答报文并分析。注意:实验结束后启动仿真机端的TCP/IP协议。练习四:多TELNET客户端同时运行。1、在仿真机端同时打开两个或更多DOS命令提示符窗口,在这些窗口上同时运行:telnet服务器IP地址2、在监控机一端捕获数据,分析仿真机发送和接收的TCP数据包。说明哪些包是属于同一TCP连接上的,你是根据什么进行区分的?练习五:察看TCP、UDP会话状况。1、在监控机端选择“会话状况”,察看其中的TCP、UDP会话状况统计结果。2、捕获大量数据包,分析其中有多少TCP会话。(a)切换TAP上的按钮,将监控机连接到交换机镜像口的HUB上。(b)启动监控机端本地连接上的TCP/IP协议,即可捕获流经局域网上的所有帧。(c)以UDP协议为过滤条件,显示捕获的UDP数据包,分析其中有多少UDP会话。(d)以TCP协议为过滤条件,显示捕获的TCP数据包,分析其中有多少TCP会话?在捕获期间,存在多少TCP连接?有多少TCP连接失败?有多少TCP连接正常中断?在结束捕共获时,有多少TCP连接是活跃的?(e)将捕获的TCP数据包保存到文件:实验六.zdt。(f)观察协议统计信息。点击网络协议分析仪的“协议统计”功能,察看各协议的统计信息,在IP协议的统计信息中,TCP、UDP协议所占的百分比如何?【思考问题】结合实验过程中的实验结果,回答下列问题1、如果在实验三发送建立连接请求帧之前,仿真机端不运行“PING服务器”命令,而又停止了仿真机端的TCP/IP协议,可能出现什么情况?通过实验来验证你的答案。2、根据练习四说明:在仿真机端,系统是如何把接收到的数据显示到相应的窗口的。3、分析TCP协议所使用的滑动窗口协议机制。【实验结论】24/62实验七SOCKET网络程序设计【实验目的】1、理解进程通信的原理及通信过程2、掌握基本的网络编程方法【实验学时】4学时【实验类型】综合型【实验要求】1、进一步掌握UDP及TCP协议的工作原理2、掌握SOCKET编程的基本方法3、学习应用C语言与WinSock2进行简单的无连接的网络程序设计,实现网络数据传输4、学习应用C语言与WinSock2进行简单的面向连接的网络程序设计,实现网络数据传输【实验原理】1、关于使用套接字编程的一些基本概念(a)半相关与全相关半相关在网络中,用一个三元组可以在全局唯一标志一个进程: (协议,本地地址,本地端口号)这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。全相关一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要一个五元组来标识:(协议,本地地址,本地端口号,远地地址,远地端口号)这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。(b)TCP/IP协议的地址结构为:structsockaddr_in{ shortsin_family; /*AF_INET*/ u_shortsin_port; /*16位端口号,网络字节顺序*/ structin_addrsin_addr;/*32位IP地址,网络字节顺序*/ charsin_zero[8]; /*保留*/}(c)套接字类型TCP/IP的socket提供下列三种类型套接字。25/62流式套接字(SOCK_STREAM)提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。数据报式套接字(SOCK_DGRAM)提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。原始式套接字(SOCK_RAW)该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。(d)基本套接字系统调用为了更好地说明套接字编程原理,下面给出几个基本套接字系统调用说明。(1)创建套接字──socket()应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:SOCKETsocket(intaf,inttype,intprotocol);该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type描述要建立的套接字的类型。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号。因此,socket()系统调用实际上指定了相关五元组中的“协议”这一元(2)指定本地地址──bind()当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。namelen表明了name的长度。如果没有错误发生,bind()返回0。否则返回值SOCKET_ERROR。地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对套接字地址结构必须有明确认识。(3)建立套接字连接──connect()与accept()这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立“连接”,便能判断该端口不可操作。而26/62accept()用于使服务器等待来自某客户进程的实际连接。connect()的调用格式如下:intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数s是欲建立连接的本地套接字描述符。参数name指出说明对方套接字地址结构的指针。对方套接字地址长度由namelen说明。如果没有错误发生,connect()返回0。否则返回值SOCKET_ERROR。在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族相关。因此bind()和connect()无须协议作为参数。accept()的调用格式如下:SOCKETaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);参数s为本地套接字描述符,在用做accept()调用的参数前应该先调用过listen()。addr指向客户方套接字地址结构的指针,用来接收连接实体的地址。addr的确切格式由套接字创建时建立的地址族决定。addrlen为客户方套接字地址的长度(字节数)。如果没有错误发生,accept()返回一个SOCKET类型的值,表示接收到的套接字的描述符。否则返回值INVALID_SOCKET。accept()用于面向连接服务器。参数addr和addrlen存放客户方的地址信息。调用前,参数addr指向一个初始值为空的地址结构,而addrlen的初始值为0;调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,而连接请求是由客户方的connect()调用发出的。当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。新的套接字可用于处理服务器并发请求。四个套接字系统调用,socket()、bind()、connect()、accept(),可以完成一个完全五元相关的建立。socket()指定五元组中的协议元,它的用法与是否为客户或服务器、是否面向连接无关。bind()指定五元组中的本地二元,即本地主机地址和端口号,其用法与是否面向连接有关:在服务器方,无论是否面向连接,均要调用bind();在客户方,若采用面向连接,则可以不调用bind(),而通过connect()自动完成。若采用无连接,客户方必须使用bind()以获得一个唯一的地址。以上讨论仅对客户/服务器模式而言,实际上套接字的使用是非常灵活的,唯一需遵循的原则是进程通信之前,必须建立完整的相关。(4)监听连接──listen()此调用用于面向连接服务器,表明它愿意接收连接。listen()需在accept()之前调用,其调用格式如下:intlisten(SOCKETs,intbacklog);参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。如果没有错误发生,listen()返回0。否则它返回SOCKET_ERROR。listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。27/62调用listen()是服务器接收一个连接请求的四个步骤中的第三步。它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用。(5)数据传输──send()与recv()当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:intsend(SOCKETs,constcharFAR*buf,intlen,intflags);参数s为已连接的本地套接字描述符。buf指向存有发送数据的缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否发送带外数据等。如果没有错误发生,send()返回总共发送的字节数。否则它返回SOCKET_ERROR。recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:intrecv(SOCKETs,charFAR*buf,intlen,intflags);参数s为已连接的套接字描述符。buf指向接收输入数据缓冲区的指针,其长度由len指定。flags指定传输控制方式,如是否接收带外数据等。如果没有错误发生,recv()返回总共接收的字节数。如果连接被关闭,返回0。否则它返回SOCKET_ERROR。(6)输入/输出多路复用──select()select()调用用来检测一个或多个套接字的状态。对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。请求给定状态的套接字集合由一个fd_set结构指示。在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时,select()调用返回满足条件的套接字的数目,其调用格式如下:intselect(intnfds,fd_setFAR*readfds,fd_setFAR*writefds,fd_setFAR*exceptfds,conststructtimevalFAR*timeout);参数nfds指明被检查的套接字描述符的值域,此变量一般被忽略。参数readfds指向要做读检测的套接字描述符集合的指针,调用者希望从中读取数据。参数writefds指向要做写检测的套接字描述符集合的指针。exceptfds指向要检测是否出错的套接字描述符集合的指针。timeout指向select()函数等待的最大时间,如果设为NULL则为阻塞操作。select()返回包含在fd_set结构中已准备好的套接字描述符的总数目,或者是发生错误则返回SOCKET_ERROR。(7)关闭套接字──closesocket()closesocket()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。closesocket()的调用格式如下:BOOLclosesocket(SOCKETs);参数s待关闭的套接字描述符。如果没有错误发生,closesocket()返回0。否则返回值SOCKET_ERROR。2、用于无连接协议(如UDP)的SOCKET系统调用流程框图:28/62SSocket()Bind()等待来自客户的数据recvfrom()sendto()数据处理服务员数据(请求)数据(回答)Socket()sendto()recvfrom()客户bind()3、面向连接协议(如TCP)的SOCKET系统调用流程框图:29/62Listen()Socket()Listen()Socket()Bind()等待来自客户的连接请求accept()send()recv()数据处理服务员建立连接数据(请求)数据(回答)send()Socket()connect()recv()客户4、其他原理请参考教材:第四章TCP和UDP协议【实验步骤】练习一:使用UDP协议的无连接客户-服务员程序设计。根据实验原理中介绍的内容,设计一个无连接的客户-服务员系统,实现二者之间的数据传递。下面是一个简单的UDP客户-服务员程序的实例,作为参考。说明:下述服务员程序保存在服务器端,可以直接从服务器拷贝,并稍作修改(如服务员IP地址)后在本地进行编译连接并运行。数据采集器的红色按钮要求按出来,使监控机捕获到局域网的数据。#include<stdio.h>#include<winsock.h>#defineSERV_UDP_PORT6000/*服务员进程端口号,视具体情况而定*/30/62#defineSERV_HOST_ADDR"8"/*服务员地址,视具体情况而定*//*宏定义用来打印错误消息*/#definePRINTERROR(s) \ fprintf(stderr,"\n%:%d\n",s,WSAGetLastError())//////////////////////////////////////////////////////////////数据报通信的服务员端子程序//////////////////////////////////////////////////////////////voidDatagramServer(shortnPort){ SOCKETtheSocket; /*创建一个数据报类型的socket*/ theSocket=socket(AF_INET, //地址族 SOCK_DGRAM,//socket类型 IPPROTO_UDP);//协议类型:UDP/*错误处理*/ if(theSocket==INVALID_SOCKET) { PRINTERROR("socket()"); return; } /*填写服务员地址结构*/ SOCKADDR_INsaServer; saServer.sin_family=AF_INET; saServer.sin_addr.s_addr=INADDR_ANY;//由WinSock指定地址 saServer.sin_port=htons(nPort); //服务员进程端口号 /*将服务员地址与已创建的socket绑定*/ intnRet; nRet=bind(theSocket, //Socket描述符31/62 (LPSOCKADDR)&saServer,//服务员地址 sizeof(structsockaddr) //地址长度 );/*错误处理*/ if(nRet==SOCKET_ERROR) { PRINTERROR("bind()"); closesocket(theSocket); return; } /*等待来自客户端的数据*/ SOCKADDR_INsaClient;charszBuf[1024]; intnLen; while(1) { /*准备接收数据*/ memset(szBuf,0,sizeof(szBuf)); nRet=recvfrom(theSocket, //已绑定的socket szBuf, //接收缓冲区 sizeof(szBuf), //缓冲区大小 0, //Flags (LPSOCKADDR)&saClient, //接收客户端地址的缓冲区 &nLen); //地址缓冲区的长度 /*打印接收到的信息*/ printf("\nDatareceived:%s",szBuf); /*发送数据给客户端*/ strcpy(szBuf,"FromtheServer"); sendto(theSocket, //已绑定的socket32/62 szBuf, //发送缓冲区 strlen(szBuf), //发送数据的长度 0, //Flags (LPSOCKADDR)&saClient, //目的地址 nLen); //地址长度 } closesocket(theSocket); return;}//////////////////////////////////////////////////////////////数据报服务员端主程序//////////////////////////////////////////////////////////////voidmain(){ WORDwVersionRequested=MAKEWORD(1,1); WSADATAwsaData; intnRet; shortnPort; nPort=SERV_UDP_PORT; /*初始化Winsock*/ nRet=WSAStartup(wVersionRequested,&wsaData); if(wsaData.wVersion!=wVersionRequested) { fprintf(stderr,"\nWrongversion\n"); return; } /*调用数据服务员子程序*/ DatagramServer(nPort); /*结束WinSock*/33/62 WSACleanup();}请学生认真阅读分析上述服务员程序,然后根据实验原理二中介绍的内容,自行编写相应的无连接的客户端程序并运行。从而实现客户和服务器间的数据传输。。在仿真机一端运行客户端进程,在监控机端捕获数据并进行分析。练习二:使用TCP协议的面向连接的客户-服务员程序设计。根据实验原理中介绍的内容,设计一个面向连接的客户-服务员系统,实现二者之间的数据传递。下面是一个简单的TCP客户-服务员程序的服务员程序:面向连接的服务员程序:#include<PROCESS.H>#include<windows.h>#include<winsock.h>#include<sys/types.h>#include<fcntl.h>#include<wsipx.h>#include<wsnwlink.h>#include<stdio.h>#defineSERV_TCP_PORT6000/*服务员进程端口号,视具体情况而定*/#defineSERV_HOST_ADDR"0"/*服务员IP,视具体情况而定*/intsockfd;/////////////////////////////////////////////////////////////////线程用来处理客户端的请求////服务员主进程每与某客户端建立一个连接之后,便启动一个新的线程来处理接下////客户端的请求,参数为服务员与该客户端的连接点:socket////////////////////////////////////////////////////////////////DWORDClientThread(void*pVoid){ intnRet; charszBuf[1024]; memset(szBuf,0,sizeof(szBuf));34/62/*接收来自客户端的数据信息*/ nRet=recv((SOCKET)pVoid, //与客户端连接的socket szBuf, //接收缓冲区 sizeof(szBuf), //缓冲区长度 0); //Flags/*错误处理*/ if(nRet==INVALID_SOCKET) { printf("recv()"); closesocket(sockfd); closesocket((SOCKET)pVoid); return0; } /*显示接收到的数据*/ printf("\nDatareceived:%s\n",szBuf); /*发送数据给客户端*/ strcpy(szBuf,"FromtheServer");//发送内容 nRet=send((SOCKET)pVoid, //与客户端连接的socket szBuf, //数据缓冲区 strlen(szBuf), //数据长度 0); //Flags/*结束连接,释放socket*/ closesocket((SOCKET)pVoid); return0;}////////////////////////////////////////////////////////////////服务员主程序:////在一个众所周知的端口上等待客户的连接请求////有请求到来时建立与客户端的连接,并启动一个线程处理该请求////////////////////////////////////////////////////////////////intmain()35/62{ intclilen; intpHandle=-1; structsockaddr_inserv_addr; SOCKET socketClient; DWORD ThreadAddr; HANDLE dwClientThread; SOCKADDR_IN SockAddr; /*初始化WinsockAPI,即连接Winsock库*/ WORDwVersionRequested=MAKEWORD(1,1); WSADATAwsaData; if(WSAStartup(wVersionRequested,&wsaData)){ printf("WSAStartupfailed%s\n",WSAGetLastError()); return-1; } /*打开一个TCPSOCKET*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) printf("server:can'topenstreamsocker\n"); /*绑定本地地址,以便客户端连接*/ memset((char*)&serv_addr,0,sizeof(structsockaddr_in)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(SERV_TCP_PORT); if(b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老师好电影观后感500字汇编3篇
- 语法专题二 代词2【考点精讲精练】-2023年中考语法一点通(学生版)
- 繁星春水读后感范文
- 《技术的性质》说课稿(附教学设计)
- 2024-2025学年湖南省长沙市某中学大联考高三(上)月考数学试卷(一)(含答案)
- 山东省德州市平原县三校联考2024-2025学年四年级上学期11月期中科学试题
- 第三单元 小数的意义和性质单元测试(含答案)苏教版 五年级上册数学
- 浙江地区高考语文五年高考真题汇编作文
- 技术服务合同协议范例
- 2024年法院认可离婚协议书
- 信息资源目录编制规范(用于个人参考学习版本)
- 互联网的定义及发展历程
- 基层工会内部控制制度范文五篇
- 马克思主义基本原理智慧树知到课后章节答案2023年下齐鲁工业大学
- 苏教版译林初中英语词汇表(七年级至九年级)
- 学而思小学奥数知识体系
- 2016年软考中级系统集成项目管理工程师下午《应用技术》真题及答案
- 电火花试验报告
- 儿童文学教程第2版(学前教育专业)PPT全套完整教学课件
- 学做小小理财师
- 宝宝白细胞高怎么回事:新生儿含有白细胞
评论
0/150
提交评论