網(wǎng)絡(luò)通信編程 原始套接字程序設(shè)計(jì).ppt_第1頁(yè)
網(wǎng)絡(luò)通信編程 原始套接字程序設(shè)計(jì).ppt_第2頁(yè)
網(wǎng)絡(luò)通信編程 原始套接字程序設(shè)計(jì).ppt_第3頁(yè)
網(wǎng)絡(luò)通信編程 原始套接字程序設(shè)計(jì).ppt_第4頁(yè)
網(wǎng)絡(luò)通信編程 原始套接字程序設(shè)計(jì).ppt_第5頁(yè)
已閱讀5頁(yè),還剩90頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、A,1,第四章,原始套接字,A,2,內(nèi)容提要,1.使用原始套接字 2.套接字選項(xiàng) 3.ICMP編程 4.使用IP頭包含選項(xiàng) 5.網(wǎng)絡(luò)嗅探器實(shí)例,A,3,1.使用原始套接字,利用原始套接字(Raw Socket),可訪問(wèn)底層傳輸協(xié)議。,原始套接字(Raw Socket)與標(biāo)準(zhǔn)套接字區(qū)別,A,4,4,使用原始套接字可以做什么? 實(shí)現(xiàn)一些實(shí)用工具(ping,traceroute)。 可對(duì)IP頭,TCP頭,UDP頭,ICMP頭等進(jìn)行操作。 原始套接字使用SOCK_RAW套接字類型來(lái)創(chuàng)建的,目前只有Winsock2提供了對(duì)它的支持。 無(wú)論Microsoft Windows CE 還是老版本的Window

2、s 95 (無(wú)Winsock 2升級(jí))均不能利用原始套接字。,A,5,創(chuàng)建原始套接字,原始套接字類型 在IP頭中使用預(yù)定義的協(xié)議(如ICMP) 在IP頭中使用自定義的協(xié)議(使用IP頭包含選項(xiàng)),A,6,創(chuàng)建原始套接字 使用socket()或WSASocket()創(chuàng)建原始套接字。 例:創(chuàng)建原始套接字 使用預(yù)定義協(xié)議: SOCKET s; S=socket(AF_INET,SOCK_RAM,IPPROTO_ICMP); /OR S=WSAsocket(AF_INEF,SOCK_RAM,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);,A,7,使用自定義協(xié)議 使用I

3、GMP、UDP、IP或者原始IP,只需分別設(shè)置IPPROTO_IGMP、IPPROTO_UDP、IPPROTO_IP或IPPROTO_RAW即可。 注意:在Windows NT 4、Windows 98以及Windows 95(安裝Winsock 2)操作系統(tǒng)中,創(chuàng)建原始套接字時(shí),只能使用ICMP。 協(xié)議標(biāo)志IPPROTO_UDP、IPPROTO_IP以及IPPROTO_RAW均要求使用套接字選項(xiàng)IP_HDRINCL,而該選項(xiàng)在上述平臺(tái)下都是不支持的。 Windows 2000提供了對(duì)IP_HDRINCL選項(xiàng)的支持,所以能夠處理IP頭(IPPROTO_RAW)、TCP頭(IPPROTO_TCP

4、)以及UDP頭(IPPROTO_UDP)。 無(wú)論是否設(shè)置IP_HDRINCL選項(xiàng),原始套接字上接收到的數(shù)據(jù)都會(huì)包含IP頭。,A,8,使用原始套接字可以對(duì)底層傳輸機(jī)制加以控制,所以有些人將其用于不法用途,,A,9,9,套接字選項(xiàng)操作函數(shù) getsocketopt()獲取套接字選項(xiàng)信息。 int getsocketopt( SOCKET s, /套接字描述符 int level, /選項(xiàng)級(jí)別 int optname, /選項(xiàng)名稱 char *optval, /選項(xiàng)值 int *optlen/選項(xiàng)長(zhǎng)度 ); setsocketopt( ) 設(shè)置套接字選項(xiàng)。 int setsocketopt(SOCK

5、ET s, int level, int optname, const char *optval, int optlen);,2.套接字選項(xiàng),A,10,10,選項(xiàng)級(jí)別: 協(xié)議的層次對(duì)應(yīng)選項(xiàng)級(jí)別 應(yīng)用層:SOL_SOCKET 傳輸層:IPPROTO_TCP、IPPROTO_UDP 網(wǎng)絡(luò)層:IPPROTO_IP 不同級(jí)別屬性不同,同一級(jí)別的不同協(xié)議的屬性不同,因此必須指定level參數(shù) 例:Int nTime=2*1000 setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*) IPPROTO_ICMP指定使用ICMP,A,39,PING 程序執(zhí)行步驟,1、創(chuàng)建協(xié)議

