計算機網(wǎng)絡(luò)課程設(shè)計源代碼和實驗報告幀封裝IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第1頁
計算機網(wǎng)絡(luò)課程設(shè)計源代碼和實驗報告幀封裝IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第2頁
計算機網(wǎng)絡(luò)課程設(shè)計源代碼和實驗報告幀封裝IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第3頁
計算機網(wǎng)絡(luò)課程設(shè)計源代碼和實驗報告幀封裝IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第4頁
計算機網(wǎng)絡(luò)課程設(shè)計源代碼和實驗報告幀封裝IP數(shù)據(jù)包解析和發(fā)送TCP數(shù)據(jù)包_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

a計算機網(wǎng)絡(luò)課程設(shè)計報告計算機學(xué)院術(shù)計算機學(xué)院術(shù)業(yè):2009年7月4日aaa實驗一幀封裝.編寫程序,根據(jù)給出的原始數(shù)據(jù),組裝一個IEEE802.3格式的幀(題目)默認的輸入文件為二進制原始數(shù)據(jù)(文件名分別為input1和input2))。.編寫程序,根據(jù)給出的原始數(shù)據(jù),組裝一個IEEE802.3格式的幀(題目)默認的輸入文件為二進制原始數(shù)據(jù)(文件名分別為input1和input2))。aaaainputinputoutput和output2按802.3標準的幀結(jié)構(gòu)如下表所示(802.3標準的Ethernet幀結(jié)構(gòu)由7標準的幀結(jié)構(gòu)1B(2/6B)(2/6B)7B其中,幀數(shù)據(jù)字段的最小長度為46B。如果幀的LLC數(shù)據(jù)少于46B,則應(yīng)在校驗字段中,使用的是CRC校驗。校驗的范圍包括目的地址字段、源地檢錯和糾錯能力強等特點,在通信領(lǐng)域廣泛地用于實現(xiàn)差錯控制。CRC校驗碼的檢錯能力很強,不僅能檢查出離散錯誤,還能檢查出突發(fā)錯誤。根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進行檢驗,以確定傳送中是否出錯。這CRC的基本實現(xiàn)a1B驗字段(2/6B)(2/6B)段7B校驗碼可檢測出所有奇數(shù)位錯誤。(3)CRC校驗碼可檢測出所有雙位的錯誤(4)kK誤?CRC校驗aaaCRC計算流程圖:aaaa#include<iostream.h>#include<fstream.h>#include<stdlib.h>{//如果輸入命令行不正確,則輸出提示后退出。{}//打開指定的輸出文件,以二進制方式打開并可讀可寫,如文件存在,則清除其內(nèi)容。chardes_add[]={char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),char(0xDC)};charsor_add[]={char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),char(0x65)};a//創(chuàng)建輸入文件流并打開指定的輸入文件,以二進制方式打開并可讀。unsignedchar*data=newunsignedchar[length];//創(chuàng)建字符指針并根據(jù)文件長度初a//如果輸入文件長度不足B,則用補足B。{}aunsignedcharch;//ch用來保存讀入的字符。unsignedcharcrc=char(0x00);//余數(shù)初始值為。while(1)//進行CRC計算{ifchxff。break;{if(0x80==(crc&(0x80)))//當前余數(shù)最高位為,需要進行除法運算。{crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)的值遞補到余數(shù)末位。crc=crc^(0x07);//進行除法運算,即與除數(shù)的低位相異或。}else//當前余數(shù)的最高位為,不需要進行除法運算。{crc=crc|((ch&0x80)>>7);//將輸入數(shù)據(jù)相應(yīng)位的值遞補到余數(shù)末位。}aach=ch<<1;//讀到的字符左移位,使數(shù)據(jù)下一位作為輸入位。}}cout<<endl<<"數(shù)據(jù)幀文件"<<argv[2]<<"封裝完成"<<endl;}a實驗二解析IP數(shù)據(jù)包aa大長度是65535B;標識占16bit,它是一個計數(shù)器,用來產(chǎn)生數(shù)據(jù)報的標識;標志占3bit,其中最低為為MF,MF=1時為后面“還有分片”,MF=0表示這單位;生存時間字段記為TTL,單位為秒;協(xié)議段占8bit,用于指出次數(shù)據(jù)是使用何種協(xié)議,典型的協(xié)議號有6:TCP,17:UDP,1:ICMP。解析IP包aSOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用來創(chuàng)建套接字,其參數(shù)為通信發(fā)生的區(qū)字段和套接字的類型。WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen)函typedefstructIP_HEAD{setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)函數(shù)用來獲取本機IP地址本程序在windows環(huán)境下利用C++語言編寫。開始構(gòu)造程序運行環(huán)境,生成輸出文件a創(chuàng)造原始套接字,并初始化捕獲IP包Naa#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#include<fstream>#include<windows.h>#pragmacomment(lib,"ws2_32")//指定連接到網(wǎng)絡(luò)應(yīng)用和internet#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)typedefstructIP_HEAD{union//定義聯(lián)合{unsignedcharVersion;aunsignedcharHeadLen;unsignedcharServiceType;unsignedshortTotalLen;union{unsignedshortFlags;unsignedshortFragOffset;unsignedcharTimeToLive;unsignedcharProtocol;unsignedshortHeadChecksum;unsignedintSourceAddr;unsignedintDestinAddr;unsignedcharOptions;{usingnamespacestd;a{cout<<endl<<"請以下格式輸入命令行:PackParsepacket_sum"<<endl;}WSADATAWSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){cout<<endl<<"WSASTartup初始化失敗"<<endl;}SOCKETsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//三個參分別為通信發(fā)生if(sock==INVALID_SOCKET){cout<<endl<<"創(chuàng)建Socket失敗!"<<endl;WSACleanup();}BOOLflag=TRUE;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char&flag,sizeof(flag))==SOCKET_ERROR){acout<<endl<<"setsockopt操作失敗:"<<WSAGetLastError()<<endl;WSACleanup();}charhostName[128];//獲取主機名if(gethostname(hostName,100)==SOCKET_ERROR){cout<<endl<<"gethostname操作失敗:"<<WSAGetLastError()<<endl;WSACleanup();}hostent*pHostIP;//獲取本地IPif((pHostIP=gethostbyname(hostName))==NULL){cout<<endl<<"gethostbyname操作失敗:"<<WSAGetLastError()<<endl;WSACleanup();}sockaddr_inhost_addr;//host_addr.sin_family=AF_INET;host_addr.sin_port=htons(6000);ahost_addr.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr))==SOCKET_ERROR){cout<<endl<<"bind操作失敗:"<<WSAGetLastError()<<endl;WSACleanup();}DWORDdwBufferLen[10];DWORDdwBufferInLen=1;DWORDdwBytesReturned=0;if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR){cout<<endl<<"WSAIoctl操作失敗:"<<WSAGetLastError()<<endl;closesocket(sock);//將網(wǎng)卡設(shè)為混雜模式,以接受所有數(shù)據(jù)WSACleanup();}cout<<endl<<"開始解析IP包:"<<endl;charbuffer[65535];//設(shè)置緩沖區(qū)intpacksum=atoi(argv[1]);//字符串轉(zhuǎn)換為整形a{if(recv(sock,buffer,65535,0)>0)//四個參數(shù)分別是套接字描述符,緩沖區(qū)的地址,緩沖區(qū)大小,附加標志{cout<<"版本:"<<(ip.Version>>4)<<endl;//獲取頭部長度字段cout<<"頭部長度:"<<((ip.HeadLen&0x0f)*4)<<endl;//獲取頭部長度字段cout<服務(wù)類型:Priority"<<(ip.ServiceType>>5)<<",Service"<<((ip.ServiceType>>1)&0x0f)<<endl;//優(yōu)先級子域和TOS子域cout<<"總長度:"<<ip.TotalLen<<endl;//獲取總長度字段coutipIdentifier<endl;//獲取標識字段cout<<"標志位:"<<((ip.Flags>>15)&0x01)<<",DF="<<((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl;//獲得標志字段cout<<"片偏移:"<<(ip.FragOffset&0x1fff)<<endl;//獲取分段偏移字段cout<<"生存周期:"<<(int)ip.TimeToLive<<endl;//獲取生存時間字段cout<<"頭部校驗和:"<<ip.HeadChecksum<<endl;//獲取頭校驗和字段cout<<"原地址:"<<inet_ntoa(*(in_addr*)&ip.SourceAddr)<<endl;//獲取源IP地址字段地址字段aoutfile<<"頭部長度:"<<((ip.HeadLen&0x0f)*4)<<endl;outfile<<"服務(wù)類型:Priority"<<(ip.ServiceType>>5)<<",Service"<<((ip.ServiceType>>1)&0x0f)<<endl;endloutfile<<"標志位:"<<((ip.Flags>>15)&0x01)<<",DF="<<((ip.Flags>>14)&0x01)<<",Mf="<<((ip.Flags>>13)&0x01)<<endl;outfile<<"頭部校驗和:"<<ip.HeadChecksum<<endl;outfile<<"原地址:"<<inet_ntoa(*(in_addr*)&ip.SourceAddr)<<endl;}}WSACleanup();}aaaaaa實驗三發(fā)送TCP數(shù)據(jù)包P..以命令行形式運行:SendTCPsource_ipsource_portdest_ipport.數(shù)據(jù)字段為“Thisismyhomeworkofnetwork!”..成功發(fā)送后在屏幕上輸出“sendOK”。aaaa本課程設(shè)計的目標是發(fā)送一個TCP數(shù)據(jù)包,可以利用原始套接字來完成這SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);設(shè)置SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。為使用發(fā)送接收超時設(shè)置,必須將標志位置位置為WSA_FLAG_OVERLAPPED。表明自己來構(gòu)造IP頭。注意,如果設(shè)置IP_HDRINCL選項,那么必須具有administrator權(quán)限,要不就必須修改注冊表:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\修改鍵:DisableRawSecurity(類型為DWORD),把值修改為1。如果沒有,BOOLFlag=TRUE;ainttimeout=1000;setsockopt(sock,aSOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,在這里我們使用基本套接字SOL_SOCKET,設(shè)置SO_SNDTIMEO表示使用發(fā)送超時設(shè)置,超時時間設(shè)置為a1000ms。和TCP頭部(加上偽頭部),其實現(xiàn)代碼如下:USHORTchecksum(USHORT*buffer,intsize){unsignedlongcksum=0;{cksum+=*buffer++;sizesizeofUSHORT);}{cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}開始構(gòu)造原始套接字,并初始化a填充IP頭部aa#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>#include<time.h>#include<windows.h>#include<string.h>#include<stdlib.h>#include<iostream.h>#pragmacomment(lib,"ws2_32.lib")#defineIPVER4//IP協(xié)議預(yù)定#defineMAX_BUFF_LEN65500//發(fā)送緩沖區(qū)最大值a{UCHARh_verlen;UCHARtos;USHORTtotal_len;USHORTident;USHORTfrag_and_flags;UCHARttl;UCHARproto;USHORTchecksum;ULONGsourceIP;ULONGdestIP;}IP_HEADER;//8位服務(wù)類型TOS//16位總長度(字節(jié))//16位標識//3位標志位//8位生存時間TTL//8位協(xié)議(TCP,UDP或其他)typedefstructtsd_hdr//定義TCP偽首部{ULONGsaddr;ULONGdaddr;UCHARmbz;UCHARptcl;USHORTtcpl;}PSD_HEADER;//源地址//目的地址//沒用//協(xié)議類型//TCP長度typedefstructtcp_hdr//定義TCP首部{USHORTth_sport;USHORTth_dport;ULONGth_seq;//16位源端口//16位目的端口//32位序列號aULONGth_ack;UCHARth_lenres;UCHARth_flag;USHORTth_win;USHORTth_sum;USHORTth_urp;}TCP_HEADER;//32位確認號//4位首部長度/6位保留字//6位標志位//16位窗口大小//16位校驗和//16位緊急數(shù)據(jù)偏移量//CheckSum:計算校驗和的子函數(shù)USHORTchecksum(USHORT*buffer,intsize){unsignedlongcksum=0;{cksum+=*buffer++;size-=sizeof(USHORT);}{cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}{aWSADATAWSAData;SOCKETsock;IP_HEADERipHeader;TCP_HEADERtcpHeader;PSD_HEADERpsdHeader;charSendto_Buff[MAX_BUFF_LEN];//發(fā)送緩沖區(qū)unsignedshortcheck_Buff[MAX_BUFF_LEN];//檢驗和緩沖區(qū)constchartcp_send_data[]={"Thisismyhomeworkofnetwort,Iamhappy!"};BOOLflag;intrect,nTimeOver;{printf("Useage:SendTcpsoruce_ipsource_portdest_ipdest_port\n");}if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){printf("WSAStartupError!\n");}if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET){a}if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR){printf("setsockoptIP_HDRINCLerror!\n");}nTimeOver=1000;if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver))==SOCKET_ERROR){printf("setsockoptSO_SNDTIMEOerror!\n");}ipHeader.h_verlen=(IPVER<<4|sizeof(ipHeader)/sizeof(unsignedlong));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsignedipHeader.ident=0;//16位標識ipHeader.frag_and_flags=0;//3位標志位ipHeader.ttl=128;//8位生存時間ipHto=IPPROTO_UDP;//協(xié)議類型ipHeader.checksum=0;//檢驗和暫時為0dersourceIPinetaddrargvIPamemset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER));ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER));//構(gòu)造TCP偽首部psdHeader.saddr=ipHeader.sourceIP;psdHeader.daddr=ipHeader.destIP;psdHeader.mbz=0;psdHeader.ptcl=ipHto;psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data));//填充TCP首部tcpHeaderthdporthtonsatoiargv位目的端口號tcpHeader.th_seq=0;tcpHeader.th_ack=0;//TCP長度和保留位//SYN序列號//ACK序列號置為0tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsignedlong)<<4|0);tcpHeaderthflag這里來實現(xiàn)不同的標志位探測,2是SYN,1是//FIN,16是ACK探測等等tcpHeader.th_win=htons((unsignedshort)16384);//窗口大小tcpHeader.th_urp=0;tcpHeader.th_sum=0;//偏移大小//檢驗和暫時填為0//計算TCP校驗和memset(check_Buff,0,M

溫馨提示

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

評論

0/150

提交評論