国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

網(wǎng)絡(luò)安全編程:原始套接字的使用

安全
本文通過(guò)介紹原始套接字實(shí)現(xiàn)經(jīng)典的網(wǎng)絡(luò)命令,即Ping命令。通過(guò)完成一個(gè)Ping命令來(lái)初步了解和掌握原始套接字的使用。

 [[380854]]

使用TCP或UDP時(shí),需要在調(diào)用socket()函數(shù)時(shí)為它的第2個(gè)參數(shù)指定相應(yīng)的類型,比如SOCK_STREAM是代表要使用TCP,而SOCK_DGRAM表示要使用UDP協(xié)議。除了可以指定這兩種類型以外,還可以指定為原始套接字類型,即SOCK_RAW。當(dāng)socket()函數(shù)的第2個(gè)參數(shù)指定為SOCK_STREAM或SOCK_DGRAM時(shí),第3個(gè)參數(shù)可以缺省。而當(dāng)socket()函數(shù)的第2個(gè)參數(shù)指定為SOCK_RAW時(shí),第3個(gè)參數(shù)就必須明確指定需要使用的協(xié)議。

當(dāng)套接字類型指定為SOCK_RAW時(shí),協(xié)議類型的常用取值有IPPROTO_IP、IPPROTO_ICMP、IPPROTO_TCP、IPPROTO_UDP和IPPROTO_RAW。使用前四種類型,當(dāng)發(fā)送數(shù)據(jù)時(shí),系統(tǒng)會(huì)自動(dòng)為數(shù)據(jù)加上IP首部并設(shè)置IP首部中的上層協(xié)議字段(如果有IP_HDRINCL選項(xiàng),則系統(tǒng)不會(huì)自動(dòng)添加IP首部);當(dāng)接收數(shù)據(jù)時(shí),系統(tǒng)不會(huì)將IP首部移除,需要程序自行處理。如果使用IPPROTO_RAW,那么系統(tǒng)將數(shù)據(jù)包直接送到網(wǎng)絡(luò)層發(fā)送數(shù)據(jù),并且需要程序自己構(gòu)造IP首部中的字段。

本文通過(guò)介紹原始套接字實(shí)現(xiàn)經(jīng)典的網(wǎng)絡(luò)命令,即Ping命令。通過(guò)完成一個(gè)Ping命令來(lái)初步了解和掌握原始套接字的使用。

1. Ping命令的使用

Ping命令的目的是為了測(cè)試另一臺(tái)主機(jī)是否可達(dá),Ping命令發(fā)送一份ICMP回顯請(qǐng)求報(bào)文給主機(jī),并等待返回ICMP回顯應(yīng)答。一般來(lái)說(shuō),如果不能Ping到某臺(tái)主機(jī),那么就不能與該主機(jī)進(jìn)行通信(例外的情況是對(duì)方主機(jī)的防火墻將進(jìn)入主機(jī)的回顯請(qǐng)求報(bào)文屏蔽掉了,這種情況雖然Ping不通,但是仍然可以正常進(jìn)行通信)。

Ping命令有很多參數(shù),打開(kāi)命令行直接輸入Ping后按下回車鍵,這樣就可以看到Ping命令的參數(shù)列表,如圖1所示。

圖1  Ping命令的參數(shù)列表

通常情況下,用戶都只是簡(jiǎn)單Ping一下某個(gè)主機(jī)的地址。Ping命令的參數(shù)可以是主機(jī)名稱、域名和IP地址,后兩者是較為常用的。下面簡(jiǎn)單演示一個(gè)Ping的例子,具體如下: 

  1. C:\>ping 8.8.4.4  
  2. Pinging 8.8.4.4 with 32 bytes of data:  
  3. Reply from 8.8.4.4: bytes=32 time=57ms TTL=47  
  4. Reply from 8.8.4.4: bytes=32 time=54ms TTL=47  
  5. Reply from 8.8.4.4: bytes=32 time=54ms TTL=47  
  6. Reply from 8.8.4.4: bytes=32 time=51ms TTL=47  
  7. Ping statistics for 8.8.4.4:  
  8.  Packets: Sent = 4Received = 4Lost = 0 (0% loss), 
  9. Approximate round trip times in milli-seconds:  
  10.  Minimum = 51msMaximum = 57msAverage = 54ms 

