Ⅰ 什么叫做解析报文报文是什么
所谓报文就是一种文件传输定义的协议,如用csv,xml,json等都可以称为报文,也可以理解为数据,解析报文就是把特定格式的文件数据解析成自己想要的结果方便进行处理
Ⅱ 如何分析数据包判断网络故障
从网络抓包是可以分析出很多东西,其中一项就是用来做排错。
根据个人的实际经验,用抓包来排错有分为几种情况:
1、通过数据包的有无来判断故障,一般用于防火墙策略调试等场景,在防火墙上进行抓包,或交换机上镜像抓包,或者这交换机内嵌抓包功能。这种抓包无需进行过多分析。
2、网络故障,已经明确网络设备配置不存在问题的情况下,通过抓包来判断问题,我把这主要分为行为判断和协议判断。
1)最常见的是通过抓包数量来判定网络行为的是否正常,比如ARP病毒爆发一定会收到大量ARP数据包;攻击行为也很多时候体现为大量数据包(但是一般判断这种攻击行为抓包不会放在第一步,只是在确定攻击特征时需要抓包);当然还有其他很多情况,适用于通过抓包数量来分析的。
2)通信质量判断,抓包存在大量的重传,此时通信质量一般都不太好。另外有视频和语音的应用场景中,有时需要通过时间统计来判断通信毛刺,来分析定位视频和语音通信质量问题。
3)协议判断,比如win2008和win2003通信时因为window
scale不兼容,导致窗口过小,而程序设计适当时,通信变动极其缓慢。这些判断都是建立在抓包协议分析的基础上的;另外不同厂商SIP通信对接也有可能会用到协议分析,其中一种方式就是抓包分析。
综合而言,协议分析时要求比较高,很多人都可以说把基础学好,但是对应实际工作多年的人,TCP/IP的协议学习一般都是多年前的事情,而且不同操作系统,对于协议栈的实现是有区别的,这部分析的工作一般都是出现问题后有针对性查资料来解决的。
说了这么多,针对抓包分析我个人的意见是:排查问题关键是思路,真的用到协议层判断的场景相对而言还是比较少,初学这不必过分纠结。但是从另外一个方面来看,能深入协议层进行排错的网工,都是具备钻研精神的,属于高级排错的一部分。
Ⅲ 如何分析udp报文,从而获取源地址
1、写了一个UDP 的小程序,有一个UDP 的server,而且有UDP的client。
然后执行server和client,然后用tcpmp将该端口的UDP数据报文抓取出来。
执行的过程是这样的。
client向server发送"xiyou"
server向client应答"wangzhe"
client程序在主机example上运行(192.168.1.144)
server程序在主机linux上运行(192.168.1.101)
------------------------------------------------------------------------------------------------------------
2、UDP数据报文。
linux@linux:~$ sudo tcpmp -vvv -X udp port 7777
[sudo] password for linux:
tcpmp: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:03:01.923227 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 48)
example.local.43521 > linux.7777: [udp sum ok] UDP, length 20
0x0000: 4500 0030 0000 4000 4011 b677 c0a8 0190 E..0..@[email protected]....
0x0010: c0a8 0165 aa01 1e61 001c 4c34 7869 796f ...e...a..L4xiyo
0x0020: 7500 0000 0000 0000 0000 0000 0000 0000 u...............
11:03:01.923343 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 48)
linux.7777 > example.local.43521: [bad udp cksum 6869!] UDP, length 20
0x0000: 4500 0030 0000 4000 4011 b677 c0a8 0165 E..0..@[email protected]
0x0010: c0a8 0190 1e61 aa01 001c 8473 7761 6e67 .....a.....swang
0x0020: 7a68 6500 0000 0000 0000 0000 0000 0000 zhe.............
由上面的报文可知,有两个UDP数据报文。
第一个报文是example主机上的client向server发送数据。
4500 0030 0000 4000 4011 b677 c0a8 0190 c0a8 0165 这20个数据是IP首部。
aa01 1e61 001c 4c34 这8个字节是UDP的首部。
7869 796f 7500 0000 0000 0000 0000 0000 0000 0000 这20个数据是我用sendto函数发送的
数据。
而将char req[20] = "xiyou" 的ASCII码(16进制)就是:
78 69 79 6f 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
第二个报文是linux向主机example做出的应答。
4500 0030 0000 4000 4011 b677 c0a8 0165 c0a8 0190 这20个数据是IP首部。
1e61 aa01 001c 8473 这8个字节是UDP首部。
7761 6e67 7a68 6500 0000 0000 0000 0000 0000 0000 这20个数据是应用层的数据。
而将char reply[20] = "wangzhe"的ASCII码(16进制)就是:
77 61 6e 67 7a 68 65 0 0 0 0 0 0 0 0 0 0 0 0 0
由此看出,应用层的数据没有夹杂其他的参数,全部是数据,均是字符的ASCII码。
-----------------------------------------------------------------------
附带网络程序:
udp_server.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
int main(void)
{
struct sockaddr_in server,client;
int sockfd;
int cli_len = 0,n;
char req[20] = {0},reply[20] = {0};
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd < 0) {
perror("socket error!\n");
exit(-1);
}
memset(&server,0,sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(7777);
if (bind(sockfd,(struct sockaddr *)&server,sizeof(server)) < 0) {
perror("bind error!\n");
exit(-1);
}
for (;;) {
cli_len = sizeof(struct sockaddr_in);
n = recvfrom(sockfd,req,20,0,(struct sockaddr *)&client,&cli_len);
if (n < 0) {
perror("recvfrom error!\n");
exit(-1);
}
printf("hello!\n");
strncpy(reply,"wangzhe",sizeof("wangzhe"));
if (sendto(sockfd,reply,20,0,(struct sockaddr *)&client,sizeof(client)) != 20) {
perror("sendto error!\n");
exit(-1);
}
}
return 0;
}
-----------------------------------------------------------------------------------------------------------
udp_client.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <string.h>
int main(void)
{
int sockfd,n;
struct sockaddr_in server;
char req[20]={0},reply[20]={0};
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (sockfd < 0) {
perror("socket error!\n");
exit(-1);
}
memset(&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("192.168.1.101");
server.sin_port = htons(7777);
strncpy(req,"xiyou",sizeof("xiyou"));
printf("sendto req to server:%s\n",req);
if (sendto(sockfd,req,20,0,(struct sockaddr *)&server,sizeof(server)) != 20) {
perror("sendto error!\n");
exit(-1);
}
if ((n = recvfrom(sockfd,reply,20,0,(struct sockaddr *)NULL,(int *)NULL)) < 0) {
perror("recvfrom error!\n");
exit(-1);
}
printf("recv reply from server :%s\n",reply);
exit(0);
}
--------------------------------------------------------------------------------------------------------
Ⅳ 如何实现java解析网络协议报文
普通参数:
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
文件参数:
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
参数实体的最后一行是: --加上boundary加上--,最后换行,这里的 格式即为: --OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp--。
模拟文件上传请求
public static void uploadFile(String fileName) {
try {
// 换行符
final String newLine = "\r\n";
final String boundaryPrefix = "--";
// 定义数据分隔线
String BOUNDARY = "========7d4a6d158c9";
// 服务器的域名
URL url = new URL("www.myhost.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置为POST情
conn.setRequestMethod("POST");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求头参数
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
OutputStream out = new DataOutputStream(conn.getOutputStream());
// 上传文件
File file = new File(fileName);
StringBuilder sb = new StringBuilder();
sb.append(boundaryPrefix);
sb.append(BOUNDARY);
sb.append(newLine);
// 文件参数,photo参数名可以随意修改
sb.append("Content-Disposition: form-data;name=\"photo\";filename=\"" + fileName
+ "\"" + newLine);
sb.append("Content-Type:application/octet-stream");
// 参数头设置完以后需要两个换行,然后才是参数内容
sb.append(newLine);
sb.append(newLine);
// 将参数头的数据写入到输出流中
out.write(sb.toString().getBytes());
// 数据输入流,用于读取文件数据
DataInputStream in = new DataInputStream(new FileInputStream(
file));
byte[] bufferOut = new byte[1024];
int bytes = 0;
// 每次读1KB数据,并且将文件数据写入到输出流中
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
// 最后添加换行
out.write(newLine.getBytes());
in.close();
// 定义最后数据分隔线,即--加上BOUNDARY再加上--。
byte[] end_data = (newLine + boundaryPrefix + BOUNDARY + boundaryPrefix + newLine)
.getBytes();
// 写上结尾标识
out.write(end_data);
out.flush();
out.close();
// 定义BufferedReader输入流来读取URL的响应
// BufferedReader reader = new BufferedReader(new InputStreamReader(
// conn.getInputStream()));
// String line = null;
// while ((line = reader.readLine()) != null) {
// System.out.println(line);
// }
} catch (Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
}
}
Ⅳ wireshark怎么抓包分析网络故障实战
【WireShark概览】
1、Wireshark 是网络报文分析工具。网络报文分析工具的主要作用是尝试捕获网络报文, 并尝试显示报文尽可能详细的内容。过去的此类工具要么太贵,要么是非公开的。 直到Wireshark(Ethereal)出现以后,这种情况才得以改变。Wireshark可以算得上是今天能使用的最好的开源网络分析软件。2、WireShark简史:1997年,Gerald Combs 需要一个工具追踪网络问题,并且想学习网络知识。所以他开始开发Ethereal (Wireshark项目以前的名称) 以解决自己的需求。1998年,Ethreal0.2.0版诞生了。此后不久,越来越多的人发现了它的潜力,并为其提供了底层分析。2006年Ethreal改名为Wireshark。2008年,在经过了十年的发展后,Wireshark发布了1.0版本。3、WireShark的主要作用,就是可以抓取各种端口的报文,包括有线网口、无线网口、USB口、LoopBack口等等,从而就可以很方便地进行协议学习、网络分析、系统排错等后续任务。4、不同平台下的WireShark:目前WireShark支持几乎所有主流报文文件,包括pcap,cap ,pkt,enc等等。但是不同平台下的WireShark却有功能上的不同。总体来说,Linux版本WireShark的功能和特性比Windows版本的要丰富和强大。例如,Linux版本的WireShark可以直接抓取USB接口报文,而Windows版本就不行。
Figure 1,Linux下的WireShark
Figure 2,Windows下WireShark
Figure 3,各平台下的WireShark所支持的协议
各平台下的WireShark支持的协议如上图所示。从图中可以看到Linux下的版本功能最强大,由于平台本身特性,可以使WireShark几乎支持所有协议。但由于我们平时工作中主要抓取以太网报文,且绝大部分的操作系统都是Windows,所以本文还是以Windows平台下的WireShark为例来进行说明。
【如何正确使用WireShark抓取报文】
1、WireShark组网拓扑。为了抓到HostA与HostB之间的报文,下面介绍几种WireShark组网。
i.在线抓取:如果WireShark本身就是组网中的一部分,那么,很简单,直接抓取报文就行了。
ii. 串联抓取:串联组网是在报文链路中间串联一个设备,利用这个中间设备来抓取报文。这个中间设备可以是一个HUB,利用HUB会对域内报文进行广播的特性,接在HUB上的WireShark也能收到报文。
若是WireShark有双网卡,正确设置网络转发,直接串接在链路上。
也可以利用Tap分路器对来去的报文进行分路,把报文引到WireShark上。
串联组网的好处是报文都必须经过中间设备,所有包都能抓到。缺点是除非原本就已经规划好,不然要把报文链路断开,插入一个中间设备,会中断流量,所以一般用于学习研究,不适用于实际业务网以及工业现场以太网。
iii. 并联抓取:并联组网是将现有流量通过现网设备本身的特性将流量引出来。
若是网络本身通过HUB组网的,那么将WireShark连上HUB就可以。
若是交换机组网,那直接连上也能抓取广播报文。
当然,最常用的还是利用交换机的镜像功能来抓包。
并联组网的优点是不用破坏现有组网,适合有业务的在线网络以及工业现场以太网。缺点是HUB组网已经不常见,而交换机组网的设备开启镜像后,对性能有非常大的影响。
2、 WireShark的安装。WireShark是免费开源软件,在网上可以很轻松获取到。Windows版的WireShark分为32位而64位两个版本,根据系统的情况来决定安装哪一个版本,虽然64位系统装32位软件也能使用,但装相应匹配的版本,兼容性及性能都会好一些。在Windows下,WireShark的底层抓包工具是Winpcap,一般来说WireShark安装包内本身就包含了对应可用版本的Winpcap,在安装的时候注意钩选安装就可以。安装过程很简单,不再赘述。
3、使用WireShark抓取网络报文。Step1. 选择需要抓取的接口,点选Start就开始抓包。
4、使用WireShark抓取MPLS报文。对于mpls报文,wireshark可以直接抓取带MPLS标签的报文。
5、使用WireShark抓取带Vlan Tag的报文。早期网卡的驱动不会对VLAN TAG进行处理,而是直接送给上层处理,在这种环境下,WireShark可以正常抓到带VLAN TAG的报文。而Intel,broadcom,marvell的网卡则会对报文进行处理,去掉TAG后再送到上层处理,所以WireShark在这种情况下通常抓不到VLAN TAG。这时我们需要针对这些网卡做一些设置,WireShark才能够抓取带VLAN TAG的报文。1). 更新网卡的最新驱动。2). 按照以下说明修改注册表:a) Intel:HKEY_LOCAL_MACHINE\SYSTEM \ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318} \00xx(where xx is the instance of the network adapter that you need to see tags on. )PCI或者PCI-X网卡增加dword:MonitorModeEnabled,通常设置为1即可 0 - disabled (Do not store bad packets, Do not store CRCs, Strip 802.1Q vlan tags) 1 - enabled (Store bad packets. Store CRCs. Do not strip 802.1Q vlan tags) PCI-Express网卡增加dword:MonitorMode,通常设置为1即可 0 - disabled (Do not store bad packets, Do not store CRCs, Strip 802.1Q vlan tags) 1 - enabled (Store bad packets. Store CRCs. Do not strip 802.1Q vlan btag) 2 - enabled strip vlan (Store bad packets. Store CRCs. Strip 802.1Q vlan tag as normal);b) Broadcom:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet下搜索,找到"TxCoalescingTicks"并确认这是唯一的,增加一个新的字符串值"PreserveVlanInfoInRxPacket",赋值1。c) Marvell Yukon 88E8055 PCI-E 千兆网卡:"HKLM\SYSTEM \CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318} \000"(where 000 is the number of the folder for the Marvel ethernet controller)增加DWORD:SkDisableVlanStrip:1;3). 以Intel网卡为例,对网卡进行配置。选择Intel网卡的本地连接,右键属性
点击“配置”按钮。
在VLAN选项卡中,加入任意一个VLAN,激活接口的VLAN TAG上送功能。此时可以把“本地连接”接口看成是一个Trunk接口。
配置完VLAN后,如果发现系统禁用了“本地连接”接口,则只要启用它,会看到网络连接中会出现一个新的子接口“本地连接2”。
在WireShark上查看抓取“本地连接”接口的报文。
可以看到已经可以抓到有VLAN TAG的报文了。
由于此时的子接口都是有VLAN属性的,所以无法当成正常的网卡来用。如果想要在抓VLAN包的同时,还能够与网络正常通信,只要再新建一个未标记的VLAN就行。
这时,会生成一个对应的子接口“本地连接3”,在这个接口上正确配置网络参数,就可以正常通信了。
Ⅵ 怎么样用出C语言写一个分析TCP/IP报文的程
socket编程写了一个简单的DNS服务器。
是这样实现的,用两台PC,一个做客户端,一个做服务器;
在服务器用socket监视53端口,recvfrom()函数负责接收DNS查询报文,将其存入事先写好的数据结构里;
因为DNS查询报文和应答报文的前部分字段格式都是一样的,只是修改了几个参数,然后重点把DNS应答报文后面的字段进行增添。
然后用sendto();函数发送就可以了。
在ie里面输入任意的网址,回车,就会触发客户端向服务器发出DNS查询报文,
此时你可以同时在服务器和客户端抓包,看收到的报文是否正确。
注意几点:
1、一定要熟悉报文结构,定义合适的结构体,将报文进行解析
2、一定要注意网络序和主机序的转换htonl(),htons(),ntohl(),ntohs()等
3、找个熟知端口,最好是你熟悉的协议,如ftp,http,dns等。
4、客户端要把DNS服务器配置为你的服务器ip。
Ⅶ 如何抓包分析报文防护 DDoS 攻击
1、使用 ip verfy unicast reverse-path 网络接口命令 这个功能检查每一个经过路由器的数据包。在路由器的CEF(Cisco Express Forwarding)表该数据包所到达网络接口的所有路由项中,如果没有该数据包源IP地址的路由,路由器将丢弃该数据包。例如,路由器接收到一个源IP地址为1.2.3.4的数据包,如果CEF路由表中没有为IP地址1.2.3.4提供任何路由(即反向数据包传输时所需的路由),则路由器会丢弃它。 单一地址反向传输路径转发(Unicast Reverse Path Forwarding)在ISP(局端)实现阻止SMURF攻击和其它基于IP地址伪装的攻击。这能够保护网络和客户免受来自互联网其它地方的侵扰。使用Unicast RPF需要打开路由器的"CEF swithing"或"CEF distributed switching"选项。不需要将输入接口配置为CEF交换(switching)。只要该路由器打开了CEF功能,所有独立的网络接口都可以配置为其它交换(switching)模式。RPF(反向传输路径转发)属于在一个网络接口或子接口上激活的输入端功能,处理路由器接收的数据包。 在路由器上打开CEF功能是非常重要的,因为RPF必须依靠CEF。Unicast RPF包含在支持CEF的Cisco IOS 12.0及以上版本中,但不支持Cisco IOS 11.2或11.3版本。 2、使用访问控制列表(ACL)过滤RFC 1918中列出的所有地址 参考以下例子: interface xy ip access-group 101 in access-list 101 deny ip 10.0.0.0 0.255.255.255 any access-list 101 deny ip 192.168.0.0 0.0.255.255 any access-list 101 deny ip 172.16.0.0 0.15.255.255 any access-list 101 permit ip any any 3、参照RFC 2267,使用访问控制列表(ACL)过滤进出报文 参考以下例子: {ISP中心} -- ISP端边界路由器 -- 客户端边界路由器 -- {客户端网络} ISP端边界路由器应该只接受源地址属于客户端网络的通信,而客户端网络则应该只接受源地址未被客户端网络过滤的通信。以下是ISP端边界路由器的访问控制列表(ACL)例子: access-list 190 permit ip {客户端网络} {客户端网络掩码} any access-list 190 deny ip any any [log] interface {内部网络接口} {网络接口号} ip access-group 190 in 以下是客户端边界路由器的ACL例子: access-list 187 deny ip {客户端网络} {客户端网络掩码} any access-list 187 permit ip any any access-list 188 permit ip {客户端网络} {客户端网络掩码} any access-list 188 deny ip any any interface {外部网络接口} {网络接口号} ip access-group 187 in ip access-group 188 out 如果打开了CEF功能,通过使用单一地址反向路径转发(Unicast RPF),能够充分地缩短访问控制列表(ACL)的长度以提高路由器性能。为了支持Unicast RPF,只需在路由器完全打开CEF;打开这个功能的网络接口并不需要是CEF交换接口。 4、使用CAR(Control Access Rate)限制ICMP数据包流量速率 参考以下例子: interface xy rate-limit output access-group 2020 3000000 512000 786000 conform-action transmit exceed-action drop access-list 2020 permit icmp any any echo-reply 请参阅IOS Essential Features 获取更详细资料。
Ⅷ 一段完整网络报文怎么用c#代码把不同层的报文头解析出来 如传输层 网络层 数据链路层
1)如果只解析传输层和网络层报文,使用Row Socket即可。即
socket=newSocket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.IP);
这样就可以捕获IP包(网络层)。至于解析,你可以参考IP包结构、UDP包结构、TCP包结构说明。网络一下,这方面的信息很多。
2)如果要解析数据链路层,那就得借助第三方开发包了,例如WinPcap,WinPcap可以捕获到数据链路层(有线网络/无线网络)数据帧。当然WinPcap也能够捕获IP包
Ⅸ 网络里面报文是什么意思
报文是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。