計算機網(wǎng)絡(luò)課程設(shè)計-數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn)_第1頁
計算機網(wǎng)絡(luò)課程設(shè)計-數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn)_第2頁
計算機網(wǎng)絡(luò)課程設(shè)計-數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn)_第3頁
計算機網(wǎng)絡(luò)課程設(shè)計-數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn)_第4頁
計算機網(wǎng)絡(luò)課程設(shè)計-數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機網(wǎng)絡(luò)課程設(shè)計 題 目 數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn) 學 院 計算機學院 專 業(yè) 軟件工程 班 別 10級(4)班 學 號 3110006379 姓 名 陳泳鑫 2012年12月21日數(shù)據(jù)包發(fā)送和接受程序的實現(xiàn)一、設(shè)計題目與要求1.設(shè)計題目發(fā)送TCP數(shù)據(jù)包2.設(shè)計要求本設(shè)計的功能是填充一個TCP數(shù)據(jù)包,并發(fā)送給目的主機。1)以命令行形式運行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip為源端IP地址,source_port為源端口號,dest_ip為目的地址,dest_port為目的端口號。2)

2、其他的TCP頭部參數(shù)請自行設(shè)定。3)數(shù)據(jù)字段為“This is my homework of network,I am happy!”。4)成功發(fā)送后在屏幕上輸出“send OK”。三、詳細設(shè)計本課程設(shè)計的目標是發(fā)送一個TCP數(shù)據(jù)包,可以利用原始套接字來完成這個工作。整個程序由初始化原始套接字和發(fā)送TCP數(shù)據(jù)包兩個部分組成。當應用進程需要通過TCP發(fā)送時,它就將此應用層報文傳送給執(zhí)行TCP協(xié)議的傳輸實體。TCP傳輸實體將用戶數(shù)據(jù)加上TCP報頭,形成TCP數(shù)據(jù)包,在TCP數(shù)據(jù)包上增加IP頭部,形成IP包。如圖-1顯示的是TCP數(shù)據(jù)包和IP包得關(guān)系。TCP協(xié)議的數(shù)據(jù)傳輸單位稱為報文段,其格式如圖-

3、2所示。報文段報頭的長度是20B60B,選項部分長度最多為40B。TCP報文段主要包括以下字段。端口號:端口號字段包括源端口號和目的端口號。每個端口號的長度是16位,分別表示發(fā)送該TCP包的應用進程的端口號和接收該TCP包的應用進程的端口號。 IP報頭TCP報頭TCP數(shù)據(jù)IP數(shù)據(jù)圖-1 TCP數(shù)據(jù)包加上IP報頭形成IP包序號:長度為32位。由于TCP協(xié)議是面向數(shù)據(jù)流的,它所傳送的報文段可以視為連續(xù)的數(shù)據(jù)流,因此需要給每一字節(jié)編號。序號字段的“序號”指的是本報文段數(shù)據(jù)的第一個字節(jié)的序號。確認號:該字段的長度為32位,它表示接收端希望接收下一個TCP包的第一個字節(jié)的序號。報文長度:該字段長度為4位

4、。TCP報文長度是以4B為一個單元來計算的,實際上報文長度在20B60B之間。因此這個字段的值在515之間。TCP頭部數(shù)據(jù)源端口號目的端口號序號確認號報文長度 保留URGACKPSHRSTSYNFIN窗口大小校驗和緊急指針選項及填充圖-2 TCP數(shù)據(jù)包頭部的格式保留:長度為6位,留做今后使用,目前全部置0.控制:這個字段定義了6種不同的標志,每一個標志占一位,在同一時間可以設(shè)置一位或多位。URG位為1時,表明應盡快把數(shù)據(jù)傳送給應用程序,否則表明允許數(shù)據(jù)在緩存中存放一段時間。RST位為1時,表明要強制切斷連接。SYN位為1時,表明有確立連接的請求,這時,把序號字段的初始值作為序號字段的值,以便開