上面就是使用Ping命令對(duì)8.8.4.4這個(gè)IP進(jìn)行回顯請(qǐng)求后的輸出信息。這里來(lái)解釋一下請(qǐng)求后的回顯信息的含義。

  1. Pinging 8.8.4.4 with 32 bytes of data: 

正在將32字節(jié)數(shù)據(jù)發(fā)送到遠(yuǎn)程主機(jī)8.8.4.4,如果Ping的是一個(gè)域名或主機(jī)名的話,這里會(huì)將域名(主機(jī)名)轉(zhuǎn)換為IP地址顯示出來(lái)。 

  1. Reply from 8.8.4.4: bytes=32 time=57ms TTL=47 

本地主機(jī)已經(jīng)收到回顯應(yīng)答信息,bytes=32表示有32字節(jié),time=57ms表示公用了57毫秒,TTL表示的是生存時(shí)間值,該值可以進(jìn)行設(shè)置,該值最大為255。每個(gè)處理數(shù)據(jù)包的路由器都需要把TTL的值減1或減去數(shù)據(jù)包在路由器中停留的秒數(shù)。由于大多數(shù)路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的延時(shí)都小于1秒,因此TTL最終成為一個(gè)跳站的計(jì)數(shù)器,所經(jīng)過(guò)的每個(gè)路由器都將其值減1,當(dāng)該值被減到0值時(shí),該包將被丟棄。 

  1. Ping statistics for 8.8.4.4:  
  2.  Packets: Sent = 4Received = 4Lost = 0 (0% loss),  
  3. Approximate round trip times in milli-seconds:  
  4.  Minimum = 51msMaximum = 57msAverage = 54ms 

Ping 8.8.4.4的統(tǒng)計(jì)信息為:Sent=4表示發(fā)送了4個(gè)數(shù)據(jù)包,Received=4表示接收了4個(gè)數(shù)據(jù)包,Lost=0(0% loss)表示丟失的數(shù)據(jù)包是0個(gè),丟包率為0%。

發(fā)送時(shí)間的大概情況:Mininum=51ms,最快是51ms,Maximum=57ms,最慢是57ms,Average=54ms,平均為54ms。

2. Ping命令的構(gòu)造

Ping命令依賴的不是TCP,也不是UDP,它依賴的是ICMP。ICMP是IP層的協(xié)議之一,它傳遞差錯(cuò)報(bào)文以及其他需要注意的信息。ICMP報(bào)文通常被IP層或高層協(xié)議使用。ICMP封裝在IP數(shù)據(jù)報(bào)內(nèi)部,如圖2所示。

圖2  ICMP封裝在IP數(shù)據(jù)報(bào)內(nèi)部

ICMP報(bào)文的格式如圖3所示。

圖3  ICMP報(bào)文格式

ICMP協(xié)議的類型碼與代碼根據(jù)不同的情況,各自取不同的值。Ping命令類型碼用到了2個(gè)值,分別是0和8。而代碼的取值都是0。當(dāng)類型碼取值為0時(shí),代碼的0值表示回顯應(yīng)答;當(dāng)類型碼取值為8時(shí),代碼的0值表示請(qǐng)求回顯。Ping命令發(fā)送一個(gè)ICMP數(shù)據(jù)報(bào)時(shí),類型碼為8,代碼為0,表示向?qū)Ψ街鳈C(jī)進(jìn)行請(qǐng)求回顯;當(dāng)收到對(duì)方的ICMP數(shù)據(jù)報(bào)時(shí),類型碼為0,代碼為0,表示收到了對(duì)方主機(jī)的回顯應(yīng)答。簡(jiǎn)單來(lái)說(shuō),Ping命令發(fā)出的數(shù)據(jù)中,類型是8,代碼是0,如果對(duì)方有回應(yīng),那么對(duì)方回應(yīng)的數(shù)據(jù)中,類型是0,代碼是0。

