计算机网络实验报告79221351.docx
- 文档编号:25039404
- 上传时间:2023-06-04
- 格式:DOCX
- 页数:19
- 大小:770.58KB
计算机网络实验报告79221351.docx
《计算机网络实验报告79221351.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告79221351.docx(19页珍藏版)》请在冰豆网上搜索。
计算机网络实验报告79221351
计算机网络实验报告
实验一使用winpcap网络层收发包实验
一.实验目的.
1、了解数据链路层通信的基本方法;
2、了解pcap编程方法。
二.实验步骤及结果
1.查询本机mac地址,IP地址,路由器物理地址
(1)进入windows命令输入框:
点击开始菜单→运行→输入cmd,然后回车:
(2)在出现的windows命令输入中输入ipconfig/all命令查看主机的网络参数
(3)输入arp–a命令查看路由器的参数。
2.运行test.dsw程序,选择合适的网卡填入projectsettingdebug中
3.打开ethereal进行侦听,同时运行fs.dsw,观察到如下结果,实验成功
三.实验相关算法及函数
(1)定义了一个链表的结点pcap_if()
pcap_if{
structpcap_if*next;//指针
char*name;//给pcap_open_live()函数传递的一个描述设备名称的字符串指针
char*description;//如果不为NULL,则指向描述设备的一个可读字符串
structpcap_addr*addresses;//一个指向接口地址链表的第一个元素的指针
bpf_u_int32flags;//接口标志
};
(2)获取本地设备列表函数pcap_findalldevs_ex(char*source,structpcap_rmtauth*auth,pcap_if_t**alldevs,char*errbuf);
该函数创建一个能用pcap_open函数打开的网络适配器设备列表。
“source”是一个告诉函数在哪儿查找设备的参数,是一个字符型的缓冲区,根据新的WinPcap语法保存着“源的位置”。
参数auth是一个指向pcap_rmtauth结构体的指针。
该指针保持着认证RPCAP连接到远程主机所需的信息。
该参数对本地主机请求没什么意义,此时可以设为NULL。
参数alldevs是一个“pcap_if_t”结构体类型的指针,在该函数中被正确的分配。
该函数成功返回时,该指针被设置为指向网络设备链表的第一个元素,该链表的每个元素都是“pcap_if_t”类型。
参数errbuf是一个指向用户分配的缓冲区(大小为PCAP_ERRBUF_SIZE)的指针,如果函数操作出现错误,该缓冲区将存储该错误信息。
函数成功则返回0,如果有错误则返回-1。
“alldevs”变量返回设备列表,当函数正确返回时,“alldevs”不能为NULL。
也就是说,当系统没有任何接口时,该函数也返回-1。
“errbuf”变量返回错误信息
(3)pcap_freealldevs函数
由函数pcap_findalldevs_ex或pcap_findalldevs函数返回的网络适配器设备链表,必须调用pcap_freealldevs函数释放。
(4)函数pcap_open(constchar*source,intsnaplen,intflags,intread_timeout,structpcap_rmtauth*auth,char*errbuf);
参数source是以’\0’结尾的字符串,包含所需打开源的名称。
该源名称必需包含格式化的前缀,并要求符合新“源规范语法”的规定,也可以为NULL。
参数snaplen是必须保留的数据包长度。
对于过滤器所接收的每个数据包,只有开始snaplen字节的内容被存储到缓冲区中,并被传递给用户层的应用程序。
参数read_timeout是以毫秒为单位的读取超时时间。
读取超时用来处理,捕获一个数据包后,读操作并不必需要立即返回的情况。
但这可能等待一些时间以允许捕获更多的数据包,这样用户层的一次读操作就可从操作系统的内核中读取更多的数据包。
参数auth是一个指向一个pcap_rmtauth结构体的指针,该结构体保存远程机器上用户所需的认证信息。
万一这不是一个远程捕获,该指针可以被设置为NULL。
参数errbuf指向用户所分配的一个缓冲区,将用来存储该函数的错误信息。
函数返回一个指向”pcap_t”的指针,将作为后续调用的参数(如pcap_sendpacket()等等),其描述了一个已打开的WinPcap会话。
如果出现问题,函数返回NULL,并通过”errbuf”变量保存错误信息。
(5)函数pcap_next_ex(pcap_t*,structpcap_pkthdr**,constu_char**)
从一个网络接口或离线捕获方式(例如读文件)读取一个数据包。
该函数被用来重新获得下一个可用的数据包,没有使用libpcap提供的传统的回调方法。
pcap_next_ex用指向头和下一个被捕获的数据包的指针为pkt_header和pkt_data参数赋值。
(6)函数intpcap_sendpacket(pcap_t*p,constu_char*buf,intsize)
其中参数p是用来发送数据包的一个pcap_t类型描述符,即发送数据包的接口,参数buf包含所要发送数据包的数据(包含数据包的协议头),参数size是buf所指缓冲区的大小,也就是所要发送数据包的大小。
无需包含MAC的CRC,因为它被网络接口的驱动程序计算并添加。
该函数如果成功就返回0,否则返回-1。
(7)函数char*pcap_geterr(pcap_t*p)
返回最后一个pcap库错误消息。
实验二跨网络数据传输实验
一.实验目的.
1、了解IP地址与硬件地址的区别,掌握IP包结构;
2、理解ICMP包的回送和回送响应消息功能;
二.实验步骤及结果.
(1)修改程序中的IP地址,目的IP,主机MAC,路由器MAC
(2)运行程序,打开程序进行侦听.
三.实验相关算法及函数(实验一中出现解释的已省略)
(1)memset(void*s,intd,size_t)
将s所指向的某一块内存中的每个字节的内容全部设置为d指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向S的指针。
(2)checksum(USHORT*buffer,intsize)
首先将IP首部的校验和字段设为0(IP_HEADER.checksum=0),然后计算整个IP首部(包括选项)的二进制反码的和
(3)函数externvoid*memcpy(void*dest,void*src,unsignedintcount);
由src所指内存区域复制count个字节到dest所指内存区域
(4)函数voidpcap_close(pcap_t*p)
关闭p参数相应的文件,并释放资源。
实验三传输层网络数据收发
一.实验目的.
1、了解IP地址与硬件地址的区别;
2、理解ICMP包的回送和回送响应消息功能;
3、掌握利用Winpcap发送数据包的方法。
二.实验步骤及结果.
(1)打开sevsr文件夹中的CPP.1,运行
(2)打开client文件夹中的程序,编辑想要发送的数据,结果如下
三.实验相关算法及函数
(1)SOCKETPASCALFARsocket(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()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关。
其调用格式如下:
intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);
参数s是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
参数name是赋给套接字s的本地地址(名字),其长度可变,结构随通信域的不同而不同。
namelen表明了name的长度。
如果没有错误发生,bind()返回0。
否则返回值SOCKET_ERROR。
(3)建立套接字连接──connect()与accept()
这两个系统调用用于完成一个完整相关的建立,其中connect()用于建立连接。
无连接的套接字进程也可以调用connect(),但这时在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。
这样做的优点是程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与任何套接字建立"连接",便能判断该端口不可操作。
而accept()用于使服务器等待来自某客户进程的实际连接。
connect()的调用格式如下:
intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);
参数s是欲建立连接的本地套接字描述符。
参数name指出说明对方套接字地址结构的指针。
对方套接字地址长度由namelen说明。
如果没有错误发生,connect()返回0。
否则返回值SOCKET_ERROR。
在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。
由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket()调用与某个协议族
accept()的调用格式如下:
SOCKETPASCALFARaccept(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()之前调用,其调用格式如下:
intPASCALFARlisten(SOCKETs,intbacklog);
参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它上面接收请求。
backlog表示请求连接队列的最大长度,用于限制排队请求的个数,目前允许的最大值为5。
如果没有错误发生,listen()返回0。
否则它返回SOCKET_ERROR。
listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必须的连接,并建立长度为backlog的请求连接队列。
调用listen()是服务器接收一个连接请求的四个步骤中的第三步。
它在调用socket()分配一个流套接字,且调用bind()给s赋于一个名字之后调用,而且一定要在accept()之前调用程序在使用套接字前,首先必须拥有一个套接字,
(5)数据传输──send()与recv()
当一个连接建立以后,就可以传输数据了。
常用的系统调用有send()和recv()。
send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:
intPASCALFARsend(SOCKETs,constcharFAR*buf,intlen,intflags);
参数s为已连接的本地套接字描述符。
buf指向存有发送数据的缓冲区的指针,其长度由len指定。
flags指定传输控制方式,如是否发送带外数据等。
如果没有错误发生,send()返回总共发送的字节数。
否则它返回SOCKET_ERROR。
recv()调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据,格式如下:
intPASCALFARrecv(SOCKETs,charFAR*buf,intlen,intflags);
参数s为已连接的套接字描述符。
buf指向接收输入数据缓冲区的指针,其长度由len指定。
flags指定传输控制方式,如是否接收带外数据等。
如果没有错误发生,recv()返回总共接收的字节数。
如果连接被关闭,返回0。
否则它返回SOCKET_ERROR。
(6)输入/输出多路复用──select()
select()调用用来检测一个或多个套接字的状态。
对每一个套接字来说,这个调用可以请求读、写或错误状态方面的信息。
请求给定状态的套接字集合由一个fd_set结构指示。
在返回时,此结构被更新,以反映那些满足特定条件的套接字的子集,同时,select()调用返回满足条件的套接字的数目,其调用格式如下:
intPASCALFARselect(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()的调用格式如下:
BOOLPASCALFARclosesocket(SOCKETs);
参数s待关闭的套接字描述符。
如果没有错误发生,closesocket()返回0。
否则返回值SOCKET_ERROR。
实验四网络协议分析实验
一.实验目的.
1、协议分析的方法;
2、理解ICMP包的回送和回送响应消息功能;
3、掌握ping命令的运行过程。
二.实验内容.
1、使用Ping命令测试目标主机是否在线。
2、利用Ethreal截获数据包,分析三次握手机制。
实验五网络命令的使用
一.实验目的.
1、掌握各个网络命令的运行方法;
2、理解网络命令的运行原理;
二.实验内容
1.输入命令。
2.利用Ethreal截获数据包,各个命令的运行结果。
三.实验步骤
(1)ARP命令
(2)Ipconfig命令
/all
/renew
/renew
(3)Nbtstas命令
-aremotename
-AIPaddress
-c
-n
-r
-S
-s
Interval
(4)net命令
(5)Netstat命令
-a
-r
-p
(6)route命令
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 实验 报告 79221351