版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、發(fā)送TCP數(shù)據(jù)包設(shè)計說明書課程設(shè)計準備1.1 課程設(shè)計目的TCP (傳輸控制協(xié)議)是一種面向連接的、可靠的傳輸層協(xié)議。 TCP 協(xié)議 在網(wǎng)絡(luò)層 IP 協(xié)議的基礎(chǔ)上,向應(yīng)用層用戶進程提供可靠的、全雙工的數(shù)據(jù) 傳輸流。本課程設(shè)計的目的就是設(shè)計一個發(fā)送 TCP數(shù)據(jù)包的程序,并根據(jù)本 設(shè)計說明TCP數(shù)據(jù)包的結(jié)構(gòu)以及 TCP協(xié)議與IP協(xié)議的關(guān)系,使學(xué)生對 TCP 協(xié)議的工作原理有更深入的認識。1.2 課程設(shè)計的要求本程序的功能是填充一個 TCP數(shù)據(jù)包,并發(fā)送給目的主機。1) 以 命 令 行 形 式 運 行 : SendTCP sourse_ip sourse_port dest_ip dest_port
2、其中,SendTCP為程序名;sourse_ip 為源端IP地址;sourse_port 為源 埠; dest_ip 為目的 IP 地址; dest_port 為目的埠。2) 其它的TCP頭部參數(shù)請自行設(shè)定。3) 數(shù)據(jù)字段為“ This is my homework of network,I am happy!”。4) 發(fā)送成功后在屏幕上輸出” send OK”。1.3相關(guān)知識編制本程序前要對 TCP協(xié)議有一定的了解。當(dāng)應(yīng)用程序有報文需要通過TCP發(fā)送時,它就將此應(yīng)用層報文傳送給執(zhí)行TCP協(xié)議的傳輸實體。TCP傳輸實體將用戶數(shù)據(jù)加上 TCP報頭,形成TCP數(shù)據(jù)包,在TCP數(shù)據(jù)包上增加 IP頭部
3、,形成IP包。下圖顯示的是 TCP數(shù)據(jù)包和IP包的關(guān)系。1TCP報頭TCP數(shù)據(jù)r1IP報頭IP數(shù)據(jù)TCP協(xié)議的傳輸單元為報文段,其格式如圖所示。報文段報頭的長度為 20B60B其中固定長度為 20B,報文段長度最多為 40B。TCP報文段主要包 括以下字段。埠號:埠號字段包括源埠號和目的埠號。每個埠號的長度是16位,分別表示發(fā)送該 TCP包的應(yīng)用進程的埠號和接收該 TCP包的應(yīng)用進程的埠號。序號:長度為 32位。由于TCP協(xié)議是面向數(shù)據(jù)流的,它所傳送的報文 段可以視為連續(xù)的數(shù)據(jù)流,因此需要給每一個字節(jié)編號。序號字段的“序號” 指的是本報文段數(shù)據(jù)的第一個字節(jié)的順序號。TCP頭部數(shù)據(jù)源端口號目的端
4、口號序號確認號報 頭 長 度保 留URGACKPSHRSTSYNFIN窗口大小校驗和緊急指針選項及填充確認號:該字段的長度為32位,它表示接收端希望接收的下一個TCP包的第一個字節(jié)的序號。報頭長度:該字段長度為4位。TCP報頭長度是以4B為一個單元來計算的,實際上報頭長度在 20B60B子間。因此這個字段的值在515之間。保留:長度為 6位,留作今后使用,目前全部置0??刂疲哼@個字段定義了 6種不同的標志,每個標志占一位,在同一時間可以設(shè)置一位或多位。URG為1時,表明有需要緊急處理的數(shù)據(jù)。ACK為1時,表明確認號的字段有效。PST位為1時,表明要強制切斷連接。SYN位為1時,表明有確立連接的
5、請求, 這時,把序號字段的初始值作為序號字段 的值,以便開始通信。FIN為1時,表明發(fā)送方已經(jīng)沒有資料發(fā)送了。窗口大?。洪L度為 16位,窗口對應(yīng)的數(shù)據(jù)是以字節(jié)為單位的數(shù)據(jù),因 此最多能夠傳送的數(shù)據(jù)為 65535B。緊急指針:該字段的長度為16位,指向必須緊急處理的數(shù)據(jù)的位置,只有當(dāng)標志URG=1時緊急指針才有效。從TCP報頭后面的報文資料開始,到 緊急指針所指出的長度的數(shù)據(jù),就是必須緊急處理的數(shù)據(jù)。選項:該字段可以多達 40B,包括單字節(jié)選項和多字節(jié)選項。校驗和:該字段長度多達16位,校驗和的校驗范圍包括偽頭部、TCP報頭以及應(yīng)用層來的數(shù)據(jù)。其計算方法與IP協(xié)議頭部的校驗的計算方法一樣。偽頭部
6、為12B,它本身并不是TCP數(shù)據(jù)包的真正頭部,只是在計算校驗 和時,臨時和TCP數(shù)據(jù)包連接在一起。偽頭部的格式如下圖所示。源IP地址目的IP地址00000000協(xié)議號(6)TCP長度1.4工作環(huán)境;硬件:PC機一臺。軟件:Microsoft Visual C+ 6.0二 課程設(shè)計分析本課程設(shè)計的目標是發(fā)送一個TCP資料包,可以利用原始套接字來完成這個工作。整個程序由初始化原始套接字和發(fā)送TCP數(shù)據(jù)包兩個部分組成。2.1 使用原始套接字SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_IN
7、ET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERL APPED);這里,我們設(shè)置了 SOCK_RAW志,表示我們聲明的是一個原始套接字類型。為使用發(fā)送接收超時設(shè)置,必須將標志位置位置為WSA_FLAG_OVERLAPPED在本課程設(shè)計中,發(fā)送 TCP包時隱藏了自己的IP地址,因此我們要自己填 充 IP 頭,設(shè)置 IP 頭操作選項。 其中 flag 設(shè)置為 ture ,并設(shè)定 IP_HDRINCL 選項,表明自己來構(gòu)造 IP 頭。注意,如果設(shè)置 IP_HDRINCL 選項,那么必 須具有 administrator 權(quán)限,要不就必須修改注冊表:HKEY_LO
8、CAL_MACHINESystemCurrentControlSetServicesAfdParamete r修改鍵:DisableRawSecurity(類型為DWORD把值修改為1。如果沒有,就添加。BOOL Flag=TRUE;setsockopt(sock,IPPROTO_IP, IP_HDRINCL, (char *)&Flag,sizeof(Flag);int timeout=1000setsockopt(sock,sizeof(timeout); 在這里我們使用基本套接字 超時設(shè)置,超時時間設(shè)置為SOL_SOCKET,SO_SNDTIMEO,(char*)&tim
9、eout,SOL_SOCKET設(shè)置SO_SNDTIME表示使用發(fā)送 1000ms。2. 2定義IP頭部、TCP頭部和偽頭部的數(shù)據(jù)結(jié)構(gòu)/ 定義 IP 首部 typedef struct _iphdr UCHAR h_lenver; /4 UCHAR tos; /8 USHORT total_len; /16 USHORT ident; /16 USHORT frag_and_flags; /3 UCHAR ttl; /8 UCHAR proto; /8 USHORT checksum; /16 ULONG sourceIP; /32 ULONG destIP; /32 IP_HEADER;位首部
10、長度 +4 位 IP 版本號 位服務(wù)類型 TOS位總長度(字節(jié))位標識位標志位位生存時間 TTL 位協(xié)議 (TCP, UDP 或其它) 位 IP 首部校驗和 位源 IP 地址 位目的 IP 地址/定義TCP偽首部typedef struct psd_hdrULONG saddr; /源地址ULONG daddr; /目的地址UCHAR mbz;/沒用UCHAR ptcl;/ 協(xié)議類型USHORT tcpl;/TCP 長度PSD_HEADER;/定義TCP首部typedef struct _tcphdrUSHORT th_sport;/16位源埠USHORT th_dport;/16位目的端口U
11、LONG th_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;2.3 計算校驗和的子函數(shù)在填充數(shù)據(jù)包的過程中,需要調(diào)用計算校驗和的函數(shù) checksum 兩次,分別用于校驗IP頭和TCP頭部(加上偽頭部),其實現(xiàn)代碼如下:USHORT checksum(USHORT *buffer, int size)unsigned l
12、ong cksum=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);2.4程序流程圖開始構(gòu)造原始套接字,并初始化填充ip頭部計算ip頭部校驗和構(gòu)造TCP偽頭部填充TCP頭部計算TCP頭部校驗和發(fā)送TCP資料報結(jié)束三 源代碼#include <stdio.h
13、>#include <winsock2.h>#include <ws2tcpip.h>#include <time.h>#include <windows.h>#include <string.h>#include <stdlib.h>#include <iostream.h>#pragma comment(lib,"ws2_32.lib")#define IPVER 4 /IP 協(xié)議預(yù)定#define MAX_BUFF_LEN 65500 / 發(fā)送緩沖區(qū)最大值typedef stru
14、ct ip_hdr /UCHAR h_verlen; /4 UCHAR tos; /8 USHORT total_len; /16 USHORT ident; /16 USHORT frag_and_flags; /3 UCHAR ttl; /8 UCHAR proto; /8 USHORT checksum; /16 ULONG sourceIP; /32 ULONG destIP; /32 IP_HEADER;定義 IP 首部位首部長度 ,4 位 IP 版本號位服務(wù)類型 TOS 位總長度(字節(jié)) 位標識 位標志位位生存時間 TTL 位協(xié)議 (TCP, UDP 或其它 )位 IP 首部校驗和
15、位源 IP 地址位目的 IP 地址typedef struct tsd_hdr / ULONG saddr; / ULONG daddr; / UCHAR mbz; /UCHAR ptcl; /定義TCP偽首部源地址目的地址沒用協(xié)議類型定義TCP首部USHORT tcpl; /TCP 長度 PSD_HEADER;typedef struct tcp_hdr /USHORT th_sport;/16USHORT th_dport;/16ULONG th_seq;/32ULONG th_ack;/32UCHAR th_lenres;/4UCHAR th_flag;/6USHORT th_win;/
16、16USHORT th_sum;/16USHORT th_urp;/16TCP_HEADER;位源埠位目的端口位序列號位確認號位首部長度 /6 位保留字位標志位位窗口大小位校驗和 位緊急數(shù)據(jù)偏移量/CheckSum: 計算校驗和的子函數(shù)USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size >1) cksum+=*buffer+; size -=sizeof(USHORT); if(size) cksum += *(UCHAR*)buffer;cksum = (cksum >> 1
17、6) + (cksum & 0xffff); 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ū)unsigned short check_BuffMAX_BUFF_LEN; / 檢驗和緩沖區(qū) const char tcp_sen
18、d_data="This is my homework of networt,I am happy!"BOOL flag;int rect,nTimeOver;if (argc!= 5)dest_ipprintf("Useage: SendTcp soruce_ip source_port dest_port n");return false;if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)printf("WSAStartup Error!n");return false; if(sock
19、=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0, WSA_FLAG_OVERLAPPED)=INVALID_SOCKET)printf("Socket Setup Error!n");return false;flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag )=SOCKET_ERROR)printf("setsockopt IP_HDRINCL error!n"); return false; nT
20、imeOver=1000;if (setsockopt(sock, SOL_SOCKETS, O_SNDTIMEO(,char*)&nTimeOver, sizeof(nTimeOver)=SOCKET_ERROR) printf("setsockopt SO_SNDTIMEO error!n"); return false;/ 填充 IP 首部ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long);ipHeader.tos=(UCHAR)0; ipHeader.total
21、_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(argv1); /32位源 IP 地址ipHeader.destIP=ine
22、t_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.mbz=0;psdHeader.ptcl=ipHeader.
23、proto;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;/SYNtcpHeader.th_ack=0;/ACK位目的端口號位源埠號序列號序列號置為 0/TCP 長度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)
24、<<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_B
25、uff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader)Jmemcpy(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(Se
26、ndto_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);int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+ sizeof(tcp_send_data);/ 發(fā)送數(shù)據(jù)報的目的地址SOCKADDR
27、_IN dest; memset(&dest,0,sizeof(dest);dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(argv3); dest.sin_port=htons(atoi(argv4);rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest);if (rect=SOCKET_ERROR)printf("send error!:%dn",WSAGetLastError();return false;elseprintf("send ok!n");cl
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年滬教版選修6地理上冊月考試卷含答案
- 2025年外研銜接版高一歷史下冊階段測試試卷
- 2025年蘇教版選擇性必修1歷史下冊階段測試試卷含答案
- 2025年教科新版九年級生物上冊月考試卷含答案
- 2025年外研版選擇性必修1歷史下冊階段測試試卷
- 2025年滬科版選擇性必修3化學(xué)上冊階段測試試卷含答案
- 2025年冀教版九年級歷史下冊階段測試試卷
- 2025年度中央廚房設(shè)備定期檢查與維護合同4篇
- 2025年度租賃合同范本(含轉(zhuǎn)租規(guī)定)2篇
- 2025年度高端面包屋品牌加盟及產(chǎn)品訂購合同4篇
- 圖像識別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 個體戶店鋪租賃合同
- 禮盒業(yè)務(wù)銷售方案
- 二十屆三中全會精神學(xué)習(xí)試題及答案(100題)
- 小學(xué)五年級英語閱讀理解(帶答案)
- 仁愛版初中英語單詞(按字母順序排版)
- (正式版)YS∕T 5040-2024 有色金屬礦山工程項目可行性研究報告編制標準
- 小學(xué)一年級拼音天天練
- 新概念英語第二冊考評試卷含答案(第49-56課)
- 【奧運會獎牌榜預(yù)測建模實證探析12000字(論文)】
- 保安部工作計劃
評論
0/150
提交評論