發(fā)送TCP數(shù)據(jù)包設(shè)計(jì)報(bào)告_第1頁(yè)
發(fā)送TCP數(shù)據(jù)包設(shè)計(jì)報(bào)告_第2頁(yè)
發(fā)送TCP數(shù)據(jù)包設(shè)計(jì)報(bào)告_第3頁(yè)
發(fā)送TCP數(shù)據(jù)包設(shè)計(jì)報(bào)告_第4頁(yè)
發(fā)送TCP數(shù)據(jù)包設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告

發(fā)送TCP數(shù)據(jù)包問題描述經(jīng)過我們的慎重思考和搜集各個(gè)問題的資料及與其他同學(xué)的交流,我們所選的問題是發(fā)送TCP數(shù)據(jù)包。眾所周知,TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的傳輸層協(xié)議。TCP協(xié)議在網(wǎng)絡(luò)層IP協(xié)議的基礎(chǔ)上,向應(yīng)用層用戶進(jìn)程提供可靠的、全雙工的數(shù)據(jù)傳輸流。本課程設(shè)計(jì)的目的就是設(shè)計(jì)一個(gè)發(fā)送TCP數(shù)據(jù)包的程序,并根據(jù)本設(shè)計(jì)說明TCP數(shù)據(jù)包的結(jié)構(gòu)以及TCP協(xié)議與IP協(xié)議的關(guān)系,使大家對(duì)TCP協(xié)議的工作原理有更深入的認(rèn)識(shí)。概要設(shè)計(jì)(抽象數(shù)據(jù)類型定義)typedefstructip_hdr//定義IP首部{UCHARh_verlen;//4位首部長(zhǎng)度,4位IP版本號(hào)UCHARtos;//8位服務(wù)類型TOSUSHORTtotal_len;//16位總長(zhǎng)度(字節(jié))USHORTident;//16位標(biāo)識(shí)USHORTfrag_and_flags;//3位標(biāo)志位UCHARttl;//8位生存時(shí)間TTLUCHARproto;//8位協(xié)議(TCP,UDP或其它)USHORTchecksum;//16位IP首部校驗(yàn)和ULONGsourceIP;//32位源IP地址ULONGdestIP;//32位目的IP地址}IP_HEADER;typedefstructtsd_hdr//定義TCP偽首部{ULONGsaddr;//源地址ULONGdaddr;//目的地址UCHARmbz;//沒用UCHARptcl;//協(xié)議類型USHORTtcpl;//TCP長(zhǎng)度}PSD_HEADER;typedefstructtcp_hdr//定義TCP首部{USHORTth_sport;//16位源埠USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列號(hào)ULONGth_ack;//32位確認(rèn)號(hào)UCHARth_lenres;//4位首部長(zhǎng)度/6位保留字UCHARth_flag;//6位標(biāo)志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校驗(yàn)和USHORTth_urp;//16位緊急數(shù)據(jù)偏移量}TCP_HEADER;詳細(xì)設(shè)計(jì)(主要算法和函數(shù)間的調(diào)用關(guān)系)3.1使用原始套接字SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者用下面的定義寫:sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPD);這里,我們?cè)O(shè)置了SOCK_RAW標(biāo)志,表示我們聲明的是一個(gè)原始套接字類型。為使用發(fā)送接收超時(shí)設(shè)置,必須將標(biāo)志位置置為WSA_FLAG_OVERLAPPED。在本課程設(shè)計(jì)中,發(fā)送TCP包時(shí)隱藏了自己的IP地址,因此我們要自己填充IP頭,設(shè)置IP頭操作選項(xiàng)。3.2計(jì)算校驗(yàn)和的子函數(shù)。在填充數(shù)據(jù)包的過程中,需要調(diào)用計(jì)算校驗(yàn)和的函數(shù)checksum兩次,分別用于校驗(yàn)IP頭和TCP頭部(加上偽頭部),其實(shí)現(xiàn)代碼如下:USHORTchecksum(USHORT*buffer,intsize){unsignedlongcksum=0;//累加和初始值while(size>1)//多少個(gè)USHORT型數(shù)據(jù){cksum+=*buffer++;//算計(jì)累加和size-=sizeof(USHORT);//個(gè)數(shù)-1}if(size)//如果有非對(duì)齊的下余數(shù)據(jù){cksum+=*(UCHAR*)buffer;//+余下的數(shù)值}cksum=(cksum>>16)+(cksum&0xffff);//右移16位,得到前16位,再加上cksum&0xffff,0xffff就是全是1,就是cksum等于cksum加上他的前16位。cksum+=(cksum>>16);//然后cksum等于cksum加上cksum的前16位。return(USHORT)(~cksum);