5、始通信。FIN位為1時,表明發(fā)送放已經(jīng)沒有數(shù)據(jù)發(fā)送了。窗口大?。洪L度為16位,指向必須緊急處理的數(shù)據(jù)的位置,因此最多能夠傳送的數(shù)據(jù)為65535B。緊急指針:該字段長度為16,指向必需緊急處理的位置,只有當標志URG=1時緊急指針才生效。從TCP報頭后面的報文數(shù)據(jù)開始,到緊急指針所指出長度的數(shù)據(jù),就是必須緊急處理的數(shù)據(jù)。選項: 該字段可以多達40B,包括單字節(jié)選項和多字節(jié)選項。校驗和:該字段長度為16位,校驗和的校驗范圍包括偽頭部,TCP報頭以及應用層來的數(shù)據(jù)。其計算方法與IP協(xié)議頭部校驗和的計算方法一樣。偽頭部為12B,它本身并不是TCP數(shù)據(jù)包的真頭部,只是在計算校驗和時,臨時和TCP數(shù)據(jù)包連

6、接在一起。偽頭部的格式如圖-3所示0 8 16 24 31源IP地址目的IP地址00000000協(xié)議號(6)TCP長度創(chuàng)建一個原始套接字,并設(shè)置IP頭選項SOCKET sock; 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。在本課程設(shè)計中,發(fā)送TC

7、P包時隱藏了自己的IP地址,因此我們要自己填充IP頭,設(shè)置IP頭操作選項。其中flag設(shè)置為ture,并設(shè)定 IP_HDRINCL 選項,表明自己來構(gòu)造IP頭。setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&Flag, sizeof(Flag);int timeout=1000;setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout);在這里我們使用基本套接字SOL_SOCKET,設(shè)置SO_SNDTIMEO表示使用發(fā)送超時設(shè)置,超時時間設(shè)置為1000ms。

8、構(gòu)造IP頭和TCP頭這里, IP頭和TCP頭以及TCP偽部的構(gòu)造請參考下面它們的數(shù)據(jù)結(jié)構(gòu)。typedef struct _iphdr /定義IP首部 UCHAR h_lenver; /4位首部長度+4位IP版本號 UCHAR tos; /8位服務類型TOS USHORT total_len; /16位總長度(字節(jié)) USHORT ident; /16位標識 USHORT frag_and_flags; /3位標志位 UCHAR ttl; /8位生存時間 TTL UCHAR proto; /8位協(xié)議 (TCP, UDP 或其他) USHORT checksum; /16位IP首部校驗和 ULON

9、G sourceIP; /32位源IP地址 ULONG destIP; /32位目的IP地址 IP_HEADER; typedef struct psd_hdr /定義TCP偽首部 ULONG saddr; /源地址 ULONG daddr; /目的地址 UCHAR mbz; /沒用UCHAR ptcl; /協(xié)議類型 USHORT tcpl; /TCP長度 PSD_HEADER; typedef struct _tcphdr /定義TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 ULONG th_seq; /32位序列號 ULO

10、NG th_ack; /32位確認號 UCHAR th_lenres; /4位首部長度/6位保留字 UCHAR th_flag; /6位標志位 USHORT th_win; /16位窗口大小 USHORT th_sum; /16位校驗和 USHORT th_urp; /16位緊急數(shù)據(jù)偏移量 TCP_HEADER; 3.計算校驗和的子函數(shù)在填充數(shù)據(jù)包的過程中,需要調(diào)用計算校驗和的函數(shù)checksum兩次,分別用于校驗IP頭和TCP頭部(加上偽頭部),其實現(xiàn)代碼如下:USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; w

11、hile(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0 xffff); cksum += (cksum 16); return (USHORT)(cksum);4.流程圖調(diào)試分析本程序流程簡單,調(diào)試過程中沒有出現(xiàn)大的問題。調(diào)試過程中沒有出現(xiàn)重大的語法錯誤,主要是運行的結(jié)果不理想,和預期的結(jié)果有差距。填充數(shù)據(jù)包的程序部分是不容易出錯的。至于數(shù)據(jù)包的發(fā)送,由于是利用函數(shù)sendto()來實現(xiàn)的,而sendto()是

