网络抓包设计及实现(课程设计
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
)
目录
1设计题目 .............................................................................................. 2 2开发环境及工具 .................................................................................. 2 3设计思想与算法结构 ........................................................................... 2
3.1 TCP相关背景知识 ................................................................... 2
3.2 数据报格式 ............................................................................... 3
3.2.1 TCP数据报报头格式 ...................................................... 3
3.2.2 IP数据报格式 ................................................................. 5
3.3 TCP数据包发送基本设计思想 ................................................ 6
3.3.1利用Java开源库JPcap .................................................... 6
3.3.2利用网络抓包工具WinPcap .............................................. 6
3.3.3 填充TCP包、IP包及发送 ............................................. 7
3.3.3.1 填充TCP包、IP包 .................................................... 7
3.3.3.2 发送TCP数据包 ......................................................... 7
3.3.3.3 TCP数据包发送步骤及
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图 .................................. 7
4源程序及执行代码说明 ....................................................................... 8 5调试过程及运行结果 ......................................................................... 11 5.1 调试及运行结果............................................................................ 11 5.2 运行结果 ....................................................................................... 12 6收获及体会 ........................................................................................ 14
武汉理工大学《计算机网络》课程设计报告
发送TCP数据包
1设计题目
本课程设计的功能是填充一个TCP数据包,并发送给目的主机。 1)以命令行的形式运行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP 是程序名,source_ip为源IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。
2)其他的TCP头部参数自行设定。
3)数据字段为“This is my homework of network,I am happy!”。
4)成功发送后在屏幕上显示“Send OK”。
2开发环境及工具
Eclipse SDK 3.2、JDK1.5.0_12、Java开源库JpcapSetup-0.7、WinPcap_4_0_1 3设计思想与算法结构
3.1 TCP相关背景知识
传输控制
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的运输层通信协议。在简化的计算机网络OSI模型中,它完成运输层所指定的功能。TCP提供一种面向连接的、可靠的字节流服务。
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN,ACK。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。第一次握手:建立连接时,客户端发送SYN包(SEQ=x)到服务器,并进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包
武汉理工大学《计算机网络》课程设计报告
ACK(ACK=y+1),此包发送完毕,客户端和服务器时入Established状态,完成三次握手。
TCP传输过程如图1所示
图 1
当应用进程有报文需要通过TCP发送时,它就将此应用层报传送给执行
TCP协议的传输实体。TCP传输实体将用户数据加上TCP报头,形成TCP数
据包,在TCP数据包上增加IP头部,形成IP包。
TCP协议的数据传输单元称为报文段,其格式如图2所示。报文段报头
的长度为20B~60B。其中固定长度是20B,选择部分长度最多为40B。
TCP数据包加上IP包报头形成IP包,如图2所示
图 2
3.2 数据报格式
3.2.1 TCP数据报报头格式
TCP报文段数据结构如图3所示
武汉理工大学《计算机网络》课程设计报告
图 3
TCP报文段主要包括以下字段:
?端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是16位,分别表示发送该TCP包的应用进程的端口号和接受该TCP包的应用进程的端口号。
?序号:长度为32位。由于TCP协议是面向数据流的,它所传送的报文段可以视为连续的数据流,因此需要给每个字节一个字节编号。序号字段的“序号”指的是本报文段数据的第一个字节的顺序号。
?确认号:该字段的长度为32位,它表示接收端希望接收的下一个TCP包的第一个字节的序号。
?报头长度:该字段长度为4位。TCP报头长度是以4B为一个单元来计算的,实际上报头长度在20B~60B之间。因此这个字段的值在5~15之间。
?保留:长度为6位,留作今后使用,目前全部置0。
?控制:这个字段定义了6种不同的标志,每个标志占一位,在同一时间可以设置一位或多位。URG位为1时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓存中存放一段时间。RST位为1时,表明要强制切断连接。SYN位为1时,表明有确立连接的请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN位为1时,表明发送方已经没有数据发送了。
?窗口大小:长度为16位,窗口对应的数据是以字节为单位的数据,因此最多能够传送的数据为65535B。
武汉理工大学《计算机网络》课程设计报告
?紧急指针:该字段长度为16位,指向必须紧急处理的数据的位置,只有当标志URG=1时,紧急指针才有效。从TCP报头后面的报文数据开始,到紧急指针所指出长度的数据,就是必须紧急处理的数据。
?选项:该字段可以多达40B,包括单字节选项和多字节选项。
?校验和:该字段长度为16位,校验和的校验范围包括伪头部,TCP报头以及应用层来的数据。其计算方法和IP协议头部校验和的计算方法一样。伪头部为12B,它本身并不是他、TCP数据包的真正头部,只是在计算校验和时,临时和TCP数据包连接在一起。
3.2.2 IP数据报格式
IP数据包数据结构如图4所示:
图 4
本课程设计要求用命令行将IP地址和端口(Port)填充到数据包的相应字段,IP地址则填充到IP数据包的源地址或者目的地址字段。
IP数据报包含以下各个字段:
?版本:用来表明建立数据报的IP版本,IPv4的字段为0100;
?首部长度:占4比特字段,因此首部最长为60个字节;
?服务类型:TOS;
?总长度:总长度字段是指整个I P数据报的长度,以字节为单位.由于该
武汉理工大学《计算机网络》课程设计报告
字段长16比特,所以I P数据报最长可达65535字节;
?标识:当前数据包;
?标志:标志数据包是否可拆分以及是否拆分后的数据包的最后一部分等信
息;
?片偏移:用于指定分段在原始数据报中的位置;
?生存时间:8比特,用于指定数据报允许保留在网络上的时间;
?协议:8比特,用于指定数据报数据区中携带的消息是由哪种高级协议建
立的。ICMP为1,TCP为6,UDP为17;
?首部检验和:16比特,仅用于IP报头校验和;
?源地址:源IP地址;
?目的地址:目的IP地址;
?选项、可选字段:填充字段用于确保将选项字段填充为最少32个比特位,
以保证IP报头以32位结束;
3.3 TCP数据包发送基本设计思想
3.3.1利用Java开源库JPcap
JDK包只提供网络层以上的功能,以下的功能需要用到其他包。Jpcap是一个能够抓取与发送网络数据包的Java组件,我们可以使用Jpcap从一个网络接口获取数据包,然后在Java中对它们进行分析和显示。同样也可以通过一个网络接口发送任意数据包。Jpcap当前能够捕获以太网,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4数据包。
3.3.2利用网络抓包工具WinPcap
Jpcap功能的实现从本质上将是通过调用WinPcap完成的。WinPcap(Windows Packet Capture)是Windows平台下一个免费,公共的网络访问系统。WinpCap用于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:
1) 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换
武汉理工大学《计算机网络》课程设计报告
的数据报;
2) 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉; 3) 在网络上发送原始的数据报;
4) 收集网络通信过程中的统计信息。
3.3.3 填充TCP包、IP包及发送
3.3.3.1 填充TCP包、IP包
填充TCP数据包和IP数据包
开源库Jpcap已经创建了TCPPacket类和IPPacket类,而且提供了相应的构造函数对创建的实例进行初始化。所以对TCP包和IP包的填充,即可通过相应的构造函数对其参数进行设置。
3.3.3.2 发送TCP数据包
发送TCP数据包:
开源库Jpcap创建了一个JpcapSender类用于对各种类型的数据包进行发送,发送时只需将数据包以参数的形式传递给JpcapSender的一个方法 sendPacket(TCPPacket);
3.3.3.3 TCP数据包发送步骤及流程图
TCP数据包发送步骤:
1)调用Jpcap包里面的JpcapCaptor类的静态方法getDevceList()来获取可用的网络设备,如虚拟拨号和以太网卡等;
2)选择相应的网络设备,对其进行初始化,得到相应设备的一个JpcapSender的一个实例;
3)创建一个TCPPacket的实例,并对其进行初始化,即填充TCP数据包;
4)对包含创建的TCPPacket实例的IP数据包参数设置,即填充IP数据包;
5)设置数据链路层帧的源MAC和目的MAC;
6)调用2)中的得到的JpcapSender的实例发送TCPPacket;
武汉理工大学《计算机网络》课程设计报告
TCP数据包发送流程图如图5所示:
调用Jpcap.getDeviceList()获
取可用的网络设备
初始化网络设备,并返回
JpcapSender实例
创建TCPPacket实例,并填充
对载体IPPacket填充
设置源MAC和目的MAC
N
发送指定数目
Y
关闭网络设备
结束
图 5
4源程序及执行代码说明
SendTcp.java用与根据命令行的参数向指定端口发送TCPPaket。
武汉理工大学《计算机网络》课程设计报告
import java.net.InetAddress;
import jpcap.*;
import jpcap.packet.EthernetPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.TCPPacket;
class SendTCP
{
public static void main(String[] args) throws java.io.IOException{
NetworkInterface[] devices = JpcapCaptor.getDeviceList();//获取设备
if(args.length!=4){//命令行参数检查
System.out.println("Usage: java SentTCP
");
System.exit(0);
}
JpcapSender sender=JpcapSender.openDevice(devices[1]);//使用网卡
//填充TCP数据包
TCPPacket p=new
TCPPacket(Integer.parseInt(args[1]),Integer.parseInt(args[3]),56,78,f
alse,false,false,false,true,true,true,true,10,10);
//填充IP数据包
p.setIPv4Parameter(0,false,false,false,0,false,false,false,0,10101
01,100,IPPacket.IPPROTO_TCP,
InetAddress.getLocalHost(),InetAddress.getLocalHost());
//填充TCP数据包数据
p.data=("This is my homework of network,I am happy!").getBytes();
//帧格式设置
EthernetPacket ether=new EthernetPacket();
ether.frametype=EthernetPacket.ETHERTYPE_IP;
//源MAC设置
ether.src_mac=new
byte[]{(byte)0x00,(byte)0x16,(byte)0x32,(byte)0x2D,(byte)0xE1,(
byte)0x02};
//目的MAC设置
ether.dst_mac=new
byte[]{(byte)0x00,(byte)0x16,(byte)0x32,(byte)0x2D,(byte)0xE1,(
byte)0x02};
p.datalink=ether;
for(int i=0;i<1000;i++) //循环发送1000次,便于接受检测
sender.sendPacket(p);
System.out.println("Send Ok!");//发送成功
}
}
武汉理工大学《计算机网络》课程设计报告
为了验证自己发送的TCP数据包是否真的发送成功,我写了一个接受程序,
对其进行接收,并将TCP包的端口源端口、目的端口地址写到*.txt文件。 CpaturePacket.java
import java.io.*;
import jpcap.*;
import jpcap.packet.*;
public class CapturePackage implements PacketReceiver{
TCPPacket tcp; //每次抓到一个包时,tcp是其引用
static String name;//txt文件名
int count=0;//抓到的包的个数
String temp;
public void receivePacket(Packet packet){
if(packet instanceof TCPPacket){
count++;
System.out.println("NO."+count);
tcp=(TCPPacket)packet;
temp=new String(tcp.data);//获取TCPPacket中的数据部分
System.out.println(temp);//打印数据,即This is my network…….
try{
System.out.println(tcp.src_port+"->"+tcp.dst_port+"\t");
RandomAccessFile file = new RandomAccessFile(name, "rw");
//把IP数据包写入到文本文件
file.seek(rf.length()); //定位文件指针在文件中的最后
file.writeBytes(tcp.src_port+"->"+tcp.dst_port+"\t");
file.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws java.io.IOException{
name = args[0]; //args[0]中包含txt文件名
NetworkInterface[] devices = JpcapCaptor.getDeviceList(); //获取设备
NetworkInterface deviceName = devices[1]; // 打开网卡设备
JpcapCaptor jpcap = JpcapCaptor.openDevice(deviceName, 1028,true,
100);
jpcap.loopPacket(1000, new CapturePackage()); //循环获取1000个数据包,
}
}
武汉理工大学《计算机网络》课程设计报告
5调试过程及运行结果
5.1 调试及运行结果
对程序的调试过程主要就是对新引进的Java开源库Jpcap的学习学习过程,单单的将Jpcap包加载到当前工程sendTcpPacket下是不能正常工作的。还需要一些其他的软件支持与设置。
首先,安装WinCap.exe,Jpcap是一个中间件,它的很多基本函数声明为native而没有定义,其具体定义在就在WinCap.exe提供的文件中。
其次,将Jpcap的动态链接库文件复制到jdk\bin和jre\bin目录下,将Jpcap.jar复制到jdk\lib\ext和jre\lib目录下。
最后,设置sendTcpPacket工程属性,将Jpcap.jar加载到当前构建路径下。如图6所示:
图 6
武汉理工大学《计算机网络》课程设计报告
5.2 运行结果
设置抓包程序CapturePaket的运行参数将结果保存到port_record.txt文件中,如下图7所示:
图 7
设置SendTcp命名行参数,如下图8所示:
图 8
注意:以上两个程序,Capture.java先运行,然后立刻运行SendTcp.java。
从Eclipse控制台中可以看到CapturePacket.java抓到了SendTcp.java发送的TCP数据包(前3个TCP数据包不是),如图9所示:
武汉理工大学《计算机网络》课程设计报告
当发送稳定的时候,可以看到所有的TCP数据包都是SendTcp.java发送的,如图10所示:
图 10
打开port_record.txt文件,如11所示:
图 11
武汉理工大学《计算机网络》课程设计报告
6收获及体会
通过此次课程设计,我学到了以下东西:
1) 对书本所学的知识进行了具体的实践,这样对知识的掌握就不是停留在
理论方面,而是可以将理论进行实践,进一步增强对知识的理解与掌握。
2) 由于Java语言提供的Jdk只对网络层以上提供服务,网络层以下的服务
必须依赖外来的开源包。通过对Jpcap提供的doc的阅读,使我掌握了
正确使用Jpcap的方法,学习新的东西,这是我的一个收获。
3) 在以前的编程中,首先考虑到的一个问题是如何去实现它,而同样同等
的代码
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
往往会被忽略,此次课程设计,我参考了Java语言及Eclipse
中的相关默认规范,使代码的可读性上升了一个层次。
通过此次课程设计,我体会到的主要是:
Java语言在网络编程方面的简洁性,如我我用C来实现的话,我就需要自己创建TCPPacket,IPPacket等的结构体,然后再对其进行填充,容易出错误。而用Java语言,可以通过构造函数对其进行填充,简单、方便、快捷,不容易出错误。与此同时,有让我感受到了C语言的强大,因为Jpcap功能的实现,本质上是调用C语言写的代码实现的。Java语言后来居上,是因为站在巨人的肩膀上。