//返回它的反(USHORT型)}3.3程序流程圖源代碼#include<stdio.h>#include<winsock2.h>//套接字頭文件#include<ws2tcpip.h>//設(shè)置或獲取,鏈接套接字#include<time.h>#include<windows.h>//重要的頭文件,包含基本數(shù)據(jù)類型定義,圖形設(shè)備接口函數(shù)等#include<string.h>#include<stdlib.h>#include<iostream.h>#pragmacomment(lib,"ws2_32.lib")#defineIPVER4//IP協(xié)議預(yù)定#defineMAX_BUFF_LEN65500//發(fā)送緩沖區(qū)最大值typedefstructip_hdr//定義IP首部{UCHARh_verlen;//4位首部長(zhǎng)度,4位IP版本號(hào)UCHARtos;//8位服務(wù)類型TOSUSHORTtotal_len;//16位總長(zhǎng)度(字節(jié))USHORTident;//16位標(biāo)識(shí)USHORTfrag_and_flags;//3位標(biāo)志位UCHARttl;//8位生存時(shí)間TTLUCHARproto;//8位協(xié)議(TCP,UDP或其它)USHORTchecksum;//16位IP首部校驗(yàn)和ULONGsourceIP;//32位源IP地址ULONGdestIP;//32位目的IP地址}IP_HEADER;typedefstructtsd_hdr//定義TCP偽首部{ULONGsaddr;//源地址ULONGdaddr;//目的地址UCHARmbz;//沒用UCHARptcl;//協(xié)議類型USHORTtcpl;//TCP長(zhǎng)度}PSD_HEADER;typedefstructtcp_hdr//定義TCP首部{USHORTth_sport;//16位源端口USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列號(hào)ULONGth_ack;//32位確認(rèn)號(hào)UCHARth_lenres;//4位首部長(zhǎng)度/6位保留字UCHARth_flag;//6位標(biāo)志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校驗(yàn)和USHORTth_urp;//16位緊急數(shù)據(jù)偏移量}TCP_HEADER;//CheckSum:計(jì)算校驗(yàn)和的子函數(shù)USHORTchecksum(USHORT*buffer,intsize){unsignedlongcksum=0;//累加和初始值while(size>1)//多少個(gè)USHORT型數(shù)據(jù){cksum+=*buffer++;//計(jì)算累加和size-=sizeof(USHORT);//個(gè)數(shù)-1}if(size)//余下的數(shù)據(jù){cksum+=*(UCHAR*)buffer;//+余下的數(shù)值}cksum=(cksum>>16)+(cksum&0xffff);//右移16位,得到前16位,再加上cksum&0xffff,0xffff就是全是1,就是cksum等于cksum加上他的前16位。cksum+=(cksum>>16);//然后cksum等于cksum加上cksum的前16位。return(USHORT)(~cksum);