12、面向UDP的,將協(xié)議類型修改為UDP(Hto=IPPROTO_UDP;)后,調(diào)試運行成功,問題得到解決。調(diào)試時,要添加#include #include #pragma comment(lib,ws2_32.lib)不然編譯出錯。使用說明輸入:sendtcp 23 100 24 200 ,然后回車,出現(xiàn)send ok!表示已經(jīng)正確發(fā)送。源代碼#include #include #include #include #include #include #include #include #pragma comment(lib,ws2_3

13、2.lib)#define IPVER 4 /IP協(xié)議預定#define MAX_BUFF_LEN 65500 /發(fā)送緩沖區(qū)最大值typedef struct ip_hdr /定義IP首部 UCHAR h_verlen; /4位首部長度,4位IP版本號 UCHAR tos; /8位服務類型TOS USHORT total_len; /16位總長度(字節(jié)) USHORT ident; /16位標識 USHORT frag_and_flags; /3位標志位 UCHAR ttl; /8位生存時間 TTL UCHAR proto; /8位協(xié)議 (TCP, UDP 或其他) USHORT checks

14、um; /16位IP首部校驗和 ULONG sourceIP; /32位源IP地址 ULONG destIP; /32位目的IP地址 IP_HEADER; typedef struct tsd_hdr /定義TCP偽首部 ULONG saddr; /源地址ULONG daddr; /目的地址 UCHAR mbz; /UCHAR ptcl; /協(xié)議類型 USHORT tcpl; /TCP長度 PSD_HEADER; typedef struct tcp_hdr /定義TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 ULONG th

15、_seq; /32位序列號 ULONG th_ack; /32位確認號 UCHAR th_lenres; /4位首部長度/6位保留字 UCHAR th_flag; /6位標志位 USHORT th_win; /16位窗口大小 USHORT th_sum; /16位校驗和 USHORT th_urp; /16位緊急數(shù)據(jù)偏移量 TCP_HEADER; /CheckSum:計算校驗和的子函數(shù) USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=si

16、zeof(USHORT); if(size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0 xffff); cksum += (cksum 16); return (USHORT)(cksum); int main(int argc, char* argv) WSADATA WSAData; SOCKET sock; IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader; char Sendto_BuffMAX_BUFF_LEN; /發(fā)送緩沖區(qū) unsi

17、gned short check_BuffMAX_BUFF_LEN; /檢驗和緩沖區(qū) const char tcp_send_data=This is my homework of networt,I am happy!; BOOL flag; int rect,nTimeOver; if (argc!= 5) printf(Useage: sendtcp soruce_ip source_port dest_ip dest_port n); return false; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) printf(WSAStartup

18、Error!n); return false; if(sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED)=INVALID_SOCKET) printf(Socket Setup Error!n); return false; flag=true; /設(shè)置選項值 IP_HDRINCL為要設(shè)置的選項值 if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)=SOCKET_ERROR) printf(setsockopt IP_HD

19、RINCL error!n); return false; nTimeOver=1000; /設(shè)置選項值 SO_SNDTIMEO為要設(shè)置的選項值 if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver)=SOCKET_ERROR) printf(setsockopt SO_SNDTIMEO error!n); return false; /填充IP首部 ipHeader.h_verlen=(IPVER4 | sizeof(ipHeader)/sizeof(unsigned long);

20、ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons(unsigned short)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(ar

21、gv1); /32位源IP地址 ipHeader.destIP=inet_addr(argv3); /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.m

22、bz=0; psdHeader.ptcl=ipHto; psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data); /填充TCP首部 tcpHeader.th_dport=htons(atoi(argv4); /16位目的端口號 tcpHeader.th_sport=htons(atoi(argv2); /16位源端口號 tcpHeader.th_seq=0; /SYN序列號 tcpHeader.th_ack=0; /ACK序列號置為0 /TCP長度和保留位 tcpHeader.th_lenres=(sizeo

23、f(tcpHeader)/sizeof(unsigned long)4|0); tcpHeader.th_flag=2; /修改這里來實現(xiàn)不同的標志位探測,2是SYN,1是/FIN,16是ACK探測 等等 tcpHeader.th_win=htons(unsigned short)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=ch

溫馨提示

  • 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

提交評論