******之資料包嗅探
在通常情況下,網路通訊的套接字程式只能響應與自己硬體地址相匹配或以廣播形式發出的資料幀,對於其他形式的資料幀比如已到達網路介面,但卻不是發給此地址的資料幀,網路介面在驗證投遞地址並非自身地址之後將不引起響應,即應用程式無法收取與自己無關的資料包。要想實現截獲流經網路裝置的所有資料包,就要採取一點特別的手段了。
一、原始套接字基礎
到目前為止,接觸的只是如圖1所示的使用者資料或應用資料部分。為了更好地瞭解資料包的封裝過程,下面介紹IP首部、TCP首部和各類資料包的封包、解包及截獲等。
原始套接字是允許訪問底層協議的一類的套接字,即可以對底層的資料包進行操作。利用原始套接字能訪問ICMP和ICMP等協議包,能讀寫核心不處理的IP
下面程式碼是將ICMP協議作為一種基層協議完成一個原始套接字的建立:
SOCKET s;
s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
第一個引數AF_INET代表TCP/IP協議;第二個引數SOCK_RAW表示SOCKET型別是原始套接字;第三個引數是用來指定協議型別,可以取IPPROTO_ICMP、IPPROTO_IGMP、IPPROTO_IP、IPPROTO_UDP以及IPPROTO_RAW。
不難看出,與建立套接字不同之處在於:把第二個引數的套接字型別設定為SOCK_RAW。由於原始套接字可以使人們對底層傳輸機制加以控制,所以它經常被***使用,從而使Windows中存在一個潛在的安全漏洞。更為嚴重的是,原始套接字可接收流經本地網路層以上的所有資料包。
二、利用ICMP原始套接字實現ping程式
ICMP是Internet Control Message Protocol(網際控制報文協議)的簡稱,從技術角度來說,ICMP就是一個“錯誤偵測與回報機制”,它能夠檢測網路的連線狀況,也能確保連線的準確性。它是TCP/IP協議集中的一個子協議,屬於網路層協議,主要用於在主機與路由器之間傳遞控制資訊,包括報告錯誤、交換受限控制和狀態資訊等。
ICMP協議對於網路安全具有極其重要的意義,但ICMP協議本身的特點決定了它非常容易被用於***網路上的路由器和主機。大家經常使用的ping命令就是通過ICMP協議實現的,下面將利用原始套接字傳送ICMP資料包來實現ping命令。由於要使用原始套接字,所以在傳送資料包前必須對資料包進行封裝。在封裝資料包前需瞭解ICMP報文的具體結構,如圖2所示。
從中可以看出:8位型別段和8位程式碼段共同決定ICMP報文的型別。而型別欄位有15個不同值,還可結合程式碼欄位來描述特定型別的ICMP報文。要實現ping命令,則必須把傳送的ICMP資料包型別段和程式碼段分別設定為8和0。這樣就指向請求的回顯功能,即ICMP回顯請求報文,目標主機迴應資料包的就是ICMP回顯應答報文,其型別段和程式碼段分別為0和0。接著是16位檢驗和欄位,它必須由程式進行計算填寫,其演算法現在已經公開。
在這裡需要呼叫checksum函式來儲存檢驗和,該函式的呼叫方法如下:
USHORT checksum(USHORT* buff, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buff++;
size -= sizeof(USHORT);
}
if(size) // 是奇數
{
cksum += *(UCHAR*)buff; }
cksum = (cksum >> 16) + (cksum & 0xffff); // 將32位的chsum高16位和低16位相加,然後取反
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
16位檢驗和欄位的主要作用是檢查收到資料包的完整性。先對報文首部每個16位資料進行二進位制反碼求和(可將整個首部看作由一串16位的欄位組成),將其儲存在檢驗和欄位中。當收到一個數據包後,同樣對其首部中16位資料進行二進位制反碼求和。由於接收方在計算過程中包含了傳送方存在首部的檢驗和,如果首部在傳輸過程中沒有發生錯誤,則接收方計算的結果應該為1。
由於ICMP報文結構中的內容是由型別欄位和程式碼欄位決定的,在這裡已設定為ICMP回顯報文。ICMP回顯報文的具體結構如圖3所示。
該報文中的識別符號和序號的作用是表示一對特定的ICMP回顯報文,當傳送一個ICMP回顯請求報文後,收到的ICMP回顯應答報文中的識別符號和序號與ICMP回顯請求報文中的相同,所以這些欄位都被原樣返回。該過程用於確定收到的報文是否為該ICMP回顯請求報文的應答報文,並且客戶端傳送的選項資料必須原樣返回。
ICMP回顯報文的結構如下:
typedef struct icmp_hdr
{
unsigned char icmp_type; // 型別
unsigned char icmp_code; // 程式碼
unsigned short icmp_checksum; // 校驗和
unsigned short icmp_id; // 識別符號
unsigned short icmp_sequence; // 序列號
//下面是選項資料
unsigned long icmp_timestamp; // 時間戳
} ICMP_HDR, *PICMP_HDR;
在傳送ICMP回顯請求報文時,一般使用icmp_id引數來儲存ping程式的程序Pid號。由於在ICMP回顯應答報文中icmp_id會原樣返回,所以可利用該引數來確定收到的ICMP回顯應答資料包,是否是剛傳送的資料包的應答報文。要得到程序的Pid可以直接呼叫GetCurrentProcessId()函式,而且該函式沒有引數,呼叫成功就可以返回程序的Pid。
而引數icmp_timestamp的作用是計算機ICMP回顯請求報文傳送到ICMP回顯應答報文所經過的時間,其具體計算過程如下:
首先在構造ICMP回顯請求報文時,呼叫GetTickCount函式得到系統從開機到現在的執行時間,而且該函式沒有引數。如果呼叫成功則返回系統的執行時間,返回時間可精確到毫秒。在收到ICMP回顯應答報文時,再呼叫GetTickCount函式得到執行時間。最後將兩次時間相減就可以得到從ICMP回顯請求報文傳送到ICMP回顯應答報文所用的時間。
ICMP回顯請求報文的具體構造過程如下:
char buff[sizeof(ICMP_HDR)];
ICMP_HDR* pIcmp = (ICMP_HDR*)buff;
pIcmp->icmp_type = 8; //型別8
pIcmp->icmp_code = 0; //程式碼0
pIcmp->icmp_id = (USHORT)GetCurrentProcessId();//識別符號為本程序id
pIcmp->icmp_checksum = 0; //檢驗和先設為0
pIcmp->icmp_timestamp = GetTickCount();//時間戳為系統執行時間
pIcmp->icmp_checksum = checksum((USHORT*)buff, sizeof(ICMP_HDR) ); //計算檢驗和
但通常傳送的資料包中不僅只包含一個ICMP報文,整個資料包的基本結構如圖4所示。
從中可以看出:除ICMP報文外,傳送的資料包中還包含了乙太網首部和IP首部兩部分。對於原始套接字來說,是沒有許可權訪問乙太網首部的,在封裝資料包時相應驅動程式會填充乙太網首部,所以這部分不用程式設計。但IP首部是不讓驅動程式填充的,這裡不使用IP首部。構造ping程式需要經過初始化winsock屬性、構造和傳送ICMP回顯請求報文、接收ICMP回顯請求報文、分析並輸出報文等幾個步驟,其具體流程如圖5所示。
雖然在構造傳送資料時程式只需構造ICMP資料包部分,但在程式收到的資料包中是包含IP首部的。
從中可以看出:構造ping程式過程並不複雜。先構造ICMP報文進行傳送,再接收資料,最後分析資料包並輸出結果即可。
1、初始化winsock屬性
需要對winsock進行初始化,包括載入winsock庫、建立原始套接字、填寫目標計算機的SOCK_ADDR_IN結構以及設定超時時間等。這些過程的具體實現程式碼如下:
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0) //載入winsock庫
return 0;
SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); //建立原始套接字
int OutTime=100; //超時時間
setsockopt(sRaw, IPPROTO_IP, IP_TTL, (char*)&OutTime, sizeof(OutTime)); //設定超時
SOCKADDR_IN dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(0);
dest.sin_addr.S_un.S_addr = inet_addr(argv[1]); //填寫ping主機地址
2、構造和傳送ICMP回顯請求報文
在完成winsock初始化後,就需要構造ICMP回顯報文,該過程在前面已經介紹過。在構建ICMP回顯報文後,就可以呼叫sendto函式傳送ICMP回顯請求報文。其具體實現程式碼如下:
nRet = sendto(sRaw, buff, sizeof(ICMP_HDR) , 0, (SOCKADDR *)&dest, sizeof(dest)); //傳送ICMP回顯請求資料報
if(nRet == SOCKET_ERROR) //傳送錯誤,提示並退出程式
{
printf(" sendto failed\n");
return 0;
}
3、接收ICMP回顯請求報文
在傳送完成後,就可以呼叫recvform函式來接收ICMP回顯請求報文。其實現程式碼如下:
nRet = recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)&from, &nLen);
if(nRet == SOCKET_ERROR)
{
if(WSAGetLastError() == WSAETIMEDOUT)
{
printf(" timed out\n");
continue;
}
printf(" recvfrom failed \n");
return 0;
}
4、分析並輸出報文
當接收到資料後就可以對收到的資料進行分析,再輸出結果。由於收到的IP資料包時包含IP首部的,而IP首部的大小是20位元組。可以通過一個結構來定義IP首部,該結構的具體內容如下:
typedef struct _IPHeader // 20位元組的IP首部
{
UCHAR iphVerLen; // 版本號和頭長度(各佔4位)
UCHAR ipTOS; // 服務型別
USHORT ipLength; // 封包總長度,即整個IP報的長度
USHORT ipID; // 封包標識,唯一標識傳送的每一個數據報
USHORT ipFlags; // 標誌
UCHAR ipTTL; // 生存時間,就是TTL
UCHAR ipProtocol; // 協議,可能是TCP、UDP、ICMP等
USHORT ipChecksum; // 校驗和
ULONG ipSource; // 源IP地址
ULONG ipDestination; // 目標IP地址
} IPHeader, *PIPHeader;
對資料的分析過程是:先從IP首部中得到8位協議欄位,以確定IP首部之後是否是ICMP報文,如果是則繼續往下讀取;根據ICMP報文中icmp_id引數判斷此ICMP報文是否與傳送的ICMP回顯請求報文中的icmp_id相同。如果相同則輸出ping主機的IP地址、收到資料包的大小、從傳送資料包到收到資料包所用的時間等資訊。
分析並輸出報文的具體實現程式碼如下:
int nTick = GetTickCount();//得到當前系統執行時間
IPHeader *Iphdr=(IPHeader*)recvBuf; //得到IP首部
if(Iphdr->ipProtocol!=0x01) //判斷其是否是ICMP報文
{
printf("this is not a icmp packet\n");
return 0;
}
ICMP_HDR* pRecvIcmp = (ICMP_HDR*)(recvBuf + 20); //定位到ICMP報文首部
if(pRecvIcmp->icmp_id != GetCurrentProcessId())//判斷收到的報文是否和傳送的報文相對應
{
printf("this is another icmp packet\n");
return 0;
}
printf("Reply from %s: ",inet_ntoa(from.sin_addr)); //輸出ping主機的ip
printf("bytes=%d ",nRet); //輸出收到的位元組數
printf("time=%dms\n",nTick - pRecvIcmp->icmp_timestamp);
//輸出從傳送資料報到收到資料報所經歷的時間
Sleep(100);
到這裡ping程式就設定完成了,其執行結果如圖6所示。在本地計算機的“命令提示符”視窗中輸入ping 192.168.0.12命令,即可看到其執行結果,如圖7所示。不難看出,使用ping程式返回的資料與使用ping命令返回的資料是一樣的。
無論是使用ping程式還是使用ping命令,在執行的結果中可以看出,輸出資料有4行,所以需要迴圈4次輸出資料。
三、基於原始套接字的嗅探技術
由於套接字可以接收流經本地的網路層以及以上的所有資料,所以在建立原始套接字後,只需要對套接字進行監聽,就可以嗅探到流經本地的網路以及以上的資料包。
現在很多嗅探工具不僅可嗅探本機資料,還可嗅探整個區域網資料。這裡介紹如何通過程式設計實現嗅探整個區域網中的資料。區域網的連線方式有集線器和交換機兩種。前者為以集線器(HUB)連線成的區域網(乙太網),而後者為以交換機連線成的網路(交換式網路)。
下面是這兩種網路的基本特點。
1、集線器(HUB)連線成的區域網
在這種網路中,資料時以廣播的形式傳送的,所以當局域網中的一臺主機向目標主機發送資料後,區域網中每臺主機的網絡卡都會收到此資料包,網絡卡內的單片程式會對資料包進行分析。該程式會先讀取資料包中的乙太網頭部,在乙太網頭部中儲存有目標主機的MAC地址,如果該地址與本地網絡卡的MAC地址相同,則表明該資料包已經到達目標主機,此時網絡卡就會把該資料包傳給上一層處理,否則就會丟棄資料包。
廣播分為第二層廣播和第三層廣播兩種。第二層廣播也稱硬體廣播,主要用於在區域網內向所有的節點發送資料,通常不會穿過區域網的邊界(路由器)。而第三層廣播則用於在這個網路內向所有的節點發送資料。廣播資訊是指以某個廣播域所有主機為目的的資訊,這些被稱為網路廣播。
2、交換機連線成的網路
由於以原始套接字為基礎的嗅探技術嗅探不到該種網路中的資料,所以在這裡只作簡單介紹。在交換機網路環境中,當一臺計算機向另一臺計算機發送資料包後,該資料包會被交換機發送到指定的網路地址中。
由於流經每臺計算機的逐句都會被區域網中任意一臺主機的網絡卡接收到,所以判斷後,將那些不是發給自己的資料丟棄。但只要將網絡卡設定成混雜模式,就可以收到流經區域網的所有資料,在C++中只需呼叫ioctsocket函式即可實現。該函式的具體呼叫方法如下:
DWORD dwValue = 1;
if(ioctlsocket(sRaw,SIO_RCVALL, &dwValue) != 0) //設定網絡卡為混雜模式
{
printf("ioctlsocket error\n");
return 0;
}
不難看出:ioctlsocket函式包括3個引數,這3個引數的具體作用如下。
sRaw:該引數指定一個I/O套接字的控制代碼。
SIO_RCVALL:該引數指定對套接字的操作指令。
&dwValue:該引數指定命令所帶引數的指標。
當網絡卡被設定成混雜模式後,利用原始套接字接收資料,就可以接收到流經整個網路的全部資料,其實現流程如圖8所示。
從中可以看出嗅探程式的實現過程非常簡單。先進行原始套接字的一些初始化操作,建立套接字並繫結到本地的一個IP;把網絡卡設定成混雜模式以實現接收流經區域網中的所有資料;最後是一個迴圈,多次接收和分析資料。嗅探程式主要針對資料包中的使用者名稱和密碼進行分析。下面開始編寫嗅探FTP密碼的程式。如果要實現一個嗅探FTP密碼的程式,則必須先了解FTP資料包的結構,其結構如圖9所示。
利用原始套接字收到的資料包是沒有乙太網首部的,在這裡不用考慮這部分的資料。下面來了解IP首部的基本結構,如圖10所示。
IP首部包含的欄位的具體作用如下。
4位版本:指定IP協議的版本號,目前該欄位設定為4,所以IP有時也被稱為IPv4。
首部長度:首部長度是指首部佔32bit字的數目,包含任何選項,是一個4bit欄位。
16位總長度:指定整個IP資料包的長度。
8位協議:8位協議指定了下一層報文的協議,FTP資料包中該項為6,表示下一層是TCP報文。
32位源IP地址:該地址指定了資料包傳送方的IP地址。
32位目標IP地址:該地址指定了資料包接收方的IP地址。
在VC++6.0中IP首部一般定義如下:
typedef struct _IPHeader
{
UCHAR iphVerLen; // 版本號和首部長度(各佔4位)
UCHAR ipTOS; // 8位服務型別
USHORT ipLength; // IP資料報總長度
USHORT ipID; // 16位標識
USHORT ipFlags; // 3位標誌和13位片偏移
UCHAR ipTTL; // 8位生存時間
UCHAR ipProtocol; // 8位協議,可能是TCP、UDP、ICMP等
USHORT ipChecksum; // 16位首部校驗和
ULONG ipSource; // 32位源IP地址
ULONG ipDestination; // 32位目標IP地址
} IPHeader, *PIPHeader;
在瞭解IP首部的基礎上再看看TCP首部的基本結構,如圖11所示。
TCP首部中選項的長度一般是20位元組。在這裡只需瞭解16位源埠和目標埠號,分別指向客戶端和服務端的埠號。在VC++6.0中TCP首部一般定義如下:
typedef struct _TCPHeader
{
USHORT sourcePort; // 16位源埠號
USHORT destinationPort; // 16位目的埠號
ULONG sequenceNumber; // 32位序列號
ULONG acknowledgeNumber; // 32位確認號
UCHAR dataoffset; // 高4位表示資料偏移
UCHAR flags; // 6位標誌位
USHORT windows; // 16位視窗大小
USHORT checksum; // 16位校驗和
USHORT urgentPointer; // 16位緊急指標
} TCPHeader, *PTCPHeader;
最後還需要了解FTP資料包的結構。由於FTP資料包沒有一個統一的結構,這裡是使用抓包的方式傳送帶使用者名稱和密碼的資料包結構。下面介紹如何通過程式設計來實現嗅探功能,先載入winsock庫,建立原始套接字,繫結原始套接字到本地的某個IP地址。其實現程式碼如下:
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2);
if(WSAStartup(sockVersion, &wsaData) != 0) //載入winsock庫
return 0;
SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP); // 建立原始套接字
char szHostName[56];
SOCKADDR_IN addr_in;
struct hostent *pHost;
gethostname(szHostName, 56); //得到本機計算機名
if((pHost = gethostbyname((char*)szHostName)) == NULL)//通過計算機名得到IP
return 0;
相關推薦
******之資料包嗅探
在通常情況下,網路通訊的套接字程式只能響應與自己硬體地址相匹配或以廣播形式發出的資料幀,對於其他形式的資料幀比如已到達網路介面,但卻不是發給此地址的資料幀,網路介面在驗證投遞地址並非自身地址之後將不引起響應,即應用程式無法收取與自己無關的資料包。要想實現截獲流經網路裝置的所有資料包,就要採取一點特別的
[原始碼和文件分享]使用原始套接字Raw Socket實現資料包嗅探
背景 網路上隨時都流通了大量的資料包,我們要想實現抓包並分析,實現思路思路大概是:在合適的時候捕獲資料包,儲存到緩衝區,作為備用;然後,按照一定的結構和格式去讀取緩衝區的內容。由於各種公開的網路協議是已知的,所以對於資料包的分析就比較簡單。 通常我們都是使用類似WireShark的抓包軟體嗅
用C++抓取網路資料包--嗅探器的設計原理
嗅探器作為一種網路通訊程式,也是通過對網絡卡的程式設計來實現網路通訊的,對網絡卡的程式設計也是使用通常的套接字(socket)方式來進行。但是,通常的套接字程式只能響應與自己硬體地址相匹配的或是以廣播形式發出的資料幀,對於其他形式的資料幀比如已到達網路介面但卻不是發給此地址
裝置介面層之資料包接收
資料包最先當然是由網絡卡收到(不考慮環回介面這樣的虛擬裝置),那麼之後軟體是如何接收該資料,又是如何將資料遞交給協議棧的,這篇筆記就來看看linux核心和驅動程式時如何配合完整這個接收過程的。 1. 資料接收模式 當前核心提供了兩種資料接收模式:非NAPI方式(老方法)和NAPI(新
裝置介面層之資料包傳送
這篇筆記記錄了裝置介面層傳送資料包的過程。這裡不會單獨列舉發送過程中使用到的一些資料結構,而是直接跟蹤程式碼,因為傳送過程中使用到的很多資料結構在接收部分的描述中已經介紹過了,這裡可以對比參考:裝置介面層之資料包接收. 1. 裝置介面層傳送介面 仔細看下dev_queue_xmit(
包嗅探和包回放 —tcpdump、tcpreplay--重放攻擊
攻擊方式:tcpdump 進行嗅探,獲取報文訊息;然後用tcpreplay回放攻擊 arp欺騙可以使用 arpspoof kali linux有這三個工具 轉載地址https://www.cnblogs.com/jiayy/p/3447027.html
Linux網路協議棧之資料包處理過程(非技術人員勿看)
1.中斷處理函式中: 網絡卡收到一幀------------------------〉 引發中斷-------------------〉 cpu呼叫相應的中斷處理函式(指向此網絡卡驅動中的相應的處理函式)(把此packet讀到ram中)--------------------〉 呼叫neti
防火牆之資料包過濾iptables
內容簡介 防火牆的概述 1、iptables簡介 2、iptables基礎 3、iptables語法 4、iptables例項 案例詳解 (一)防火牆的簡介 防火牆是指設定在不同網路或網路安全域之間的一系列部件的組合,它能增強機構內部網路的安
Python黑帽程式設計 4.1 Sniffer(嗅探器)之資料捕獲(上)
Python黑帽程式設計 4.1 Sniffer(嗅探器)之資料捕獲(上) 網路嗅探,是監聽流經本機網絡卡資料包的一種技術,嗅探器就是利用這種技術進行資料捕獲和分析的軟體。 編寫嗅探器,捕獲資
如何利用Python嗅探(Sniffer)資料包
一提到Python獲取資料包的方式,相信很多Python愛好者會利用Linux的libpcap軟體包或利用Windows下的WinPcap可移植版的方式進行抓取資料包,然後再利用dpkt軟體包進行協議分析,我們這裡想換一個角度去思考: 1. Python版本的pca
C++從零開始區塊鏈:P2P模組之UDP資料包分組排序
udp的特點是不可靠,不連線,資料發過去就完事,至於對方收沒收到就不管了。 在使用udp進行通訊的時候,要在應用層做分組、排序、組包、校驗等工作。 傳送方現將要傳送的資料切片,所有的切片組成一組,標上組號,每個切片根據原始資料的順序有個組內編號。 傳送的時候,每次傳送一個切片,並等待接
使用nRF Sniffer嗅探藍芽BLE通訊資料
簡介:本文主要介紹使用 Nordic 的nRF51 Dongle (PCA10031)工具,配合Wireshark軟體實現對藍芽BLE通訊進行嗅探的環境搭建和配置。 &nb
學習筆記(二)tidyverse之readxl包------表格資料讀取
1、readxl概況 readxl包是tidyverse中的一員,是匯入Excel表格資料的一個R包,由Hadley Wickham開發的。與其他已經存在的包(例如:gdata包、xlsx包…)最大的區別是不依賴其他外部程式,能夠在所有作業系統中都方便使用; 主要功能是匯入
【Python】資料分析之numpy包
numpy使用示例 前言 示例程式碼 參考資料 前言 numpy,全稱numeric python,是一個由多維陣列物件和用於處理陣列的例程集合組成的庫,是python資料分析中最基礎
Python之SYN資料包探測埠
本篇文章敘述的是運用TCP裡面的SYN來探測埠是否開放,如果開放則返回一個SYN+ACK包,是非常實用的小程式,因為在資訊收集中,幾乎都是需要探測埠號,之後便可以對該埠做些不可描述的事情。 程式碼區: *************************************
Wireshark資料抓包教程之認識捕獲分析資料包
在Wireshark中關於資料包的叫法有三個術語,分別是幀、包、段。下面通過分析一個數據包,來介紹這三個術語。在Wireshark中捕獲的一個數據包,如圖1.45所示。每個幀中的內容展開後,與圖1.
資料探勘之資料處理——SVM神經網路的資料分類預測-義大利葡萄酒種類識別
************* 使用的工具:Matlab 分類器:SVM ************* 1、案例背景: 在葡萄酒製造業中,對於葡萄酒的分類具有很大意義,因為這涉及到不同種類的葡萄酒的存放以及出售價格,採用SVM做為分類器可以有效預測相關葡萄酒的種類,從UCI資料
核心擴充套件資料包的方法之-----skb_copy_expand
skb_copy_expand是用來拷貝並且擴充套件原來skb的一個函式。 方法的作用很簡單,那麼接下來,我們一起看看skb_copy_expand方法的實現方式以及用法。 skb_copy_expand原函式 /** * skb_copy_
WireShark學習之抓取和分析HTTP資料包
1. 設定過濾條件 - 指定網路協議http 2. 開啟Chrome瀏覽器輸入網址 - 在瀏覽器輸入https://sspai.com/post/30292 3. 在抓獲得包中得到兩個資料包,分別是HTTP請求以及HTTP響應
Unity3D研究院之C#使用Socket與HTTP連線伺服器傳輸資料包
最近專案中需要使用HTTP與Socket,把自己這段時間學習的資料整理一下。有關Socket與HTTP的基礎知識MOMO就不贅述拉,不懂得朋友自己谷歌吧。我們專案的需求是在登入的時候使用HTTP請求,遊戲中其它的請求都用Socket請求,比如人物移動同步座標,同步關卡