6、類型為IPPROTO_ICMP的原始套接字,設(shè)置套接字的屬性。 2、創(chuàng)建并初始化ICMP封包。 3、調(diào)用sendto函數(shù)向遠(yuǎn)程主機(jī)發(fā)送ICMP請(qǐng)求。 4、調(diào)用recvfrom函數(shù)接收ICMP響應(yīng)。,A,40,/ Ping.h / 聲明IP頭數(shù)據(jù)結(jié)構(gòu) typedef struct _IPHeader / 20字節(jié)的IP頭 UCHAR iphVerLen; / 版本號(hào)和頭長(zhǎng)度(各占4位) UCHAR ipTOS; / 服務(wù)類型 USHORT ipLength; / 封包總長(zhǎng)度,即整個(gè)IP報(bào)的長(zhǎng)度 USHORT ipID; / 封包標(biāo)識(shí),惟一標(biāo)識(shí)發(fā)送的每一個(gè)數(shù)據(jù)報(bào) USHORT ipFlags; /

7、 標(biāo)志和片偏移 UCHAR ipTTL; / 生存時(shí)間,就是TTL UCHAR ipProtocol; / 協(xié)議,可能是TCP、UDP、ICMP等 USHORT ipChecksum; / 校驗(yàn)和 ULONG ipSource; / 源IP地址 ULONG ipDestination; / 目標(biāo)IP地址 IPHeader, *PIPHeader;,PING 程序代碼,A,41,/ICMP頭數(shù)據(jù)結(jié)構(gòu) typedef struct icmp_hdr unsigned char icmp_type;/ 消息類型 unsigned char icmp_code;/ 代碼 unsigned short

8、icmp_checksum;/ 校驗(yàn)和 unsigned short icmp_id; / 用來(lái)惟一標(biāo)識(shí)此請(qǐng)求的ID號(hào),通常設(shè)置為進(jìn)程ID unsigned short icmp_sequence;/ 序號(hào) unsigned long icmp_timestamp; / 數(shù)據(jù)傳輸時(shí)間 ICMP_HDR, *PICMP_HDR; /ICMP回送請(qǐng)求的數(shù)據(jù)結(jié)構(gòu) typedef struct _EchoRequest ICMP_HDR icmphdr; char cData32; ECHOREQUEST,*PECHOREQUEST;,A,42,/ICMP回送應(yīng)答的數(shù)據(jù)結(jié)構(gòu) #define REQ_D

9、ATASIZE 32 typedef struct _EchoReply IPHeader iphdr; ECHOREQUEST echoRequest; ECHOREPLAY,*PECHOREPLAY; / 校驗(yàn)和的計(jì)算 / 以16位的字為單位將緩沖區(qū)的內(nèi)容相加,如果緩沖區(qū)長(zhǎng)度為奇數(shù), / 則再加上一個(gè)字節(jié)。它們的和存入一個(gè)32位的雙字中 USHORT checksum(USHORT* buff, int size);,/ Ping.cpp #include #include #pragma comment(lib, WS2_32)/ 鏈接到WS2_32.lib #include #incl

10、ude ping.h,A,43,USHORT checksum(USHORT* buff, int size) u_long cksum = 0; while(size1) / 將數(shù)據(jù)以字為單位累加到cksum 中 cksum=cksum+ *buff; buff= buff +1; size= size- sizeof(USHORT); /等價(jià)于size=size-2; if(size=1) / 共有奇數(shù)個(gè)字節(jié)將最后一個(gè)字節(jié)擴(kuò)展為字,再累加 USHORT u=0; u=(USHORT)(*(UCHAR*)buff); cksum = cksum +u; / 校驗(yàn)位計(jì)算 /高16位和低16位相