在自己實(shí)現(xiàn)Ping命令時(shí),就是去自己構(gòu)造一個(gè)請(qǐng)求回顯的ICMP數(shù)據(jù)報(bào),然后進(jìn)行發(fā)送。ICMP的數(shù)據(jù)結(jié)構(gòu)定義如下: 

  1. // ICMP 協(xié)議結(jié)構(gòu)體定義  
  2. struct icmp_header  
  3.  
  4.   unsigned char icmp_type; // 消息類型  
  5.   unsigned char icmp_code; // 代碼  
  6.   unsigned short icmp_checksum; // 校驗(yàn)和  
  7.   unsigned short icmp_id; // 用來(lái)唯一標(biāo)識(shí)此請(qǐng)求的 ID 號(hào),通常設(shè)置為進(jìn)程 ID  
  8.   unsigned short icmp_sequence; // 序列號(hào)  
  9.   unsigned long icmp_timestamp; // 時(shí)間戳  
  10. }; 

ICMP的數(shù)據(jù)結(jié)構(gòu)在網(wǎng)絡(luò)開(kāi)發(fā)中會(huì)經(jīng)常用到,可以將其保存以備后用。

明白了ICMP協(xié)議的數(shù)據(jù)結(jié)構(gòu),現(xiàn)在用抓包工具(也可以稱為協(xié)議分析工具)Wireshark來(lái)分析一下ICMP結(jié)構(gòu)真實(shí)的情況,如圖4所示。

圖4  ICMP數(shù)據(jù)結(jié)構(gòu)分析

在圖4中,標(biāo)識(shí)1的部分是對(duì)協(xié)議進(jìn)行過(guò)濾設(shè)置的,在該部分輸入“ICMP”可以讓W(xué)ireshark只顯示ICMP的數(shù)據(jù)記錄。相應(yīng)地,可以輸入“TCP”、“UDP”、“HTTP”等協(xié)議進(jìn)行篩選過(guò)濾。標(biāo)識(shí)2的部分用于顯示篩選后的ICMP記錄,從這里可以明顯看出源IP地址、目的IP地址和協(xié)議的類型。標(biāo)識(shí)3的部分用于顯示ICMP數(shù)據(jù)結(jié)構(gòu)的值和附加的數(shù)據(jù)內(nèi)容。最下面的部分顯示了數(shù)據(jù)的原始的二進(jìn)制數(shù)據(jù),在熟練掌握協(xié)議后,查看原始的二進(jìn)制數(shù)據(jù)也并不是不可能的。

3. Ping命令的實(shí)現(xiàn)

有了前面的基礎(chǔ),就可以構(gòu)造自己的ICMP數(shù)據(jù)報(bào)來(lái)構(gòu)造自己的Ping命令了。首先,定義兩個(gè)常量,還有計(jì)算校驗(yàn)和的函數(shù),具體如下: 

  1. struct icmp_header  
  2.  
  3.   unsigned char icmp_type; // 消息類型  
  4.   unsigned char icmp_code; // 代碼  
  5.   unsigned short icmp_checksum; // 校驗(yàn)和  
  6.   unsigned short icmp_id; // 用來(lái)唯一標(biāo)識(shí)此請(qǐng)求的 ID 號(hào),通常設(shè)置為進(jìn)程 ID  
  7.   unsigned short icmp_sequence; // 序列號(hào)  
  8.   unsigned long icmp_timestamp; // 時(shí)間戳 
  9. };  
  10. #define ICMP_HEADER_SIZE sizeof(icmp_header)  
  11. #define ICMP_ECHO_REQUEST 0x08  
  12. #define ICMP_ECHO_REPLY 0x00  
  13. // 計(jì)算校驗(yàn)和  
  14. unsigned short chsum(struct icmp_header *picmp, int len)  
  15.  
  16.   long sum = 0 
  17.   unsigned short *pusicmp = (unsigned short *)picmp;  
  18.   while ( len > 1 )  
  19.   {  
  20.     sum += *(pusicmp++);  
  21.     if ( sum & 0x80000000 )  
  22.     {  
  23.       sum = (sum & 0xffff) + (sum >> 16);  
  24.     }  
  25.     len -2
  26.   }  
  27.   if ( len )  
  28.   {  
  29.     sum += (unsigned short)*(unsigned char *)pusicmp;  
  30.   }  
  31.   while ( sum >> 16 )  
  32.   {  
  33.     sum = (sum & 0xffff) + (sum >> 16);  
  34.   }  
  35.   return (unsigned short)~sum;  

