Ⅰ 什麼叫做解析報文報文是什麼
所謂報文就是一種文件傳輸定義的協議,如用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包
Ⅸ 網路裡面報文是什麼意思
報文是網路中交換與傳輸的數據單元,即站點一次性要發送的數據塊。報文包含了將要發送的完整的數據信息,其長短很不一致,長度不限且可變。