//返回它的反(USHORT型)}intmain(intargc,char*argv[]){WSADATAWSAData;SOCKETsock;IP_HEADERipHeader;TCP_HEADERtcpHeader;PSD_HEADERpsdHeader;charSendto_Buff[MAX_BUFF_LEN];//發(fā)送緩沖區(qū)unsignedshortcheck_Buff[MAX_BUFF_LEN];//檢驗(yàn)緩沖區(qū)constchartcp_send_data[]={"Thisismyhomeworkofnetwort,Iamhappy!"};BOOLflag;intrect,nTimeOver;if(argc!=5){printf("Useage:SendTcpsoruce_ipsource_portdest_ipdest_port\n");returnfalse;}if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){printf("WSAStartupError!\n");returnfalse;}if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET){printf("SocketSetupError!\n");returnfalse;}flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR){printf("setsockoptIP_HDRINCLerror!\n");returnfalse;}nTimeOver=1000;if(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nTimeOver,sizeof(nTimeOver))==SOCKET_ERROR){printf("setsockoptSO_SNDTIMEOerror!\n");returnfalse;}//填充IP首部ipHeader.h_verlen=(IPVER<<4|sizeof(ipHeader)/sizeof(unsignedlong));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsignedshort)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data));ipHeader.ident=0;//16位標(biāo)識(shí)ipHeader.frag_and_flags=0;//3位標(biāo)志位ipHeader.ttl=128;//8位生存時(shí)間ipHto=IPPROTO_UDP;//協(xié)議類型ipHeader.checksum=0;//檢驗(yàn)和暫時(shí)為0ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址ipHeader.destIP=inet_addr(argv[3]);//32位目的IP地址//計(jì)算IP頭部檢驗(yàn)和memset(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首部tcpHeader.th_dport=htons(atoi(argv[4]));//16位目的端口號(hào)tcpHeader.th_sport=htons(atoi(argv[2]));//16位源埠號(hào)tcpHeader.th_seq=0;//SYN序列號(hào)tcpHeader.th_ack=0;//ACK序列號(hào)置為0//TCP長(zhǎng)度和保留位tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsignedlong)<<4|0);tcpHeader.th_flag=2;//修改這里來實(shí)現(xiàn)不同的標(biāo)志位探測(cè),2是SYN,1是FIN,16是ACK探測(cè)等等tcpHeader.th_win=htons((unsignedshort)16384);//窗口大小tcpHeader.th_urp=0;//偏移大小tcpHeader.th_sum=0;//檢驗(yàn)和暫時(shí)填為0//計(jì)算TCP校驗(yàn)和memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&psdHeader,sizeof(psdHeader));memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader));memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER),tcp_send_data,sizeof(tcp_send_data));tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_data));//填充發(fā)送緩沖區(qū)memset(Sendto_Buff,0,MAX_BUFF_LEN);memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER));memcpy(Sendto_Buff+sizeof(IP_HEADER),&tcpHeader,sizeof(TCP_HEADER));memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER),tcp_send_data,sizeof(tcp_send_data));intdatasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_data);//發(fā)送數(shù)據(jù)報(bào)的目的地址SOCKADDR_INdest;memset(&dest,0,sizeof(dest));dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(argv[3]);dest.sin_port=htons(atoi(argv[4]));rect=sendto(sock,Sendto_Buff,datasize,0,(structsockaddr*)&dest,sizeof(dest));if(rect==SOCKET_ERROR){printf("senderror!:%d\n",WSAGetLastError());returnfalse;}elseprintf("Sentsuccessfully!\n");closesocket(sock);WSACleanup();return1;}調(diào)試分析(調(diào)試過程中出現(xiàn)的問題及如何改正)第一、二天,主要是定課題,查閱資料,學(xué)習(xí)算法。該期間重點(diǎn)了解了IP首部、TCP首部的結(jié)構(gòu),以及如何將它們和數(shù)據(jù)字段一起封裝成數(shù)據(jù)包。同時(shí)也掌握了計(jì)算校驗(yàn)和的算法,從而通過該算法分別計(jì)算出IP首部和TCP首部的校驗(yàn)和。接著就是對(duì)網(wǎng)絡(luò)編程接口socket套接字的學(xué)習(xí),掌握它的初始化。還對(duì)一些

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論