ICMP的校驗(yàn)值是一個(gè)16位的無(wú)符號(hào)整型,它會(huì)將ICMP協(xié)議頭不的數(shù)據(jù)進(jìn)行累加,當(dāng)累加有溢出的話,會(huì)將溢出的部分也進(jìn)行累加。具體計(jì)算校驗(yàn)和的算法就不過(guò)多介紹了,如果對(duì)校驗(yàn)和計(jì)算的代碼不了解,可以進(jìn)行單步調(diào)試來(lái)進(jìn)行分析。再來(lái)看一下對(duì)于ICMP結(jié)構(gòu)體的填充,具體代碼如下: 

  1. BOOL MyPing(char *szDestIp)  
  2.  
  3.   BOOL bRet = TRUE 
  4.   WSADATA wsaData;  
  5.   int nTimeOut = 1000 
  6.   char szBuff[ICMP_HEADER_SIZE + 32] = { 0 };  
  7.   icmp_header *pIcmp = (icmp_header *)szBuff;  
  8.   char icmp_data[32] = { 0 };  
  9.   WSAStartup(MAKEWORD(2, 2), &wsaData); 
  10.   // 創(chuàng)建原始套接字  
  11.   SOCKET s = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)  
  12.   // 設(shè)置接收超時(shí)  
  13.   setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char const*)&nTimeOut, sizeof(nTimeOut));  
  14.   // 設(shè)置目的地址  
  15.   sockaddr_in dest_addr;  
  16.   dest_addr.sin_family = AF_INET 
  17.   dest_addr.sin_addr.S_un.S_addr = inet_addr(szDestIp);  
  18.   dest_addr.sin_port = htons(0);  
  19.   // 構(gòu)造 ICMP 封包  
  20.   pIcmp->icmp_type = ICMP_ECHO_REQUEST 
  21.   pIcmp->icmp_code = 0 
  22.   pIcmp->icmp_id = (USHORT)::GetCurrentProcessId();  
  23.   pIcmp->icmp_sequence = 0 
  24.   pIcmp->icmp_timestamp = 0 
  25.   pIcmp->icmp_checksum = 0 
  26.   // 拷貝數(shù)據(jù)  
  27.   // 這里的數(shù)據(jù)可以是任意的  
  28.   // 這里使用 abc 是為了和系統(tǒng)提供的看起來(lái)一樣  
  29.   memcpy((szBuff + ICMP_HEADER_SIZE), "abcdefghijklmnopqrstuvwabcdefghi", 32);  
  30.   // 計(jì)算校驗(yàn)和  
  31.   pIcmp->icmp_checksum = chsum((struct icmp_header *)szBuff, sizeof(szBuff));  
  32.   sockaddr_in from_addr;  
  33.   char szRecvBuff[1024];  
  34.   int nLen = sizeof(from_addr);  
  35.   sendto(s, szBuff, sizeof(szBuff), 0, (SOCKADDR *)&dest_addr, sizeof(SOCKADDR));  
  36.   recvfrom(s, szRecvBuff, MAXBYTE, 0, (SOCKADDR *)&from_addr, &nLen);  
  37.   // 判斷接收到的是否是自己請(qǐng)求的地址  
  38.   if ( lstrcmp(inet_ntoa(from_addr.sin_addr), szDestIp) )  
  39.   {  
  40.     bRet = FALSE 
  41.   }  
  42.   else  
  43.   {  
  44.     struct icmp_header *pIcmp1 = (icmp_header *)(szRecvBuff + 20);  
  45.     printf("%s\r\n", inet_ntoa(from_addr.sin_addr));  
  46.   }  
  47.   return bRet;  

