版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì) 題 目 數(shù)據(jù)包發(fā)送和接受程序的實(shí)現(xiàn) 學(xué) 院 計(jì)算機(jī)學(xué)院 專 業(yè) 軟件工程 班 別 10級(jí)(4)班 學(xué) 號(hào) 3110006379 姓 名 陳泳鑫 2012年12月21日數(shù)據(jù)包發(fā)送和接受程序的實(shí)現(xiàn)一、設(shè)計(jì)題目與要求1.設(shè)計(jì)題目發(fā)送TCP數(shù)據(jù)包2.設(shè)計(jì)要求本設(shè)計(jì)的功能是填充一個(gè)TCP數(shù)據(jù)包,并發(fā)送給目的主機(jī)。1)以命令行形式運(yùn)行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip為源端IP地址,source_port為源端口號(hào),dest_ip為目的地址,dest_port為目的端口號(hào)。2)
2、其他的TCP頭部參數(shù)請(qǐng)自行設(shè)定。3)數(shù)據(jù)字段為“This is my homework of network,I am happy!”。4)成功發(fā)送后在屏幕上輸出“send OK”。三、詳細(xì)設(shè)計(jì)本課程設(shè)計(jì)的目標(biāo)是發(fā)送一個(gè)TCP數(shù)據(jù)包,可以利用原始套接字來完成這個(gè)工作。整個(gè)程序由初始化原始套接字和發(fā)送TCP數(shù)據(jù)包兩個(gè)部分組成。當(dāng)應(yīng)用進(jìn)程需要通過TCP發(fā)送時(shí),它就將此應(yīng)用層報(bào)文傳送給執(zhí)行TCP協(xié)議的傳輸實(shí)體。TCP傳輸實(shí)體將用戶數(shù)據(jù)加上TCP報(bào)頭,形成TCP數(shù)據(jù)包,在TCP數(shù)據(jù)包上增加IP頭部,形成IP包。如圖-1顯示的是TCP數(shù)據(jù)包和IP包得關(guān)系。TCP協(xié)議的數(shù)據(jù)傳輸單位稱為報(bào)文段,其格式如圖-
3、2所示。報(bào)文段報(bào)頭的長(zhǎng)度是20B60B,選項(xiàng)部分長(zhǎng)度最多為40B。TCP報(bào)文段主要包括以下字段。端口號(hào):端口號(hào)字段包括源端口號(hào)和目的端口號(hào)。每個(gè)端口號(hào)的長(zhǎng)度是16位,分別表示發(fā)送該TCP包的應(yīng)用進(jìn)程的端口號(hào)和接收該TCP包的應(yīng)用進(jìn)程的端口號(hào)。 IP報(bào)頭TCP報(bào)頭TCP數(shù)據(jù)IP數(shù)據(jù)圖-1 TCP數(shù)據(jù)包加上IP報(bào)頭形成IP包序號(hào):長(zhǎng)度為32位。由于TCP協(xié)議是面向數(shù)據(jù)流的,它所傳送的報(bào)文段可以視為連續(xù)的數(shù)據(jù)流,因此需要給每一字節(jié)編號(hào)。序號(hào)字段的“序號(hào)”指的是本報(bào)文段數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)。確認(rèn)號(hào):該字段的長(zhǎng)度為32位,它表示接收端希望接收下一個(gè)TCP包的第一個(gè)字節(jié)的序號(hào)。報(bào)文長(zhǎng)度:該字段長(zhǎng)度為4位
4、。TCP報(bào)文長(zhǎng)度是以4B為一個(gè)單元來計(jì)算的,實(shí)際上報(bào)文長(zhǎng)度在20B60B之間。因此這個(gè)字段的值在515之間。TCP頭部數(shù)據(jù)源端口號(hào)目的端口號(hào)序號(hào)確認(rèn)號(hào)報(bào)文長(zhǎng)度 保留URGACKPSHRSTSYNFIN窗口大小校驗(yàn)和緊急指針選項(xiàng)及填充圖-2 TCP數(shù)據(jù)包頭部的格式保留:長(zhǎng)度為6位,留做今后使用,目前全部置0.控制:這個(gè)字段定義了6種不同的標(biāo)志,每一個(gè)標(biāo)志占一位,在同一時(shí)間可以設(shè)置一位或多位。URG位為1時(shí),表明應(yīng)盡快把數(shù)據(jù)傳送給應(yīng)用程序,否則表明允許數(shù)據(jù)在緩存中存放一段時(shí)間。RST位為1時(shí),表明要強(qiáng)制切斷連接。SYN位為1時(shí),表明有確立連接的請(qǐng)求,這時(shí),把序號(hào)字段的初始值作為序號(hào)字段的值,以便開
5、始通信。FIN位為1時(shí),表明發(fā)送放已經(jīng)沒有數(shù)據(jù)發(fā)送了。窗口大?。洪L(zhǎng)度為16位,指向必須緊急處理的數(shù)據(jù)的位置,因此最多能夠傳送的數(shù)據(jù)為65535B。緊急指針:該字段長(zhǎng)度為16,指向必需緊急處理的位置,只有當(dāng)標(biāo)志URG=1時(shí)緊急指針才生效。從TCP報(bào)頭后面的報(bào)文數(shù)據(jù)開始,到緊急指針?biāo)赋鲩L(zhǎng)度的數(shù)據(jù),就是必須緊急處理的數(shù)據(jù)。選項(xiàng): 該字段可以多達(dá)40B,包括單字節(jié)選項(xiàng)和多字節(jié)選項(xiàng)。校驗(yàn)和:該字段長(zhǎng)度為16位,校驗(yàn)和的校驗(yàn)范圍包括偽頭部,TCP報(bào)頭以及應(yīng)用層來的數(shù)據(jù)。其計(jì)算方法與IP協(xié)議頭部校驗(yàn)和的計(jì)算方法一樣。偽頭部為12B,它本身并不是TCP數(shù)據(jù)包的真頭部,只是在計(jì)算校驗(yàn)和時(shí),臨時(shí)和TCP數(shù)據(jù)包連
6、接在一起。偽頭部的格式如圖-3所示0 8 16 24 31源IP地址目的IP地址00000000協(xié)議號(hào)(6)TCP長(zhǎng)度創(chuàng)建一個(gè)原始套接字,并設(shè)置IP頭選項(xiàng)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標(biāo)志,表示我們聲明的是一個(gè)原始套接字類型。為使用發(fā)送接收超時(shí)設(shè)置,必須將標(biāo)志位置位置為WSA_FLAG_OVERLAPPED。在本課程設(shè)計(jì)中,發(fā)送TC
7、P包時(shí)隱藏了自己的IP地址,因此我們要自己填充IP頭,設(shè)置IP頭操作選項(xiàng)。其中flag設(shè)置為ture,并設(shè)定 IP_HDRINCL 選項(xiàng),表明自己來構(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è)置,超時(shí)時(shí)間設(shè)置為1000ms。
8、構(gòu)造IP頭和TCP頭這里, IP頭和TCP頭以及TCP偽部的構(gòu)造請(qǐng)參考下面它們的數(shù)據(jù)結(jié)構(gòu)。typedef struct _iphdr /定義IP首部 UCHAR h_lenver; /4位首部長(zhǎng)度+4位IP版本號(hào) UCHAR tos; /8位服務(wù)類型TOS USHORT total_len; /16位總長(zhǎng)度(字節(jié)) USHORT ident; /16位標(biāo)識(shí) USHORT frag_and_flags; /3位標(biāo)志位 UCHAR ttl; /8位生存時(shí)間 TTL UCHAR proto; /8位協(xié)議 (TCP, UDP 或其他) USHORT checksum; /16位IP首部校驗(yàn)和 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長(zhǎng)度 PSD_HEADER; typedef struct _tcphdr /定義TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 ULONG th_seq; /32位序列號(hào) ULO
10、NG th_ack; /32位確認(rèn)號(hào) UCHAR th_lenres; /4位首部長(zhǎng)度/6位保留字 UCHAR th_flag; /6位標(biāo)志位 USHORT th_win; /16位窗口大小 USHORT th_sum; /16位校驗(yàn)和 USHORT th_urp; /16位緊急數(shù)據(jù)偏移量 TCP_HEADER; 3.計(jì)算校驗(yàn)和的子函數(shù)在填充數(shù)據(jù)包的過程中,需要調(diào)用計(jì)算校驗(yàn)和的函數(shù)checksum兩次,分別用于校驗(yàn)IP頭和TCP頭部(加上偽頭部),其實(shí)現(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)試分析本程序流程簡(jiǎn)單,調(diào)試過程中沒有出現(xiàn)大的問題。調(diào)試過程中沒有出現(xiàn)重大的語法錯(cuò)誤,主要是運(yùn)行的結(jié)果不理想,和預(yù)期的結(jié)果有差距。填充數(shù)據(jù)包的程序部分是不容易出錯(cuò)的。至于數(shù)據(jù)包的發(fā)送,由于是利用函數(shù)sendto()來實(shí)現(xiàn)的,而sendto()是
12、面向UDP的,將協(xié)議類型修改為UDP(Hto=IPPROTO_UDP;)后,調(diào)試運(yùn)行成功,問題得到解決。調(diào)試時(shí),要添加#include #include #pragma comment(lib,ws2_32.lib)不然編譯出錯(cuò)。使用說明輸入: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é)議預(yù)定#define MAX_BUFF_LEN 65500 /發(fā)送緩沖區(qū)最大值typedef struct ip_hdr /定義IP首部 UCHAR h_verlen; /4位首部長(zhǎng)度,4位IP版本號(hào) UCHAR tos; /8位服務(wù)類型TOS USHORT total_len; /16位總長(zhǎng)度(字節(jié)) USHORT ident; /16位標(biāo)識(shí) USHORT frag_and_flags; /3位標(biāo)志位 UCHAR ttl; /8位生存時(shí)間 TTL UCHAR proto; /8位協(xié)議 (TCP, UDP 或其他) USHORT checks
14、um; /16位IP首部校驗(yàn)和 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長(zhǎng)度 PSD_HEADER; typedef struct tcp_hdr /定義TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 ULONG th
15、_seq; /32位序列號(hào) ULONG th_ack; /32位確認(rèn)號(hào) UCHAR th_lenres; /4位首部長(zhǎng)度/6位保留字 UCHAR th_flag; /6位標(biāo)志位 USHORT th_win; /16位窗口大小 USHORT th_sum; /16位校驗(yàn)和 USHORT th_urp; /16位緊急數(shù)據(jù)偏移量 TCP_HEADER; /CheckSum:計(jì)算校驗(yàn)和的子函數(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; /檢驗(yàn)和緩沖區(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è)置選項(xiàng)值 IP_HDRINCL為要設(shè)置的選項(xiàng)值 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è)置選項(xiàng)值 SO_SNDTIMEO為要設(shè)置的選項(xiàng)值 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位標(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í)為0 ipHeader.sourceIP=inet_addr(ar
21、gv1); /32位源IP地址 ipHeader.destIP=inet_addr(argv3); /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.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位目的端口號(hào) tcpHeader.th_sport=htons(atoi(argv2); /16位源端口號(hào) tcpHeader.th_seq=0; /SYN序列號(hào) tcpHeader.th_ack=0; /ACK序列號(hào)置為0 /TCP長(zhǎng)度和保留位 tcpHeader.th_lenres=(sizeo
23、f(tcpHeader)/sizeof(unsigned long)4|0); tcpHeader.th_flag=2; /修改這里來實(shí)現(xiàn)不同的標(biāo)志位探測(cè),2是SYN,1是/FIN,16是ACK探測(cè) 等等 tcpHeader.th_win=htons(unsigned short)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=ch
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城鄉(xiāng)污水處理和管網(wǎng)建設(shè)工程項(xiàng)目可行性研究報(bào)告寫作模板-申批備案
- 2025年江西陶瓷工藝美術(shù)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫含答案解析
- 2025年昆明鐵道職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年常考版參考題庫含答案解析
- 2025年揭陽職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年氫能源行業(yè)發(fā)展動(dòng)態(tài)與前景分析
- 合同范本之汽車美容租賃合同
- 雞苗采購合同范本
- 公路貨物運(yùn)輸合同定義
- 農(nóng)業(yè)科技創(chuàng)新與應(yīng)用服務(wù)合同
- 試驗(yàn)檢測(cè)委托合同
- 2025年度高端商務(wù)車輛聘用司機(jī)勞動(dòng)合同模板(專業(yè)版)4篇
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 2025長(zhǎng)江航道工程局招聘101人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年黑龍江哈爾濱市面向社會(huì)招聘社區(qū)工作者1598人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《妊娠期惡心嘔吐及妊娠劇吐管理指南(2024年)》解讀
- 《黑神話:悟空》跨文化傳播策略與路徑研究
- 《古希臘文明》課件
- 居家養(yǎng)老上門服務(wù)投標(biāo)文件
- 長(zhǎng)沙市公安局交通警察支隊(duì)招聘普通雇員筆試真題2023
- 2025年高考語文作文滿分范文6篇
- 零售業(yè)連鎖加盟合同
評(píng)論
0/150
提交評(píng)論