11、加 cksum = (cksum 16) + (cksum , 位右移運(yùn)算符 右邊的值依次被移出了,左邊的位置依次放0,校驗(yàn)位計(jì)算 (1) 將32位的chsum高16位和低16位相加 (2) 自加當(dāng)前數(shù)的高16位 (3) 取反并轉(zhuǎn)換為16位,A,44,int main() WSADATA wsaData; WORD version = MAKEWORD(2, 2); int ret = WSAStartup(version, ,A,45,/ 創(chuàng)建ICMP封包(回送請(qǐng)求) ECHOREQUEST echoReq; / 填寫(xiě)ICMP封包數(shù)據(jù) echoReq.icmphdr.icmp_type =

12、8;/ 請(qǐng)求一個(gè)ICMP回顯 echoReq.icmphdr.icmp_code = 0; echoReq.icmphdr.icmp_id = (USHORT)GetCurrentProcessId(); echoReq.icmphdr.icmp_checksum = 0; echoReq.icmphdr.icmp_sequence = 0; / 填充數(shù)據(jù)部分,可以為任意 memset(/Sets buffers to a specified character.,A,46,/ 開(kāi)始發(fā)送和接收ICMP封包 USHORT nSeq = 0; SOCKADDR_IN from; int nLen

13、= sizeof(from); while(TRUE) static int nCount = 0; int nRet; if(nCount+ = 4) break; echoReq.icmphdr.icmp_checksum = 0; / GetTickCount() 系統(tǒng)開(kāi)始后,已經(jīng)經(jīng)過(guò)的毫秒數(shù) echoReq.icmphdr.icmp_timestamp = GetTickCount(); echoReq.icmphdr.icmp_sequence = nSeq+; echoReq.icmphdr.icmp_checksum = checksum(USHORT*) ,A,47,/接收回送

14、應(yīng)答包 ECHOREPLAY echoReply; nRet = recvfrom(sRaw, (char*) ,A,48,/ 下面開(kāi)始解析接收到的封包 if(nRet sizeof(ECHOREPLAY) printf( Too few bytes from %s n, inet_ntoa(from.sin_addr); / 接收到的數(shù)據(jù)中包含IP頭,IP頭大小為20個(gè)字節(jié) if(echoReply.echoRequest.icmphdr.icmp_type != 0) / 回顯 printf( nonecho type %d recvd n, echoReply.echoRequest.i

15、cmphdr.icmp_type); return -1; if(echoReply.echoRequest.icmphdr.icmp_id != GetCurrentProcessId() printf( someone elses packet! n); return -1; ,A,49,printf( %d bytes Reply from %s:, nRet, inet_ntoa(from.sin_addr); printf( icmp_seq = %d. , echoReply.echoRequest.icmphdr.icmp_sequence); int nTick = GetTi

16、ckCount(); printf( time: %d ms, nTick - echoReply.echoRequest.icmphdr.icmp_timestamp); printf( TTL= %d , echoReply.iphdr.ipTTL); printf( n); Sleep(1000); WSACleanup();/釋放Winsock庫(kù) return 0; ,A,50,64 bytes Reply from 192.168.0.2: icmp_seq = 0. time: 0 ms TTL= 64 64 bytes Reply from 192.168.0.2 : icmp_

17、seq = 1. time: 0 ms TTL= 64 64 bytes Reply from 192.168.0.2 : icmp_seq = 2. time: 0 ms TTL= 64 64 bytes Reply from 192.168.0.2 : icmp_seq = 3. time: 0 ms TTL= 64,PING 程序運(yùn)行結(jié)果,A,51,Traceroute(追蹤路由) 利用Traceroute可偵測(cè)出到達(dá)網(wǎng)絡(luò)內(nèi)特定主機(jī),中途需經(jīng)過(guò)哪些路由器(IP地址)。 利用Ping,使用IP選項(xiàng)頭內(nèi)的記錄路由選項(xiàng),偵測(cè)中途經(jīng)過(guò)的路由器IP地址,但Ping最多只支持9跳。,TRACEROU

18、TE程序分析,A,52,52,A,53,若網(wǎng)絡(luò)較大,穿過(guò)的路由器不止9個(gè),應(yīng)換用Traceroute。 實(shí)現(xiàn)Traceroute程序的方法 基本思想:多次發(fā)送數(shù)據(jù)包,TTL遞增,TTL 為0時(shí)返回一條 ICMP報(bào)文。 例:路由跟蹤程序(采用發(fā)送UDP數(shù)據(jù)包) 創(chuàng)建兩個(gè)套接字: sRaw 用于接收ICMP數(shù)據(jù)包 sSend用于發(fā)送TTL不斷增加的UDP數(shù)據(jù)報(bào),A,54,Traceroute程序主要代碼,typedef struct icmp_hdr unsigned char icmp_type;/ 消息類型 unsigned char icmp_code;/ 代碼 unsigned short

19、 icmp_checksum;/ 校驗(yàn)和 / 下面是回顯頭 unsigned short icmp_id;/ 用來(lái)惟一標(biāo)識(shí)此請(qǐng)求的ID號(hào),通常設(shè)置為進(jìn)程ID unsigned short icmp_sequence;/ 序列號(hào) unsigned long icmp_timestamp; / 時(shí)間戳 ICMP_HDR, *PICMP_HDR;,A,55,BOOL SetTTL(SOCKET s, int nValue) int ret = setsockopt(s, IPPROTO_IP, IP_TTL, (char*) ,A,56,void main() char *szDestIp = “2

20、02.199.25.20”; /目的地址 char recvBuf1024 = 0 ; / 創(chuàng)建用于接收ICMP封包的原始套節(jié)字,綁定到本地端口 SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); sockaddr_in in; in.sin_family = AF_INET; in.sin_port = 0; in.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(sRaw, (sockaddr*),A,57,/ 創(chuàng)建用于發(fā)送UDP封包的套節(jié)字 SOCKET sSend = socket(AF_IN

21、ET, SOCK_DGRAM, 0); SOCKADDR_IN destAddr; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(22); destAddr.sin_addr.S_un.S_addr = inet_addr(szDestIp); int nTTL = 1; int nRet; ICMP_HDR *pICMPHdr; int nTick; SOCKADDR_IN recvAddr; do / 設(shè)置UDP封包的TTL值 SetTTL(sSend, nTTL); nTick = GetTickCount(); / 發(fā)

22、送這個(gè)UDP封包 nRet = sendto(sSend, hello, 5, 0, (sockaddr*),A,58,if(nRet = SOCKET_ERROR) printf( sendto() failed n); break; / 等待接收路由器返回的ICMP報(bào)文 int nLen = sizeof(recvAddr); nRet = recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*) ,A,59,/ 解析接收到的ICMP數(shù)據(jù) pICMPHdr = (ICMP_HDR*) ,A,60,4. 使用IP頭包含選項(xiàng),創(chuàng)建原始套接字后使用IP_HDRIN

23、CL套接字選項(xiàng)可對(duì)IP頭進(jìn)行操作,同時(shí)也能操作TCP或UDP頭(或封裝在IP內(nèi)的其他任何協(xié)議)。 使用IP_HDRINCL選項(xiàng)時(shí),必須針對(duì)每一次發(fā)送調(diào)用,向IP頭內(nèi)自行填充內(nèi)容。同時(shí)還需填寫(xiě)封裝在其中的其他協(xié)議頭。 相關(guān)協(xié)議報(bào)文格式,A,61,固 定 部 分,可變 部分,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,數(shù) 據(jù) 部 分,首 部,傳送,IP 數(shù)據(jù)報(bào),發(fā)送在前,IP 數(shù)據(jù)報(bào)格式,A,62,可

24、變 部分,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,數(shù) 據(jù) 部 分,首 部,傳送,IP 數(shù)據(jù)報(bào),A,63,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,數(shù) 據(jù) 部 分,首 部,傳送,I

25、P 數(shù)據(jù)報(bào),固 定 部 分,A,64,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,65,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變

26、 部分,A,66,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,67,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,68,首

27、 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,69,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,標(biāo)志(flag)占 3 位,目前

28、只有前兩位有意義。 標(biāo)志字段的最低位是 MF (More Fragment)。 MF 1 表示后面“還有分片”。MF 0 表示最后一個(gè)分片。 標(biāo)志字段中間的一位是 DF (Dont Fragment) 。 只有當(dāng) DF 0 時(shí)才允許分片。,A,70,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,71,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生

29、 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,生存時(shí)間(8 位)記為 TTL (Time To Live),這是為了 限制數(shù)據(jù)報(bào)在網(wǎng)絡(luò)中的生存時(shí)間,用“跳數(shù)”作為 TTL 的單位。數(shù)據(jù)報(bào)每經(jīng)過(guò)一個(gè)路由器,其 TTL 值就減 1。,A,72,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,

30、可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,73,運(yùn)輸層,網(wǎng)絡(luò)層,首部,TCP,UDP,ICMP,IGMP,OSPF,數(shù) 據(jù) 部 分,IP 數(shù)據(jù)報(bào),A,74,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分 服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,75,首 部,0,4,8,16,19,24,31,版 本,標(biāo)志,生 存 時(shí) 間,協(xié) 議,標(biāo) 識(shí),區(qū) 分

31、服 務(wù),總 長(zhǎng) 度,片 偏 移,填 充,首 部 檢 驗(yàn) 和,源 地 址,目 的 地 址,可 選 字 段 (長(zhǎng) 度 可 變),位,首部長(zhǎng)度,數(shù) 據(jù) 部 分,固 定 部 分,可變 部分,A,76,IP 數(shù)據(jù)報(bào)首部的可變部分,IP 首部的可變部分就是一個(gè)選項(xiàng)字段,用來(lái)支持排錯(cuò)、測(cè)量以及安全等措施,內(nèi)容很豐富。 選項(xiàng)字段的長(zhǎng)度可變,從 1 個(gè)字節(jié)到 40 個(gè)字節(jié)不等,取決于所選擇的項(xiàng)目。 增加首部的可變部分是為了增加 IP 數(shù)據(jù)報(bào)的功能,但這同時(shí)也使得 IP 數(shù)據(jù)報(bào)的首部長(zhǎng)度成為可變的。這就增加了每一個(gè)路由器處理數(shù)據(jù)報(bào)的開(kāi)銷。,A,77,typedef struct _IPHeader / 20字節(jié)的

32、IP頭 UCHAR iphVerLen; / 版本號(hào)和頭長(zhǎng)度(各占4位) UCHAR ipTOS; / 服務(wù)類型 USHORT ipLength; / 整個(gè)IP報(bào)文長(zhǎng)度 USHORT ipID; / 封包標(biāo)識(shí) USHORT ipFlags;/ 標(biāo)志、片偏移量 UCHAR ipTTL;/ 生存時(shí)間TTL UCHAR ipProtocol; / 協(xié)議(TCP、UDP、ICMP等) USHORT ipChecksum; / 校驗(yàn)和 ULONG ipSource; / 源IP地址 ULONG ipDestination; / 目標(biāo)IP地址 IPHeader, *PIPHeader;,網(wǎng)絡(luò)編程中IP頭對(duì)

33、應(yīng)結(jié)構(gòu)體聲明,A,78,UDP頭簡(jiǎn)單。長(zhǎng)度僅為8個(gè)字節(jié),而且只包含了四個(gè)字段,格式如圖所示。,由于UDP是一種不能保證數(shù)據(jù)可靠傳輸?shù)膮f(xié)議,所以校驗(yàn)和的計(jì)算是可選的。 UDP校驗(yàn)和除覆蓋了UDP頭之外,還同時(shí)覆蓋了實(shí)際的數(shù)據(jù),此外還包括IP頭的一部分。,A,79,typedef struct _UDPHeader USHORTsourcePort;/ 源端口號(hào)USHORTdestinationPort; / 目的端口號(hào)USHORTlen;/ 封包長(zhǎng)度 USHORTchecksum;/ 校驗(yàn)和 UDPHeader, *PUDPHeader;,A,80,計(jì)算UDP校驗(yàn)和的附加字段叫作“偽首部”。 U

34、DP校驗(yàn)和基于如下幾個(gè)域: 32位源IP地址(IP頭) 32位目標(biāo)IP地址(IP頭) 8位字段(全零) 8位協(xié)議 16位UDP長(zhǎng)度 16位源端口號(hào) 16位目標(biāo)端口號(hào) 16位UDP長(zhǎng)度 16位UDP校驗(yàn)和 UDP數(shù)據(jù),A,81,發(fā)送原始UDP封包的步驟 首先以IPPOTO_UDP為協(xié)議類型創(chuàng)建一個(gè)原始套接字,打開(kāi)原始套接字上的IP_HDRINCL選項(xiàng); 然后構(gòu)建UDP封包(先設(shè)置IP頭,再設(shè)置UDP頭,最后設(shè)置數(shù)據(jù)); 初始化完整的UDP封包之后,調(diào)用sendto函數(shù)即可將它發(fā)送。 例:發(fā)送原始UDP封包,A,82,發(fā)送原始UDP封包,int main() / 輸入?yún)?shù)信息 char szDes

35、tIp = 10.16.115.88; / = 填寫(xiě)目的IP地址 char szSourceIp = 127.0.0.1; / = 填寫(xiě)您自己的IP地址 USHORT nDestPort = 4567; USHORT nSourcePort = 8888; char szMsg = This is a test rn; int nMsgLen = strlen(szMsg); / 創(chuàng)建原始套節(jié)字 SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); / 有效IP頭包含選項(xiàng) BOOL bIncl = TRUE; setsockopt(sRaw

36、, IPPROTO_IP, IP_HDRINCL, (char *),A,83,/ IP頭 IPHeader *pIphdr = (IPHeader *)buff; pIphdr-iphVerLen = (4ipLength = htons(sizeof(IPHeader) + sizeof(UDPHeader) + nMsgLen); pIphdr-ipTTL = 128; pIphdr-ipProtocol = IPPROTO_UDP; pIphdr-ipSource = inet_addr(szSourceIp); pIphdr-ipDestination = inet_addr(szD

37、estIp); pIphdr-ipChecksum = checksum(USHORT*)pIphdr, sizeof(IPHeader); / UDP頭 UDPHeader *pUdphdr = (UDPHeader *),A,84,ComputeUdpPseudoHeaderChecksum(pIphdr, pUdphdr, pData, nMsgLen); / 設(shè)置目的地址 SOCKADDR_IN destAddr = 0 ; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(nDestPort); destAddr.sin

38、_addr.S_un.S_addr = inet_addr(szDestIp); / 發(fā)送原始UDP封包 int nRet; for(int i=0; i5; i+) nRet = sendto(sRaw, buff, sizeof(IPHeader) + sizeof(UDPHeader) + nMsgLen, 0, (sockaddr*) ,A,85,5. 網(wǎng)絡(luò)嗅探器實(shí)例,嗅探器設(shè)計(jì)原理 網(wǎng)卡正常工作模式:套接字程序只接收與自己硬件地址相匹配的或是以廣播形式發(fā)出的數(shù)據(jù)幀,對(duì)于其他形式的數(shù)據(jù)幀丟棄。 網(wǎng)絡(luò)嗅探器的目的:從網(wǎng)卡接收所有經(jīng)過(guò)它的數(shù)據(jù)包,這些數(shù)據(jù)包既可以是發(fā)給它的也可以是發(fā)往別處的

39、。 達(dá)到上述目的就不能讓網(wǎng)卡按通常的正常模式工作,而必須將其設(shè)置為混雜模式。 設(shè)置混雜模式只能在原始套接字進(jìn)行,不能在流套接字和數(shù)據(jù)報(bào)套接字進(jìn)行。,A,86,TCP 首部,20 字節(jié)的 固定首部,目 的 端 口,數(shù)據(jù) 偏移,檢 驗(yàn) 和,選 項(xiàng) (長(zhǎng) 度 可 變),源 端 口,序 號(hào),緊 急 指 針,窗 口,確 認(rèn) 號(hào),保 留,F I N,32 位,S Y N,R S T,P S H,A C K,U R G,位 0 8 16 24 31,填 充,TCP 數(shù)據(jù)部分,TCP 首部,TCP 報(bào)文段,IP 數(shù)據(jù)部分,IP 首部,發(fā)送在前,A,87,typedef struct _TCPHeader/ 20字節(jié)的TCP頭 USHORTsourcePort; / 16位源端口號(hào) USHORTdestinationPort; / 16位目的端口號(hào) ULONGsequenceNumber; / 32位序列號(hào) ULONGacknowledgeNumber; / 32位確認(rèn)號(hào) UCHARdataoffset; / 高4位首部長(zhǎng)度/6位保留字 UCHARflags; / 6位標(biāo)志位 USHORTwindows;/ 16位窗口大小 USHORTchecksum;/ 16位校驗(yàn)和 USHORTurgentPointer;/ 16位緊急數(shù)據(jù)偏移量 TC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論