這就是Ping命令的全部代碼了。自己寫一個(gè)函數(shù)調(diào)用它進(jìn)行測(cè)試。

在Windows XP以上的操作系統(tǒng)中運(yùn)行時(shí),比如Windows 8系統(tǒng),程序可能會(huì)無(wú)法正常的運(yùn)行,這是因?yàn)椴僮飨到y(tǒng)權(quán)限所導(dǎo)致的。在被編譯好的程序上單擊右鍵,在彈出的菜單上選擇“以管理員身份運(yùn)行”,這樣程序就可以正常的執(zhí)行了。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 計(jì)算機(jī)與網(wǎng)絡(luò)安全
相關(guān)推薦

2015-03-31 11:24:02

2015-10-16 09:33:26

TCPIP網(wǎng)絡(luò)協(xié)議

2013-12-27 13:39:23

Java套接字

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2014-12-17 09:22:10

網(wǎng)絡(luò)·安全技術(shù)周刊

2015-05-28 10:47:38

Unix網(wǎng)絡(luò)編程TCP

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進(jìn)程代碼

2014-12-11 09:20:30

TCP

2012-01-06 13:58:47

JavaTCP

2016-10-10 00:18:27

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進(jìn)程

2022-10-08 07:30:17

網(wǎng)絡(luò)安全編程語(yǔ)言C++

2009-03-10 13:59:41

C#套接字編程

2014-12-15 09:28:54

UDP

2021-06-18 09:55:09

網(wǎng)絡(luò)安全目錄監(jiān)控

2023-02-06 00:24:12

網(wǎng)絡(luò)安全裁員

2021-06-11 13:40:17

網(wǎng)絡(luò)安全專殺工具病毒

2021-03-01 11:38:15

