計算機網(wǎng)絡(luò)課程報告-發(fā)送TCP數(shù)據(jù)報_第1頁
計算機網(wǎng)絡(luò)課程報告-發(fā)送TCP數(shù)據(jù)報_第2頁
計算機網(wǎng)絡(luò)課程報告-發(fā)送TCP數(shù)據(jù)報_第3頁
計算機網(wǎng)絡(luò)課程報告-發(fā)送TCP數(shù)據(jù)報_第4頁
計算機網(wǎng)絡(luò)課程報告-發(fā)送TCP數(shù)據(jù)報_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機網(wǎng)絡(luò)課程設(shè)計報告題目:發(fā)送TCP數(shù)據(jù)報問題描述(把你所選的題目及要求說一下)TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的傳輸層協(xié)議。TCP協(xié)議在網(wǎng)絡(luò)層IP協(xié)議的基礎(chǔ)上,向應用層用戶進程提供可靠的、全雙工的數(shù)據(jù)傳輸流。本課程設(shè)計的目的就是設(shè)計一個發(fā)送TCP數(shù)據(jù)包的程序,并根據(jù)本設(shè)計說明TCP數(shù)據(jù)包的結(jié)構(gòu)以及TCP協(xié)議與IP協(xié)議的關(guān)系,使學生對TCP協(xié)議的工作原理有更深入的認識。運行環(huán)境:MicrosoftVisualC++6.0概要設(shè)計(抽象數(shù)據(jù)類型定義)本程序的功能是填充一個TCP數(shù)據(jù)包,并發(fā)送給目的主機。以命令行形式運行:SendTCPsourse_ipsourse_portdest_ipdest_port其中,SendTCP為程序名;sourse_ip為源端IP地址;sourse_port為源端口;dest_ip為目的IP地址;dest_port為目的端口。2)其它的TCP頭部參數(shù)請自行設(shè)定。3)數(shù)據(jù)字段為“Thisismyhomeworkofnetwork,Iamhappy!”。4)發(fā)送成功后在屏幕上輸出”sendOK”。5)程序流程圖如下: 詳細設(shè)計(主要算法和函數(shù)間的調(diào)用關(guān)系)本課程設(shè)計的目標是發(fā)送一個TCP資料包,可以利用原始套接字來完 成這個工作。整個程序由初始化原始套接字和發(fā)送TCP數(shù)據(jù)包兩個部分 組成。1)使用原始套接字SOCKETsock;sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);為使用發(fā)送接收超時設(shè)置,必須將標志位置位置為WSA_FLAG_OVERLAPPED。在本課程設(shè)計中,發(fā)送TCP包時隱藏了自己的IP地址,因此我們要自己填充IP頭,設(shè)置IP頭操作選項。其中flag設(shè)置為ture,并設(shè)定IP_HDRINCL選項,表明自己來構(gòu)造IP頭。2)超時設(shè)置BOOLFlag=TRUE;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&Flag,sizeof(Flag));Inttimeout=1000;setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));在這里我們使用基本套接字SOL_SOCKET,設(shè)置SO_SNDTIMEO表示使用發(fā)送超時設(shè)置,超時時間設(shè)置為1000ms。3)定義IP首部typedefstruct_iphdr{UCHARh_lenver;//4位首部長度+4位IP版本號 UCHARtos;//8位服務(wù)類型TOS USHORTtotal_len;//16位總長度(字節(jié)) USHORTident;//16位標識 USHORTfrag_and_flags;//3位標志位 UCHARttl;//8位生存時間TTL UCHARproto;//8位協(xié)議(TCP,UDP或其它)USHORTchecksum;//16位IP首部校驗和 ULONGsourceIP;//32位源IP地址ULONG destIP;//32位目的IP地址}IP_HEADER;}定義TCP偽首部 typedefstructpsd_hdr {ULONGsaddr;//源地址 daddr;//目的地址 UCHARmbz; UCHARptcl;//協(xié)議類型 USHORTtcpl;//TCP長度}PSD_HEADER;定義TCP首部typedefstruct_tcphdr{USHORTth_sport;//16位源端口號 USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列號ULONGth_ack;//32位確認號UCHARth_lenres;//4位首部長度/6位保留字UCHARth_flag;//6位標志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校驗和USHORTth_urp;//16位緊急數(shù)據(jù)偏移量}TCP_HEADER;計算校驗和的子函數(shù)在填充數(shù)據(jù)包的過程中,需要調(diào)用計算校驗和的函數(shù)checksum兩次,分別用于校驗IP頭和TCP頭部(加上偽頭部),其實現(xiàn)代碼如下:USHORTchecksum(USHORT*buffer,intsize){ unsignedlongcksum=0;while(size>1){ cksum+=*buffer++; size-=sizeof(USHORT);}if(size){ cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}調(diào)試分析(調(diào)式過程中出現(xiàn)的問題及如何改正)此圖為第一次運行時出現(xiàn)的錯誤。錯誤原因為:當時沒有輸入源ip地址和目的ip地址。改正:在vc的‘工程->設(shè)置’菜單欄中輸入源ip地址和目的ip地址,即可運行成功。心得體會(組內(nèi)成員的分工及實習期間的體會)成員分工張欣:代碼的編寫與修改,設(shè)計報告的數(shù)據(jù)流程圖的設(shè)計劉凱莉:代碼的調(diào)試與分析胡燕:設(shè)計報告的完成心得體會這次的課程設(shè)計讓我們學到了很多東西。最大的收獲是學會了TCP數(shù)據(jù)包的填充和發(fā)送。在對TCP數(shù)據(jù)包進行填充時,首先需要我們?nèi)コ浞至私馑臄?shù)據(jù)結(jié)構(gòu),在這個過程中可以了解相應字節(jié)上應該存放的內(nèi)容和它們的功能。在實現(xiàn)TCP數(shù)據(jù)包的發(fā)送中,第一次深深接觸了網(wǎng)絡(luò)編程接口socket套接字的相關(guān)知識,雖然本次的課程設(shè)計只用到了其中一小部分知識,但這并不會影響對這方面知識的全面了解??傊@次的課程設(shè)計,讓我們對網(wǎng)絡(luò)中的數(shù)據(jù)收發(fā)有了一定的了解,并激發(fā)了對計算機網(wǎng)絡(luò)的濃厚興趣。六、用戶手冊(系統(tǒng)的使用方法介紹)源代碼如下:#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é)議預定#defineMAX_BUFF_LEN65500//發(fā)送緩沖區(qū)最大值typedefstructip_hdr//定義IP首部{UCHARh_verlen;//4位首部長度,4位IP版本號UCHARtos;//8位服務(wù)類型TOSUSHORTtotal_len;//16位總長度(字節(jié))USHORTident;//16位標識USHORTfrag_and_flags;//3位標志位UCHARttl;//8位生存時間TTLUCHARproto;//8位協(xié)議(TCP,UDP或其它)USHORTchecksum;//16位IP首部校驗和ULONGsourceIP;//32位源IP地址ULONGdestIP;//32位目的IP地址}IP_HEADER;typedefstructtsd_hdr//定義TCP偽首部{ULONGsaddr;//源地址ULONGdaddr;//目的地址UCHARmbz;//沒用UCHARptcl;//協(xié)議類型USHORTtcpl;//TCP長度}PSD_HEADER;typedefstructtcp_hdr//定義TCP首部{USHORTth_sport;//16位源埠USHORTth_dport;//16位目的端口ULONGth_seq;//32位序列號ULONGth_ack;//32位確認號UCHARth_lenres;//4位首部長度/6位保留字UCHARth_flag;//6位標志位USHORTth_win;//16位窗口大小USHORTth_sum;//16位校驗和USHORTth_urp;//16位緊急數(shù)據(jù)偏移量}TCP_HEADER;//CheckSum:計算校驗和的子函數(shù)USHORTchecksum(USHORT*buffer,intsize){ unsignedlongcksum=0;while(size>1){ cksum+=*buffer++; size-=sizeof(USHORT);}if(size){ cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}intmain(intargc,char*argv[]){ WSADATAWSAData; 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; 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位標識 ipHeader.frag_and_flags=0;//3位標志位 ipHeader.ttl=128;//8位生存時間 ipHto=IPPROTO_UDP;//協(xié)議類型 ipHeader.checksum=0;//檢驗和暫時為0 ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址 ipHeader.destIP=inet_addr(argv[3]);//32位目的IP地址//計算IP頭部檢驗和 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位目的端口號 tcpHeader.th_sport=htons(atoi(argv[2]));//16位源埠號 tcpHeader.th_seq=0;//SYN序列號 tcpHeader.th_ack=0;//ACK序列號置為0//TCP長度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsignedlong)<<4|0); tcpHeader.th_flag=2;//修改這里來實現(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,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));

溫馨提示

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

評論

0/150

提交評論