網(wǎng)絡(luò)安全進(jìn)程代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品成人免费电影| 黄网动漫久久久| 九色精品91| 国产精品99| www.av在线| 午夜精品在线免费观看| 这里只有精品66| 欧美亚州在线观看| 99久久综合狠狠综合久久止| 2019中文字幕全在线观看| 中文字幕日韩av电影| 日韩久久久精品| 欧美性猛交xxxx乱大交退制版| 国产欧美一区二区三区在线看蜜臀 | 在线电影国产精品| 亚洲综合一区二区三区| 亚洲国产精品精华液2区45| 99精品免费网| 欧美熟乱15p| 成人偷拍自拍| 中文字幕日本一区| 一根才成人网| 亚洲欧美se| 欧美男男video| 男女免费观看在线爽爽爽视频| 国产51人人成人人人人爽色哟哟| 欧美 国产 小说 另类| 色综合久久久久久久久五月| 91精品视频专区| 欧美自拍大量在线观看| 国内精品中文字幕| 久久精品久久久久久| 精品国产一区二区三区在线观看 | 在线观看成人免费| 亚洲欧美一二三| 阿v天堂2018| 浓精h攵女乱爱av| 妞干网在线视频| 中文字幕日产av一二三区| 福利片在线免费观看| 校园春色 亚洲色图| a优女a优女片| 日本啊v在线| av片在线观看| 精品日本视频| 综合中文字幕| 精品久久影视| 久久裸体视频| 国产不卡视频一区| 91免费观看视频| 欧美日本韩国一区二区三区视频| 欧美精品 国产精品| 亚洲免费精彩视频| 久久精品视频播放| 成人在线国产精品| 麻豆av一区二区三区| 在线免费观看成人网| 激情 小说 亚洲 图片: 伦| 免费观看的av网站| 蜜桃av.网站在线观看| 少妇一区二区视频| 国产在线视频一区二区三区| 91精品免费在线| 亚洲qvod图片区电影| 欧美色18zzzzxxxxx| 成人羞羞视频播放网站| 久久国产毛片| 国内精品视频666| 欧美日韩国产影院| 免费不卡在线观看av| 99三级在线| 最近中文字幕mv第三季歌词 | 免费黄网在线观看| 亚洲精品一区二区在线播放∴| 国产精品久久久乱弄| 9i在线看片成人免费| 欧美色videos| 久久青草福利网站| 日韩国产高清一区| 青青草视频在线观看| 香蕉大人久久国产成人av| 夜夜爽av福利精品导航| 日韩一区在线看| 亚洲精品第一页| 国产日韩中文字幕| 少妇高潮毛片色欲ava片| 激情视频在线观看免费| 欧美成a人免费观看久久| 国产精品18久久久久久久久 | 欧美视频精品| 久久精品首页| 精品成人佐山爱一区二区| 国产精品嫩草在线观看| freemovies性欧美| 蜜桃av一区二区| 精品国产免费一区二区三区四区| 亚洲国产精品久久久久婷婷老年| yellow91字幕网在线| 精品国产一区探花在线观看| 99re成人精品视频| 欧美日韩一区二区三区在线看| 国产精品老牛影院在线观看| 国产免费专区| 欧州一区二区| 亚洲一区二区三区四区不卡| 午夜精品久久久久久99热软件 | 在线看小视频| 91精品秘密在线观看| 精品国产乱码久久久久酒店| 国产精品电影观看| 国产福利小视频在线| 亚洲欧美bt| 亚洲精品综合精品自拍| 99热都是精品| 日韩成人影音| 国产亚洲精品精华液| 欧美精品激情视频| 国产www在线观看| 中文字幕亚洲综合久久五月天色无吗'' | 国产精品国产a级| 欧美激情一区二区三区在线视频观看 | 加勒比日本影视| 麻豆一区一区三区四区| 欧美视频在线视频| 五月天综合婷婷| 国产精品巨作av| 欧美一级理论片| 国产黄色特级片| 日韩欧美中文字幕电影| 日韩免费电影一区| 爱草在线视频| 国产成人精品综合在线观看| 国产精品va在线播放我和闺蜜| 免费看成人av| 综合综合综合综合综合网| 91精品综合久久久久久| 免费高清一区二区三区| 五月天综合网站| 国产精品久久97| 欧美午夜精彩| 国语自产在线不卡| gogogo免费高清日本写真| 欧美电影院免费观看| 亚洲精品国产suv| 成人video亚洲精品| 欧美日韩一区免费| 2020中文字幕在线播放| 成人av电影免费在线播放| 欧美国产综合视频| 免费在线亚洲欧美| 日韩欧美精品中文字幕| 免费福利片在线观看| 中文字幕在线一区| 成年人视频在线| 亚洲国产高清在线| 污版网站在线观看| 一区二区三区日韩精品| 国产xxxxx视频| a级精品国产片在线观看| 中文字幕乱码免费| 久久综合狠狠| www.黄色网址.com| 成人国产视频在线观看| 国产精品久久久久9999小说| 国产日韩欧美电影| 手机看片1024久久| 欧美三级电影精品| 亚洲不卡系列| 国产欧美一区二区三区久久人妖| 日日欢夜夜爽一区| 乱一区二区三区在线播放| 国产美女久久久久| 两个人看的免费完整在线观看| 亚洲成人动漫在线播放| 久草在线免费福利资源| 亚洲欧美日韩精品久久久久| 亚洲人精品午夜射精日韩 | 天天综合色天天综合| 男男做性免费视频网| 亚洲综合无码一区二区| 成年人羞羞的网站| 亚洲激情男女视频| 国产视频一二区| 欧美性69xxxx肥| 麻豆视频在线观看免费网站| 精品福利一二区| 欧美va在线观看| 欧美激情亚洲一区| 欧美一性一交| 成人激情视频在线| 亚洲国产精品一区| 一区二区三区四区免费观看| 99久久精品费精品国产一区二区| 手机看片福利盒子久久| 亚洲一区欧美一区| 巨大荫蒂视频欧美大片| 色婷婷久久一区二区| 国产日韩欧美一区二区三区| 精品91免费| 国产成人精品一区二区三区四区 |