第一篇:計算機網絡課程設計-編程實現簡單的TCP協議分析器
編程實現簡單的TCP協議分析器
編程實現簡單的TCP協議分析器
一、問題描述
編程實現簡單的TCP協議分析器,TCP協議分析器是一種用于監督和跟蹤網絡活動的診斷工具,它從局域網中抓取IP數據包,并對它進行分析得到相應的頭部信息,過濾TCP包進行分析,得到TCP包的相應信息。
二、基本要求
1.利用原始套接字實現簡單的TCP協議分析器。2.系統功能包括:
2.1 原始套接字與網卡綁定,并接收流經網卡的所有數據包; 2.2 對數據包進行分析以獲得源IP地址和目的IP地址; 2.3 對TCP Segment進行分析以獲得其首部詳細信息; 2.4 顯示分析結果。3 建議使用VC++。
三、設計思想
TCP協議的數據傳送程序是由二個子程序組成的。也可以看成是服務器端程序和客戶端程序,其中:服務器端程序的功能是偵聽端口號,接收遠 程主要的TCP連接申請,并接收遠程主機傳送來的文字數據。另外一個子程序,也就是所謂的客戶端程序,主要實現向網絡的遠程主機提出TCP連接申請。
程序利用原始套接字抓取局域網中的IP包。
TCP協議分析器實現了sniffer的一部分功能。而sniffer的工作原理是:1.把網卡置于混雜模式;2.捕獲數據包;3.分析數據包。
Raw Socket: 原始套接字可以用它來發送和接收 IP 層以上的原始數據包, 如 ICMP,TCP, UDP等。
四、系統結構
(1)Pcap_addr描述網絡接口地址;
(2)pcap_pkthdr用來描述每個捕獲到的數據包的基本信息;(3)int_pcaplookupnet獲取網絡地址和網絡掩碼;
(4)int_pcaploop循環捕獲網絡數據包,直到遇到錯誤或滿足退出條件;(5)pcap_t* pcap_open_dead構造一個libpcap句柄。
五、程序流程(或模塊劃分)
編程實現簡單的TCP協議分析器
六、源程序
#include “pcap.h” struct ether_header {
u_int8_t ether_dhost[6];
/* 目的以太網地址 */
u_int8_t ether_shost[6];
/* 源以太網地址 */
u_int16_t ether_type;
/* 以太網類型 */ };struct arp_header
編程實現簡單的TCP協議分析器
{
u_int16_t arp_hardware_type;
/* 硬件類型 */
u_int16_t arp_protocol_type;
/* 協議類型 */
u_int8_t arp_hardware_length;
/* 硬件地址長度 */
u_int8_t arp_protocol_length;
/* 協議地址長度 */
u_int16_t arp_operation_code;
/* 操作碼 */
u_int8_t arp_source_ethernet_address[6];
/* 源以太網地址 */
u_int8_t arp_source_ip_address[4];
/* 源IP地址 */
u_int8_t arp_destination_ethernet_address[6];
/* 目的以太網地址 */
u_int8_t arp_destination_ip_address[4];
/* 目的IP地址 */ };struct ip_header {
#if defined(WORDS_BIGENDIAN)
u_int8_t ip_version: 4,/* 版本 */
ip_header_length: 4;
/* 首部長度 */
#else
u_int8_t ip_header_length: 4, ip_version: 4;
#endif
u_int8_t ip_tos;
/* 服務質量 */
u_int16_t ip_length;
/* 長度 */
u_int16_t ip_id;
/* 標識 */
u_int16_t ip_off;
編程實現簡單的TCP協議分析器
/* 偏移 */
u_int8_t ip_ttl;
/* 生存時間 */
u_int8_t ip_protocol;
/* 協議類型 */
u_int16_t ip_checksum;
/* 校驗和 */
struct in_addr ip_souce_address;
/* 源IP地址 */
struct in_addr ip_destination_address;
/* 目的IP地址 */ };struct udp_header {
u_int16_t udp_source_port;
/* 源端口號 */
u_int16_t udp_destination_port;
/* 目的端口號 */
u_int16_t udp_length;
/* 長度 */
u_int16_t udp_checksum;
/* 校驗和 */ };struct tcp_header {
u_int16_t tcp_source_port;
/* 源端口號 */
u_int16_t tcp_destination_port;
/* 目的端口號 */
u_int32_t tcp_sequence_liuzhen;
/* 序列號 */
u_int32_t tcp_acknowledgement;
/* 確認序列號 */
#ifdef WORDS_BIGENDIAN
u_int8_t tcp_offset: 4,/* 偏移 */
編程實現簡單的TCP協議分析器
tcp_reserved: 4;
/* 未用 */
#else
u_int8_t tcp_reserved: 4,/* 未用 */
tcp_offset: 4;
/* 偏移 */
#endif
u_int8_t tcp_flags;
/* 標記 */
u_int16_t tcp_windows;
/* 窗口大小 */
u_int16_t tcp_checksum;
/* 校驗和 */
u_int16_t tcp_urgent_pointer;
/* 緊急指針 */ };struct icmp_header {
u_int8_t icmp_type;
/* ICMP類型 */
u_int8_t icmp_code;
/* ICMP代碼 */
u_int16_t icmp_checksum;
/* 校驗和 */
u_int16_t icmp_id;
/* 標識符 */
u_int16_t icmp_sequence;
/* 序列碼 */ };void tcp_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){
struct tcp_header *tcp_protocol;
/* TCP協議變量 */
u_char flags;
編程實現簡單的TCP協議分析器
/* 標記 */
int header_length;
/* 長度 */
u_short source_port;
/* 源端口 */
u_short destination_port;
/* 目的端口 */
u_short windows;
/* 窗口大小 */
u_short urgent_pointer;
/* 緊急指針 */
u_int sequence;
/* 序列號 */
u_int acknowledgement;
/* 確認號 */
u_int16_t checksum;
/* 校驗和 */
tcp_protocol =(struct tcp_header*)(packet_content + 14+20);
/* 獲得TCP協議內容 */
source_port = ntohs(tcp_protocol->tcp_source_port);
/* 獲得源端口 */
destination_port = ntohs(tcp_protocol->tcp_destination_port);
/* 獲得目的端口 */
header_length = tcp_protocol->tcp_offset *4;
/* 長度 */
sequence = ntohl(tcp_protocol->tcp_sequence_liuzhen);
/* 序列碼 */
acknowledgement = ntohl(tcp_protocol->tcp_acknowledgement);
/* 確認序列碼 */
windows = ntohs(tcp_protocol->tcp_windows);
/* 窗口大小 */
urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer);
/* 緊急指針 */
flags = tcp_protocol->tcp_flags;
/* 標識 */
checksum = ntohs(tcp_protocol->tcp_checksum);
編程實現簡單的TCP協議分析器
/* 校驗和 */
printf(“-------TCP協議
-------n”);
printf(“源端口號:%dn”, source_port);
printf(“目的端口號:%dn”, destination_port);
switch(destination_port)
{
case 80:
printf(“上層協議為HTTP協議n”);
break;
case 21:
printf(“上層協議為FTP協議n”);
break;
case 23:
printf(“上層協議為TELNET協議n”);
break;
case 25:
printf(“上層協議為SMTP協議n”);
break;
case 110:
printf(“上層協議POP3協議n”);
break;
default:
break;
}
printf(“序列碼:%un”, sequence);
printf(“確認號:%un”, acknowledgement);
printf(“首部長度:%dn”, header_length);
printf(“保留:%dn”, tcp_protocol->tcp_reserved);
printf(“標記:”);
if(flags &0x08)
printf(“PSH ”);
if(flags &0x10)
printf(“ACK ”);
if(flags &0x02)
printf(“SYN ”);
if(flags &0x20)
編程實現簡單的TCP協議分析器
printf(“URG ”);
if(flags &0x01)
printf(“FIN ”);
if(flags &0x04)
printf(“RST ”);
printf(“n”);
printf(“窗口大小:%dn”, windows);
printf(“校驗和:%dn”, checksum);
printf(“緊急指針:%dn”, urgent_pointer);} void ip_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){
struct ip_header *ip_protocol;
/* IP協議變量 */
u_int header_length;
/* 長度 */
u_int offset;
/* 偏移 */
u_char tos;
/* 服務質量 */
u_int16_t checksum;
/* 校驗和 */
ip_protocol =(struct ip_header*)(packet_content + 14);
/* 獲得IP協議內容 */
checksum = ntohs(ip_protocol->ip_checksum);
/* 獲得校驗和 */
header_length = ip_protocol->ip_header_length *4;
/* 獲得長度 */
tos = ip_protocol->ip_tos;
/* 獲得服務質量 */
offset = ntohs(ip_protocol->ip_off);
/* 獲得偏移 */ if(ip_protocol->ip_protocol==6)
{
printf(“-----------IP協議
-----------n”);
編程實現簡單的TCP協議分析器
printf(“版本號:%dn”, ip_protocol->ip_version);
printf(“首部長度:%dn”, header_length);
printf(“服務質量:%dn”, tos);
printf(“總長度:%dn”, ntohs(ip_protocol->ip_length));
printf(“標識:%dn”, ntohs(ip_protocol->ip_id));
printf(“偏移:%dn”,(offset &0x1fff)*8);
printf(“生存時間:%dn”, ip_protocol->ip_ttl);
printf(“協議類型:%dn”, ip_protocol->ip_protocol);
printf(“上層協議為TCP協議n”);
printf(“校驗和:%dn”, checksum);
printf(“源IP地址:%sn”, inet_ntoa(ip_protocol->ip_souce_address));
/* 獲得源IP地址 */
printf(“目的IP地址:%sn”, inet_ntoa(ip_protocol->ip_destination_address));
/* 獲得目的IP地址 */
} } void ethernet_protocol_packet_callback(u_char *packet_header, const u_char *packet_content){ static int packet_number = 1;
/* 數據包個數,靜態變量 */ u_short ethernet_type;
/* 以太網類型 */
struct ether_header *ethernet_protocol;struct ip_header *ip_protocol;
/* IP協議變量 */
u_int header_length;
/* 長度 */
u_int offset;
/* 偏移 */
u_char tos;
/* 服務質量 */
u_int16_t checksum;
/* 校驗和 */
ip_protocol =(struct ip_header*)(packet_content + 14);
/* 獲得IP協議內容 */
checksum = ntohs(ip_protocol->ip_checksum);
*argument, const struct pcap_pkthdr 編程實現簡單的TCP協議分析器
/* 獲得校驗和 */
header_length = ip_protocol->ip_header_length *4;
/* 獲得長度 */
tos = ip_protocol->ip_tos;
/* 獲得服務質量 */
offset = ntohs(ip_protocol->ip_off);
/* 獲得偏移 */
/* 以太網協議變量 */ ethernet_protocol =(struct ether_header*)packet_content;ethernet_type = ntohs(ethernet_protocol->ether_type);/* 獲得以太網類型 */ if(ethernet_type==0x0800 && ip_protocol->ip_protocol==6){ u_char *mac_string;
/* 以太網地址 */
printf(“**************************************************n”);
printf(“捕獲第%d個TCP網絡數據包n”, packet_number);
printf(“捕獲時間:n”);
printf(“%s”, ctime((const time_t*)&packet_header->ts.tv_sec));
/* 獲得捕獲數據包的時間 */
printf(“數據包長度:n”);
printf(“%dn”, packet_header->len);
printf(“--------
以太網協議
--------n”);
/* 獲得以太網協議內容 */
printf(“類型:n”);
printf(“%04xn”, ethernet_type);
printf(“源以太網地址: n”);
mac_string = ethernet_protocol->ether_shost;
printf(“%02x:%02x:%02x:%02x:%02x:%02xn”,*mac_string, *(mac_string *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));
/* 獲得源以太網地址 */
printf(“目的以太網地址: n”);
mac_string = ethernet_protocol->ether_dhost;
printf(“%02x:%02x:%02x:%02x:%02x:%02xn”, *mac_string, *(mac_string *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));
/* 獲得目的以太網地址 */
ip_protocol_packet_callback(argument, packet_header, packet_content);
+ 1),+ 1), 編程實現簡單的TCP協議分析器
packet_number++;
printf(“**************************************************n”);
} } void main(){
pcap_t *pcap_handle;
/* Winpcap句柄 */
char error_content[PCAP_ERRBUF_SIZE];
/* 存儲錯誤信息 */
char *net_interface;
/* 網絡接口 */
struct bpf_program bpf_filter;
/* BPF過濾規則 */
char bpf_filter_string[] = "";
/* 過濾規則字符串 */
bpf_u_int32 net_mask;
/* 掩碼 */
bpf_u_int32 net_ip;
/* 網路地址 */
net_interface = pcap_lookupdev(error_content);
/* 獲得可用的網絡接口 */
pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);
/* 獲得網絡地址和掩碼地址 */
pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);
/* 打開網路接口 */
pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);
/* 編譯BPF過濾規則 */
pcap_setfilter(pcap_handle, &bpf_filter);
/* 設置過濾規則 */
if(pcap_datalink(pcap_handle)!= DLT_EN10MB)
return;
pcap_loop(pcap_handle,-1, ethernet_protocol_packet_callback, NULL);
/* 注冊回調函數,循環捕獲網絡數據包,利用回調函數來處理每個數據包 */
pcap_close(pcap_handle);
/* 關閉Winpcap操作 */ }
編程實現簡單的TCP協議分析器
七、測試數據
本地局域網IP數據包
八、測試情況
程序運行結果圖:
編程實現簡單的TCP協議分析器
編程實現簡單的TCP協議分析器
結 論
通過兩周的課程設計,增強了我的實際動手能力,通過實際的編程整合串聯了我所學到的知識。另外我還學到了作為編程人員的一些基本素質,這為我畢業后找工作奠定了基礎。
通過做TCP協議分析器學習的很多網絡編程知識: 1.學會了winpcap網絡數據報捕獲開發包的使用; 2.綁定網卡函數bind(); 3.數據接受函數recv(); 4.Windows套接字編程;
5.學習了原始套接字編程的基本機制; 6.學習對數據包進行協議分析的基本方法。
通過做TCP協議分析器學習的很多Visual C++ Windows編程知識:
1.學會了Windows常用數據結構的使用;
2.學到了一些用Visual C++ Windows編程的技巧。
編程實現簡單的TCP協議分析器
參考文獻
[1] 甘玲 邱勁 《面向對象技術與Visual C++ 》 清華大學出版社 [2] 任哲 《MFC Windows 應用程序設計》清華大學出版社 [3] 《計算機網絡》 北京:機械工業出版社
[4] 《Visual C++網絡通信編程實用案例精選》 人民郵電出版社 [5] 《windows程序設計》 北京大學出版社
第二篇:計算機網絡 課程設計 發送TCP數據包
課設名稱:發送TCP數據包
班級:
學號:
姓名:
指導老師: 日期: 2012.6.15
計算機網絡課程設計報告
目錄
一.設計題目與要求........................................................................................................2
1.設計題目................................................................................................................2
2.設計要求................................................................................................................2
二.需求分析...................................................................................................................2三.詳細設計...................................................................................................................2
1.創建一個原始套接字,并設置IP頭選項.................................................................3
2.構造IP頭和TCP頭...............................................................................................3
3.計算校驗和的子函數..............................................................................................4
4.流程圖...................................................................................................................6
四.調試分析...................................................................................................................7
五.運行結果...................................................................................................................7
六.總結..........................................................................................................................8
七.源程序......................................................................................................................9
發送TCP數據包
一.設計題目與要求
1.設計題目
發送TCP數據包 2.設計要求
本設計的功能是填充一個TCP數據包,并發送給目的主機。
1)以命令行形式運行:TCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip為源端IP地址,source_port為源端口號,dest_ip為目的地址,dest_port為目的端口號。
2)其他的TCP頭部參數請自行設定。3)數據字段為“hello”。
4)成功發送后在屏幕上輸出“send OK”。
二.需求分析
1.本程序需完成發送一個TCP數據包給目的主機
2.程序的輸入:TCP source_ip source_port dest_ip dest_port,然后根據提示輸入要發送的數據,回車即可。
3.程序的輸出:Send OK!
4.測試數據 TCP 192.168.1.100 200 192.168.1.101 200
三.詳細設計
本課程設計的目標是發送一個TCP數據包,可以利用原始套接字來完成這個工作。整個程序由初始化原始套接字和發送TCP數據包兩個部分組成。
2發送TCP數據包
1.創建一個原始套接字,并設置IP頭選項
SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:
sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);這里,設置了SOCK_RAW標志,表示我們聲明的是一個原始套接字類型。為使用發送接收超時設置,必須將標志位置位置為WSA_FLAG_OVERLAPPED。在本課程設計中,發送TCP包時隱藏了自己的IP地址,因此我們要自己填充IP頭,設置IP頭操作選項。其中flag設置為ture,并設定 IP_HDRINCL 選項,表明自己來構造IP頭。
setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char *)&Flag, sizeof(Flag));int timeout=1000; setsockopt(sock, sizeof(timeout));在這里我們使用基本套接字SOL_SOCKET,設置SO_SNDTIMEO表示使用發送超時設置,超時時間設置為1000ms。2.構造IP頭和TCP頭
這里,IP頭和TCP頭以及TCP偽部的構造請參考下面它們的數據結構。
typedef struct _iphdr //定義IP首部 { UCHAR h_lenver;//4位首部長度+4位IP版本號 UCHAR tos;//8位服務類型TOS
USHORT total_len;//16位總長度(字節)USHORT ident;//16位標識
USHORT frag_and_flags;//3位標志位 UCHAR ttl;//8位生存時間 TTL
UCHAR proto;//8位協議(TCP, UDP 或其他)
SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,3發送TCP數據包
USHORT checksum;//16位IP首部校驗和 ULONG sourceIP;//32位源IP地址
ULONG destIP;//32位目的IP地址
}IP_HEADER;typedef struct psd_hdr //定義TCP偽首部 { ULONG saddr;ULONG daddr;//源地址 //目的地址
UCHAR mbz;//沒用 UCHAR ptcl;
USHORT tcpl;//協議類型 //TCP長度
}PSD_HEADER;typedef struct _tcphdr //定義TCP首部 { USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG 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位緊急數據偏移量
}TCP_HEADER;
3.計算校驗和的子函數
在填充數據包的過程中,需要調用計算校驗和的函數checksum兩次,分別用于校驗IP頭和TCP頭部(加上偽頭部),其實現代碼如下:
USHORT checksum(USHORT *buffer, int size)
4發送TCP數據包
{ unsigned long 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);}
5發送TCP數據包
4.流程圖
開始構造原始套接字并初始化填充IP首部計算IP首部校驗和構造TCP偽首部填充TCP首部計算TCP首部校驗和填充發送緩沖區填入目的地址發送數據包結束
6發送TCP數據包
四.調試分析
本程序流程簡單,調試過程中沒有出現大的問題。
調試過程中沒有出現重大的語法錯誤,主要是運行的結果不理想,和預期的結果有差距。填充數據包的程序部分是不容易出錯的。至于數據包的發送,由于是利用函數sendto()來實現的,而sendto()是面向UDP的,將協議類型修改為UDP(Header.proto=IPPROTO_UDP;)后,調試運行成功,問題得到解決。
調試時,要添加 #include
五.運行結果
1.輸入:TCP 192.168.1.100 200 192.168.1.101 200
7發送TCP數據包
2.輸入要發送的字符串:“hello”按Ctrl+Z發送
六.總結
通過本次課程設計,我對發送TCP數據包的原理有了一定的了解。理解了TCP數據報的報文格式、TCP連接時的三次握手和TCP連接結束時的四次握手的過程及它們的作用。此外,在設計過程中,通過查閱資料,也讓我對TCP的三大特點(流量控制、差錯控制、擁塞控制)有了認識。,在課程設計過程中,由于編程知識的欠缺,使我在課程設計過程中不是很順利,編程知識的欠缺是我的最大障礙,不過,這也給了我動力,我會努力去學好編程的相關知識,為以后的學習和工作打下基礎。最后,感謝老師安排了此次課程設計。
發送TCP數據包
七.源程序
#include
#define IPVER 4 //IP協議預定 #define MAX_BUFF_LEN 65500 //發送緩沖區最大值
typedef struct ip_hdr //定義IP首部 {
UCHAR h_verlen;//4位首部長度,4位IP版本號 UCHAR tos;//8位服務類型TOS USHORT total_len;//16位總長度(字節)USHORT ident;//16位標識 USHORT frag_and_flags;//3位標志位 UCHAR ttl;//8位生存時間 TTL UCHAR proto;//8位協議(TCP, UDP 或其他)USHORT checksum;//16位IP首部校驗和 ULONG sourceIP;//32位源IP地址 ULONG destIP;//32位目的IP地址
發送TCP數據包
}IP_HEADER;
typedef struct tsd_hdr //定義TCP偽首部 {
ULONG saddr;//源地址 ULONG daddr;//目的地址 UCHAR mbz;//沒用 UCHAR ptcl;//協議類型 USHORT tcpl;//TCP長度
}PSD_HEADER;
typedef struct tcp_hdr //定義TCP首部 {
USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG 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位緊急數據偏移量
}TCP_HEADER;
//CheckSum:計算校驗和的子函數
USHORT checksum(USHORT *buffer, int size){ unsigned long cksum=0;while(size >1)
發送TCP數據包
{ cksum+=*buffer++;size-=sizeof(USHORT);} if(size){ cksum += *(UCHAR*)buffer;} cksum =(cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >>16);return(USHORT)(~cksum);}
int ReadData(char *str,int maxlen){ int readlen=0;char ch=NULL;if(str==NULL||maxlen<=0){
printf(“ReadData Error!!n”);
return 0;//failed } printf(“Input Data(End By Ctrl+Z): n”);while(maxlen){
ch=getchar();
if(ch==EOF)break;
str[readlen++]=ch;maxlen--;
發送TCP數據包
} } str[readlen]=NULL;return readlen;int main(int argc, char* argv[]){ WSADATA WSAData;SOCKET sock;
IP_HEADER ipHeader;TCP_HEADER tcpHeader;PSD_HEADER psdHeader;
char Sendto_Buff[MAX_BUFF_LEN];//發送緩沖區
unsigned short check_Buff[MAX_BUFF_LEN];//檢驗和緩沖區 char tcp_send_data[1000];
BOOL flag;int rect,nTimeOver;if(argc!= 5){ printf(“Usage: SendTcp soruce_ip source_port dest_ip dest_port n”);return false;} read_data_len=ReadData(tcp_send_data,1000);int read_data_len=0;
發送TCP數據包
if(read_data_len<=0)return 1;
if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0){ printf(“WSAStartup 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;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR){ printf(“setsockopt IP_HDRINCL error!n”);return false;} nTimeOver=1000;if(setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,(char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR){ printf(“setsockopt SO_SNDTIMEO error!n”);return false;}
發送TCP數據包
//填充IP首部
ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+read_data_len);ipHeader.ident=0;//16位標識 ipHeader.frag_and_flags=0;//3位標志位 ipHeader.ttl=128;//8位生存時間 ipHeader.proto=IPPROTO_TCP;//協議類型 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));
//構造TCP偽首部
psdHeader.saddr=ipHeader.sourceIP;psdHeader.daddr=ipHeader.destIP;psdHeader.mbz=0;psdHeader.ptcl=ipHeader.proto;psdHeader.tcpl=htons(sizeof(TCP_HEADER)+read_data_len);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[4]));//16位目的端口號 tcpHeader.th_sport=htons(atoi(argv[2]));//16位源端口號
發送TCP數據包
tcpHeader.th_seq=0;//SYN序列號 tcpHeader.th_ack=0;//ACK序列號置為0 //TCP長度和保留位
tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0);tcpHeader.th_flag=2;//修改這里來實現不同的標志位探測,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));
//填充發送緩沖區
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(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+ sizeof(TCP_HEADER)+read_data_len);memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);
發送TCP數據包
int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+read_data_len;//發送數據報的目的地址 SOCKADDR_IN dest;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,(struct sockaddr*)&dest, sizeof(dest));if(rect==SOCKET_ERROR){ printf(“send error!:%dn”,WSAGetLastError());return false;} else
closesocket(sock);WSACleanup();return 1;} printf(“nsend ok!n”);
第三篇:計算機網絡課程設計
目
錄
1.課題描述........................................................1 2 系統設計概述...................................................1 3 課程設計的主要內容............................................2 3.1站點總體設計原則及設計目標....................................2 3.2用戶需求......................................................2 3.3動態IP地址的設置及服務器的配置...............................3 3.3.1.動態IP配置簡介...........................................3 3.3.2.配置DHCP服務器...........................................3 3.3.3配置IIS服務器.............................................6 3.4制作網站......................................................6 3.4.1.建站流程..................................................6 3.4.2.網站各模塊的設計...........................................7 3.4.3.建站實現軟件...............................................8 3.5.建站注意要點..................................................9 3.5.1.前期調研分析...............................................9 3.5.2.網站的目的及功能定位.......................................9 3.5.3網站技術解決方案...........................................9 3.5.4.網站內容規劃.............................................10 3.5.5.網頁設計.................................................10 3.5.6.網站測試..................................................10 4.網站維護.......................................................10 4.1、靜態頁面的添加修改..........................................10 4.2、動態功能支持在線更新........................................10
總結..............................................................12 參考文獻.........................................................12
1.課題描述
計算機網絡近年來獲得了飛速的發展。計算機通信網絡以及Internet已成為我們社會結構的一個基本組成部分。網絡被應用于工商業的各個方面,電子銀行、電子商務、企業管理、信息服務業等都以計算機網絡系統為基礎。從學校遠程教育到公司日常辦公乃至現在的電子社區,很多方面都離不開網絡技術。可以不夸張地說,網絡在當今世界無處不在。
網絡的發展也是一個經濟上的沖擊。數據網絡使個人化的遠程通信成為可能,并改變了商業通信的模式。一個完整的用于發展網絡技術、網絡產品和網絡服務的新興工業已經形成,計算機網絡的普及性和重要性已經導致了在不同崗位上對具有更多網絡知識的人才的大量需求。企業需要雇員來規劃、獲取、安裝、操作、管理那些構成計算機網絡的軟硬件系統,建立自己的網站,方便辦公及交流 系統設計概述
傳統的企業內部辦公存在著種種弊端,往往造成人員和資源的極大浪費,應用網絡技術組建余個高效、快捷、安全的辦公環境成為許多企業和單位的當務之急。與傳統的單機工作相比,網絡化辦公具有以下幾個明顯優點: 1共享軟硬件資源,節約資金投入,提高運作效率
企業內部組件web站點后,可以在一個部門只安裝一臺打印機和掃描儀,其他計算機通過局域網共享這些設備和數據,有利于降低成本。2對重要數據進行安全、集中的管理
組建站點后,可以把一些重要數據放置在專門的網絡服務器上集中管理,并通過網絡服務器的訪問控制限制其他計算機對總要數據的訪問。這樣就可以有效管理企業內部的重要數據,保證數據安全性,防止數據丟失和被竊取。3方便企業內部信息發布與交流
當企業進行諸如企業內部新聞、電話號碼、產品文檔、技術文件等信息發布時,可以把這些信息放置在web站點的共享目錄上,供員工下載,方便了信息的發布和接收。4便于員工的協調操作
利用內部的辦公網,可以方便的對同一事務進行協同處理,提高工作效率,縮短任務完成的時間
圖2.1企業內部網絡拓撲 課程設計的主要內容
3.1站點總體設計原則及設計目標
組建企業內部web站點要注意站點的分塊、共享、安全性、可管理性、以及可維護性。在設計中,系統結構模塊化,軟硬件平臺可以模塊化瓶裝,系統配置靈活,使系統具有強大的可增長性和強壯性。滿足多層次安全控制手段,建立完善的安全管理體系,防止數據的丟失和被竊取。
組建企業內部web站點,既能將公司內部所有計算機納入系統中去,實現統一規劃、分塊工作、異地互聯、整體管理,并可為將來的應用擴展升級預留接口。
3.2用戶需求 作為企業內部網絡需要滿足:
1、辦公事務管理
主要包括公文與文檔管理、公告、大事記、會議紀要、資產與辦公用品管理、行政制度、辦公事務討論等。
2、人力資源管理
主要包括員工檔案、崗位職責、員工通信錄、認識管理規范等。
3、財務資產管理
主要包括固定資產管理、工資管理、經費管理等。
4、網站管理
主要包括用戶及權限設置、數據庫維護、網頁設置、標志與標題設置及網絡各欄目內容編輯等功能。
3.3動態IP地址的設置及服務器的配置
3.3.1.動態IP配置簡介
動態IP地址,顧名思義就是設備所取得的IP地址是非固定的,是可以動態分配和取得的。使用動態IP地址的原因主要有兩個:一是可以用較少的IP地址構建較大的網絡。如果與連入網絡的主機和其它設備相比,所分得的公用IP地址略少一些,如果為每個設備都分配一個固定的IP地址,則顯然部分計算機將不能接入網絡??紤]到并非所有的計算機都在同一時間內運行并與網絡連接,所以,如果將IP進行動態分配,即計算機連入網絡時自動取得,斷開與網絡的連接時自動收回,即可滿足網絡對IP地址的需求。二是可以增加網絡內計算機的可移動性。當某臺主機從一個子網移動到另一個子網時,由于IP地址中網絡號的不同,從而導致該計算機與其它主機間無法進行通信,解決該類問題最簡單的方式就是為移動的主機在新子網中重新分配IP地址。但是,如果采用動態IP地址,就會減少這種網絡管理的復雜性。Windows NT使用DHCP來解決動態IP地址的分配問題。使用DHCP時,整個網絡中必須至少有一臺運行Windows NT主機安裝有DHCP軟件,充當DHCP服務器,而其它所有欲使用DHCP功能的工作站也必須具有支持DHCP的功能。這樣,當DHCP工作站啟動時,它就會自動與DHCP服務器通信,并由DHCP服務器為其提供一個IP地址。當然,這個地址只是臨時的 3.3.2.配置DHCP服務器
DHCP提供了計算機IP地址的動態配置,如果需要服務器為域中的計算機動態分配IP地址,則必須配置DHCP服務器。配置DHCP服務器的具體步驟如下:
圖3.1打開服務器配置向導
圖3.2配置服務器向導
圖3.3配置服務器向導
圖3.4為配置服務器向導
圖3.5管理服務器
圖3.6 再來就是通過“開始”選擇“控制面板”|“添加或刪除程序”也可以安裝DHCP。
3.3.3配置IIS服務器
右鍵單擊“我的電腦”選擇“管理”~服務及應用程序~Internet信息服務~網站~默認網站,單擊右鍵,選擇屬性,打開主目錄,設置主目錄為web站點的根目錄,也可選擇修改其他屬性
圖3.7配置IIS服務器
3.4制作網站
3.4.1.建站流程
建立網站的流程大致可以分成三個階段,如圖所示
圖3.8網站的流程框圖
構建內容信息、搜索整理資料和規劃網站結構是建立網站的
企業的每一個員工都存在向企業內部網發布內容的潛在可能性。但員工必須按照他們各自的角色協調作業活動。不同規模的公司都需要以省時省錢的方式組織交互信息發布的流程。
通常情況下,為在網站上發布內容,作者創建的材料要經過一個或多個編輯的審校和核準。在這個過程中,作者及編輯按照各種特定的標準分類及標注信息,并為發布設計頁面及連接。這一流程通常不是正式的,且要接受網絡管理員的協調,這就導致了管理員在“站點發布狂潮”到來時,或是當用戶對實時信息需求迅速增長時陷入孤立無援的境地。
使用Site Server可以解決,Site Server還定義了一套為站點增添內容的四步流程,既提交、標注、核準和部署。
圖3.9新聞發布系統框圖
3.4.3.建站實現軟件
可以用Dreamweaver,主要包括兩種頁面,即html和asp。
HTML(Hyper Text Markup Language ,超文本標記語言),或稱為“多媒體文件語言”,是用于創建Web頁和Web 信息發布的
(1)通用性:可實現不同平臺的文檔共享。
(2)可擴展性:HTML的標簽集合可以根據新需求而不斷修正或加入有限的新標簽符, 為實現有限的新功能的擴展提供保障。
(3)創建的靈活性:HTML文檔是純文本文檔, 可以由網頁編輯器以及其他文本編輯軟件創建。
HTML是“Hyper Text Markup Language”的縮寫,它是一種超文本標記語言,是網頁的描述語言,用于編制通過萬維網顯示的超文本文件。它是目前在網頁設計中,所使用的最基本的標記語言?,F在很多HTML 的編輯器,都是通過跟文字處理器相似的接口來編輯網頁的。
ASP 文件和 HTML 文件類似ASP 文件可包含文本、HTML、XML 和腳本 ASP 文件中的腳本可在服務器上執行。ASP 文件的擴展名是 “.asp”.當瀏覽器請求某個 HTML 文件時,服務器會返回這個文件.而當瀏覽器請求某個 ASP 文件時,IIS 將這個請求傳遞至 ASP 引擎。ASP 引擎會逐行地讀取這個文件,并執行文件中的腳本。最后,ASP 文件將以純 HTML 的形式返回到瀏覽器。ASP 指 Active Server Pages(動態服務器頁面)ASP 是運行于 IIS 之中的程序.3.5.建站注意要點
另外在網頁制作過程中應注意以下要點: 3.5.1.前期調研分析
了解網頁制作后具體的工作人員具體權限,以保證公司機密信息不會被泄露,同時又能讓每個人從網站上獲取足夠的工作信息;同時對于私人隱私的公開應得到個人的允許。在注意到以上的同時,還要考慮公司的自身情況、建設網站的能力等 3.5.2.網站的目的及功能定位
本次為企業內部web站點的構建及維護 3.5.3網站技術解決方案
確定服務器,是自建服務器還是租用虛擬主機。選擇操作系統。網站安全性措施,如:防入侵,防病毒,防竊取方案
3.5.4.網站內容規劃
根據網站的目的和功能規劃網站內容。一般企業內部網站應包括:公司簡介、部門簡介、公共信息、新聞發布、員工聯系方式、任務信息、信息搜索查詢、相關幫助等內容。
3.5.5.網頁設計
網頁美術設計要求。網頁美術設計一般要求與企業整體形象一致,企業內部網色彩要與辦公環境保持和諧 3.5.6.網站測試
①網站發布前要進行細致周密的測試,以保證正常的瀏覽和使用。主要測試內容有: ②服務器穩定性、安全性。③程序及數據庫測試
④網頁兼容性測試,包括不同瀏覽器下的現實結果、不同顯示器分辨率的頁面效果等。⑤需要的其他測試
4.網站維護
服務器及相關軟硬件的維護,對可能出現的問題進行評估,制定相應時間。數據庫維護。有效地利用數據是網站維護的重要內容,因此數據庫的維護要受到重視。
內容的更新、調整計劃。
制定相關網站維護的規定,將網站維護制度化、規范化。
4.1、靜態頁面的添加修改
靜態頁面的更新需要使用專業的網頁設計工具,然后將修改后的網頁通過FTP上傳到相應的位置,在此同時還要保證不能破壞其他的頁面程序和格局
4.2、動態功能支持在線更新
如果企業信息量很大,如工作信息經常需要更新,有更多的企業資訊需要告訴員工,企業建立動態數據庫系統。這里的動態并不是指動畫,而是指網站的內容來自企業的數據庫。如果更改了數據庫,那么前臺頁面的內容也會隨之而更改。
總 結
通過這次課程設計,我拓寬了知識面,鍛煉了能力,綜合素質得到較大提高。安排課程設計的基本目的,在于通過理論與實際的結合、人與人的溝通,進一步提高思想覺悟。尤其是觀察、分析和解決問題的實際工作能力,以便培養成為能夠主動適應社會主義現代化建設需要的高素質的復合型人才。作為整個學習體系的有機組成部分,課程設計雖然安排在一周進行,但并不具有絕對獨立的意義。它的一個重要功能,在于運用學習成果,檢驗學習成果。運用學習成果,把課堂上學到的系統化的理論知識,嘗試性地應用于實際設計工作,并從理論的高度對設計工作的現代化提出一些有針對性的建議和設想。檢驗學習成果,看一看課堂學習與實際工作到底有多大距離,并通過綜合分析,找出學習中存在的不足,以便為完善學習計劃,改變學習內容與方法提供實踐依據。對計算機專業的本科生來說,實際能力的培養至關重要,必須從課堂走向實踐。這也是一次預演和準備畢業設計工作。通過課程設計,讓我找出自身狀況與實際需要的差距,并在以后的學習期間及時補充相關知識,為求職與正式工作做好充分的知識、能力準備,從而縮短從校園走向社會的心理轉型期。課程設計促進了我系人才培養計劃的完善和課程設置的調整。在一個星期的課程設計之后,我感到不僅實際動手能力有所提高,更重要的是通過對網站開發流程以及維護方面的了解,進一步激發了我對專業知識的興趣,并能夠結合實際存在的問題在專業領域內進行更深入的學習。
在課程設計過程中,我學到了很多人生的哲理,懂得怎么樣去制定計劃,怎么樣去實現這個計劃,并掌握了在執行過程中怎么樣去克服心理上的不良情緒,黑夜過去了,我收獲的是黎明。
參考文獻
[1]朱兵.小型網組建與應用進階[M].南方出版社.2004.[2]鄧文達胡伏湘.計算機網絡教程[M].清華大學出版社.2007.[3] 趙永超.新編網站規劃與設計教程[M].西北工業大學出版社.2004.[4] 楊力學.ASP商業網站整站集成開發[M].電子工業出版社.2007.[5] 石志國.ASP動態網站編程[M].清華大學出版社.2001.[6] 李嵐.網絡設計與維護[M].中國物資出版社.2002.
第四篇:計算機網絡課程設計
計算機網絡課程設計
報告書
學院:
班級:通信0902
姓名:
學號:
指導老師:
實驗三 交換機VLAN實驗
SWITCH2的拓撲圖
規劃IP:
PCA的ip為:10.65.1.1
PCB的ip為:10.66.1.1
PCC的ip為:10.65.1.3
PCD的ip為:10.66.1.3
SWA:
SWB:
設置VLAN: SWA:
SWB:
不設trunk時測試可通性 從PCA到PCC測試:不通,因現在的連線兩端在VLAN1中,不能承載Vlan2的信息
[root@PCA root]# ping 10.65.1.3
從PCA到PCB測試:不通:不是一個網段,且不在一個VLAN [root@PCA root]# ping 10.66.1.1
從PCB到PCD測試:通:因為在同一網段內。路徑:從switch A的f0/6到switch B的f0/6 [root@PCB root]# ping 10.66.1.3
從PCA到SWA測試:不通:不在同一網段內
[root@PCA root]# ping 10.66.1.7
從PCA到SWB測試:不通:不在同一網段,也不在同一vlan [root@PCA root]# ping 10.66.1.8
從SWA到PCA測試:不通:不在同一網段
SWA#ping 10.65.1.1
從SWA到SWB測試:通:在同一個網段中,路徑:從switch A的f0/8到switch B的f0/1 SWB#ping 10.66.1.8
swa40#conf t swa40(config)#int f0/8 swa40(config-if)#switchport mode trunk swa40(config-if)#int f0/1 swa40(config-if)#switchport mode trunk swa40(config-if)#
從PCA到PCC、PCD、SWA、SWB的可通性依次為通,不通,不通,不通。
PCA和PCC在同一網段中,路徑:從switch A的f0/3到switch B的f0/3,PCA和PCD、SWA、SWB不在同一網段內。
從PCB到PCC、PCD、SWA、SWB的可通性依次為不通,通,通,通。PCB與PCC不在同一網段,PCB與PCD、SWA、SWB在同一網段內,路徑分別為從switch A的f0/6到switch B的f0/6;從PCB到switch A的f0/6;從switch A的f0/6到switch B的f0/1.SWITCH3的拓撲圖
(1)都不設vlan情況下,測試連通性
從PCA到PCC,PCD,SWA,SWB依次為 不通,不通,通,不通 PCA與PCC、PCD不在同一默認vlan中,PCA與SWA在同一默認vlan中,路徑:從PCA到switch A的f0/3,PCA與SWB不在同一默認vlan中。
從PCB到PCC,PCD,SWA,SWB依次為不通,不通,通,不通。PCB與PCC、PCD不在同一默認vlan中,PCB與SWA在同一默認vlan中,路徑:從PCB到switch A的f0/6,PCB與SWB不在同一默認vlan中。
(2)設置有vlan情況下,測試連通性
從PCA到PCC、PCB、SWA、SWB、PCD均不通:不在同一vlan
從PCB到PCC、PCD、SWA、SWB測試為不通,不通,通,不通。PCB與PCC、PCD不在同一默認vlan中,PCB與SWA在同一默認vlan中,路徑:從PCB到switch A的f0/6,PCB與SWB不在同一默認vlan中。
(3)使用trunk情況下,測試連通性
從PCA到PCC、PCD、SWA、SWB的可通性依次為不通,通,不通,不通。PCA與PCC、PCD不在同一默認vlan中,PCA與SWA在同一默認vlan中,路徑:從PCA到switch A的f0/3,PCA與SWB不在同一默認vlan中。
從PCB到PCC、PCD、SWA、SWB的可通性依次為通,不通,通,通。PCB到PCC設置了trunk,路徑:從switch A的f0/6到switch C的f0/1到switch B的f0/1,PCB與PCD不在同一vlan,PCB與SWA、SWB設置了trunk,路徑:從PCB到switch A的f0/6,從switch A的f0/6到switch C的f0/1到switch B的f0/1
實驗六 路由器接口的secondary ip 裝入圖文件:router1e
設置計算機的IP和網關:
PCA:PCA的IP地址:10.65.1.1 網關指向:10.65.1.2
PCB:PCB的IP地址:10.66.1.1 網關指向:10.66.1.2
設置交換機的IP地址: switch(config)#int vlan 1 switch(config-if)#ip address 10.66.1.8 255.255.0.0
設置路由器的接口f0/0的有兩個ip地址。roa(config)int f0/0
roa(config-if)#ip address 10.65.1.2 255.255.0.0 roa(config-if)#no shut roa(config-if)#ip address 10.66.1.2 255.255.0.0 secondary roa(config-if)#no shut roa#sh run
測試可通性
[root#PCA root]# ping 10.66.1.1
通:在同一網段,路徑:從switch的f0/3到f0/6
[root#PCA root]# ping 10.66.1.2 通
[root#PCB root]# ping 10.65.1.1
通:在同一vlan中,從switch的f0/6到f0/3
[root#PCB root]# ping 10.65.1.2
通
switch#ping 10.65.1.1
不通:不在同一網段
switch#ping 10.66.1.1
通:在同一網段,路徑:從switch的f0/6到PCB
如果去掉交換機與路由的連線,PCA和PCB還可以通嗎? 不通:不在同一網段,需通過路由尋址,去掉線就不能通了。
可見PCA到PCB的發包是經過路由器的,稱之為單臂路由。
這種情況PCA和PCB在同廣播域中,對工作帶寬不利。如果劃分VLAN可以隔離廣播 實驗七 使用路由器子接口路由情況
裝入圖文件:router1e
此實驗計算機和交換機的IP地址和網關不變,但要求交換機工作在兩個VLAN的情況下,一個是原有的默認VALN,另一個是新設置的VLAN 2,含f0/
5、f0/6。1.設置交換機,增加一個vlan 2 switch#vlan database Switch(vlan)#vlan 2 Switch(vlan)#exit Switch#conf t Switch(config)#hostname SWA SWA(config)#int f0/5 SWA(config-if)#switchport access vlan 2 SWA(config-if)#int f0/6 SWA(config-if)#switchport access vlan 2 SWA(config-if)#int f0/1 SWA(config-if)#switchport mode trunk SWA(config-if)#
2.路由器f0/0 有兩個子接口 roa(config)int f0/0 roa(config-if)#int f0/0.1 roa(config-subif.1)#encapsulation isl 1 roa(config-subif.1)#ip address 10.65.1.2 255.255.0.0 roa(config-subif.1)#no shut roa(config-subif.1)#int f0/0.2 roa(config-subif.2)#encapsulation isl 2 roa(config-subif.2)#ip address 10.66.1.2 255.255.0.0 roa(config-subif.2)#no shut roa#sh run
3.測試可通性:都通,路由器設置了兩個子接口,使其在同一vlan中 [root#PCA root]# ping 10.66.1.1
通,路徑:從PCA到switch A的S0/3到switch A的S0/1到ROA的F0/0到switch A的S0/1到switch A的S0/6到PCB
[root#PCA root]# ping 10.66.1.2
通:從PCA到switch A的S0/3到switch A的S0/1到ROA 的F0/0到switch A的S0/1到switch A的S0/6到PCB,)
[root#PCB root]# ping 10.65.1.1
通:從PCB到switch A的S0/6到switch A的S0/1到ROA的F0/0到switch A 的S0/1到switch A 的S0/3到PCA)
[root#PCB root]# ping 10.65.1.2
通:從PCB到switch A的S0/6到switch A的S0/1到ROA的F0/0到switch A的S0/1到switch A的S0/3到PCA
在使用一個路由器接口的情況下,如果下接的網絡含有不同的VLAN,則要求路由器的接口要劃分成子接口,并綁定isl協議。在交換機上通過多個VLAN的接口,要設置成trunk。如果去掉交換機與路由的連線,PCA和PCB還可以通嗎? 不通:不在同一網段,需通過路由尋址,去掉線就不能通了。
可見這也是一種單臂路由。
實驗九 三個路由器的靜態路由
裝入圖文件:router3
設置ROA的IP: f0/0: 10.65.1.2-->PCA:10.65.1.1 f0/1: 10.66.1.2-->PCB:10.66.1.1 s0/0: 10.67.1.2
s0/1: 10.68.1.2-->
設置ROB的IP:
s0/0: 10.68.1.1 <--s0/1: 10.69.1.2--> f0/0: 10.70.1.2
f0/1: 10.71.1.2
設置ROC的IP:
s0/0: 10.69.1.1 <--s0/1: 10.72.1.2
f0/0: 10.73.1.2-->PCC:10.73.1.1 f0/1: 10.74.1.2-->PCD:10.74.1.1
設置從PCA到PCC的靜態路由 ROA(config)#ip routing ROA(config)#ip route 10.73.0.0 255.255.0.0 10.68.1.1 ROA#show ip route
ROB(config)#ip route 10.73.0.0 255.255.0.0 10.69.1.1 ROB#show ip route
[root@PCA root]#ping 10.73.1.1
通:由于與ROA和ROC相連的ROB接口都在同一個網段上,所以能通,路徑:從PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD
使用默認路由
ROA(config)#no ip route 10.73.0.0 255.255.0.0 10.68.1.1 [root@PCA root]#ping 10.73.1.1
通:因為裝入文件時有默認的動態路由存在路徑:從PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD
ROA(config)#ip route 0.0.0.0.0.0.0.0 10.68.1.1 [root@PCA root]#ping 10.73.1.1 通:從PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD)
實驗十 三個路由器動態路由實驗
裝入圖文件:router3
實驗網絡與上個實驗相同,ip地址也不變,現在用動態路由實現網絡的連通。ROA(config)#ip routing
ROA(config)#router rip ROA(config-router)#network 10.0.0.0
ROB(config)#ip routing
ROB(config)#router rip ROB(config-router)#network 10.0.0.0
ROC(config)#ip routing
ROC(config)#router rip ROC(config-router)#network 10.0.0.0
ROA#sh ip route
ROB#sh ip route
ROC#sh ip route
從計算機PCA 測試到各點的連通性。都通:由于路由器接口都已經激活,可以相互連通:路徑:PCA到PCB:從PCA到switch B的F0/0 F0/1到PCB
PCA到PCC:從PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/0到PCC PCA到PCD :從PCA到switch B的F0/0 S0/1到switch A 的S0/0 S0/1到switch C的S0/0 F0/1到PCD
實驗十一 基本訪問控制列表
裝入文件1
1.配置路由達到網絡各點可通。
本實驗使用有動態路由,也可以使用靜態路由。假設網絡是通暢的。ROA f0/0: 10.65.1.2-->PCA:10.65.1.1 ROA f0/1: 10.66.1.2-->PCB:10.66.1.1 ROA s0/0: 10.67.1.2
ROA s0/1: 10.68.1.2--> ROB s0/0: 10.68.1.1 <--ROB s0/1: 10.69.1.2--> ROB f0/0: 10.70.1.2
ROB f0/1: 10.71.1.2
ROC s0/0: 10.69.1.1 <--ROC s0/1: 10.72.1.2 ROC f0/1: 10.73.1.2-->PCC:10.73.1.1 ROC f0/0: 10.74.1.2-->PCD:10.74.1.1 1.基本的訪問控制列表: 先從PCA ping PCD: [root@PCA @root]#ping 10.74.1.1 應該是可以通的。由于與ROA和ROC相連的ROB接口都在同一個網段上,路徑:從 PCA到switch B的F0/0 S0/1到switch A的S0/0 S0/1到switch C的S0/0 F0/1到PCD
在ROB的s0/0寫一個輸入的訪問控制列表: ROB(config)#access-list 1 deny any ROB(config)#int s0/0 ROB(config-if)#ip access-group 1 in ROB#sh access-list 測試PCA至PCD的聯通性。(deny)命令所示為S0/0讀入控制,題意ROB S0/0為10.68.1.1,PCA的IP為10.65,1,1不包含于ROB VLAN中,所以不能訪問
測試PCC至PCD的聯通性。(permit)在同一個路由器下,通過路由器尋址能找到對方的IP,所以能通, PCC到switch C的f0/0 F0/1到PCD
測試PCD至PCA的聯通性。(permit)由題意由于命令所示為S0/0讀入控制,所以ROB能訪問ROA,所以訪問列表設置無效,所以兩者之間的訪問不受控制,所以能PING通, 從PCD到SWC的F0/1 S0/0到SWA的S0/0 S0/0到SWB的S0/1 F0/0到PCA
2.刪除這個列表
ROB(config)#no access-list 1 ROB(config)# int s0/0 ROB(config-if)#no ip access-group 1 in
二者都可能實現去掉訪問列表的目的。前者是從列表號角度刪除,后者是從接口及輸入和輸出的角度刪除??梢酝ㄟ^sh run 和sh access-list 命令查看刪除情況。3.再寫訪問控制列表
ROA(config)#access-list 1 deny 10.65.1.1 ROA(config)#access-list 1 permit any ROA(config)#int s0/1 ROA(config-if)#ip access-group 1 out ROA#sh access-list
再測試PCA至PCD的聯通性。(deny)ROA設置拒絕了PCA的訪問
再測試PCB至PCD的聯通性。(permit)由題意ROA中的S0/1為10.68.1.2 PCB的IP為10.66.1.1,不包含于S0/1 VLAN中,由于命令所示為S0/0由于是輸出控制,能訪問,所以訪問列表設置無效,不加控制,所以能PING通, 從PCB到SWB的F0/1 S0/1到SWA 的S0/0 S0/1到SWC的S0/0 F0/1到PCD
再測試PCD至PCA的聯通性。(permit)由于是輸出控制,所以對輸入不做要求,能通,所以輸出訪問列表無效,對輸入不加控制,所以能PING通, 從PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA
4.重新設置各路由接口有電腦的ip地址。R0B(config)#access-list 4 permit 10.65.1.1 ROB(config)#access-list 4 deny 10.65.1.0 0.0.0.255
(10.65.1.3 deny)ROB(config)#access-list 4 permit 10.65.0.0 0.0.255.255(10.65.0.0 permit)ROB(config)#access-list 4 deny 10.0.0.0 0.255.255.255
(10.66.0.0 deny)ROB(config)#access-list 4 permit any
(11.0.0.0 premit)ROB(config)#int s0/0 ROB(config-if)#ip access-group 4 in
測試PCA至PCD的聯通性。(deny)PCA的IP為10.65.1.1按理來說應該所有的訪問都允許,由于命令所示為S0/0讀入控制,題意ROB S0/0為10.68.1.1,PCA的IP為10.65,1,1不包含于ROB VLAN中所以不通
測試PCB至PCD的聯通性。(permit)P CB的IP為10.66.1.1屬于deny 10.0.0.0 0.255.255.255,所以訪問被拒絕,所以PING不通
測試PCD至PCA的聯通性。(permit)PCD的IP為10.74.1.1屬于deny 10.0.0.0 0.255.255.255,按理來說應該是拒絕的,但是DENY屬于源程序拒絕訪問,而PCD先到S0/1,在通過S0/1與S0/0進行信息傳遞,所以能到達PCA,所以設置讀入列表參數無效,對PCD不做限制, 從PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA
接口的ip地址,計算機的ip地址,請自定
實驗十二 擴展訪問控制列表
裝入文件2 1.阻止PCA訪問PCD: ROB(config)# access-list 101 deny icmp 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0 ROB(config)# access-list 101 permit ip any any ROB(config)# int s0/0 ROB(config-if)#ip access-group 101 out ROB(config-if)#exit ROB(config)#exit ROB#sh access-list
[root@PCA root]#ping 10.74.1.1(不通)PCA的IP為10.65.1.1屬于deny ip 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0,所以PING 不通
[root@PCC root]#ping 10.74.1.1(通)PCC和PCD處在同一個路由器下,通過路由器尋址可以相互PING通,從PCC到SWC的F0/0-F0/1到PCD
[root@PCD root]#ping 10.65.1.1(通)因為ROB的S0/0為輸出控制,所以當PCD通過外部訪問ROB某個端口下的PCA時,是不受控制的,所以ROB的S0/0的輸出對PCD的訪問是無效的,所以鏈路不加限制,從 PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA
2.刪除這個列表
ROB(config)#no access-list 101 ROB(config)#int s0/0 ROB(config-if)#no ip access-group 101 ROB#sh access-list
[root@PCA root]#ping 10.74.1.1(通)由于沒有任何限制,再加上路由器間的尋址,所以可以PING通, 從PCA到SWB的F0/0-S0/1到SWA的S0/0-S0/1到SWC的S0/0-F0/1到PCD
3.阻止10.65.0.0網絡訪問 10.74.1.1計算機(PCD)。
ROA(config)#access-list 102 deny ip 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0 ROA(config)#access-list 102 permit ip any any ROA(config)#interface s0/1 ROA(config-if)#ip access-group 102(默認為out)
[root@PCA root]#ping 10.74.1.1(不通)PCA的IP屬于 DENY IP 10.65.1.1 0.0.0.0 10.74.1.1 0.0.0.0 被限制訪問,所以不通
[root@PCC root]#ping 10.74.1.1(通)由于PCC和PCA在同一個路由器下,所以能通過路由器尋址進行PING通, 從PCC到SWC的F0/0-F0/1到PCD
[root@PCD root]#ping 10.65.1.1(通)由于ROA的S0/0為輸出控制,所以對輸入沒有任何要求,所以對輸出控制列表設置無效,PCD訪問PCA不受限制, 從PCD到SWC的F0/1-S0/0到SWA的S0/0-S0/0到SWB的S0/1-F0/0到PCA
心得體會
從實驗三中學會了如何規劃ip地址,設置vlan,將連接兩個交換機的接口設置成trunk等,知道了寫代碼時一定得仔細,否則打錯了下面就不能ping通了。
從實驗六中,我學會了設置計算機和交換機的IP和網關,設置路由器的接口的ip地址等。
從實驗七中,我學會了設置交換機,增加一個vlan,設置路由器的子接口,了解了isl協議,isl協議:交換鏈路內協議(ISL),是思科私有協議,主要用于維護交換機和路由器間的通信流量等 VLAN 信息。ISL 主要用于實現交換機、路由器以及各節點(如服務器所使用的網絡接口卡)之間的連接操作。為支持 ISL 功能特征,每臺連接設備都必須采用 ISL 配置。ISL 所配置的路由器支持 VLAN 內通信服務。非 ISL 配置的設備,則用于接收由 ISL 封裝的以太幀(Ethernet Frames),通常情況下,非 ISL 配置的設備將這些接收的幀及其大小歸因于協議差錯。
從實驗九中,我學會了設置靜態路由。
從實驗十中,我學會了用動態路由實現網絡的連通。從實驗十一中,我學會了基本訪問控制列表的使用。從實驗十二中,我學會了如何擴展訪問控制列表。
最后,謝謝老師這幾天的指導,真的讓我學到了很多很多。
第五篇:計算機網絡課程設計
計算機網絡課程設計——IP數據報流量統計
摘 要
本課程設計主要是編制程序,監控網絡,捕獲一段時間內網絡上的IP數據包,按IP數據包的源地址統計出該源地址在該時間段內發出的IP包的個數,將其寫入日志文件中或用圖形表示出來。程序中會用到Winpcap,它主要功能在于獨立于主機協議發送和接收原始數據報。本次課程設計中用VC++實現基于Winpcap的網絡數據包的捕獲和統計,基于Winpcap的應用程序將根據獲取網絡設備列表;選擇網卡并打開;設置過濾器;捕獲數據包或者發送數據包;列出網卡列表,讓用戶選擇可用的網卡的步驟進行編寫,同時對于TCP/IP協議以及IP數據抱的格式有了進一步的了解和掌握。通過編寫程序從而實現對網絡中IP數據包流量的統計。
關鍵詞: IP數據包;流量統計;Winpcap;VC++ 1 引 言
隨著Internet技術的發展,基于IP協議的應用成為網絡技術研究與軟件開發的一個重要基礎,因此學習網絡層以基本概念,了解IP協議的基本內容,對于掌握TCP/IP協議的主要內容和網絡課程的學習是十分重要的,通過本次課程設計,有助于熟悉IP數據包格式并加深對IP協議的理解。
1.1 課程設計目的
本次課程設計主要是通過用VC++編程實現對網絡中IP數據包流量的統計,實際上是編制程序,監控網絡,捕獲一段時間內網絡上的IP數據包,按IP數據包的源地址統計出該源地址在該時間段內發出的IP包的個數,同時應用Winpcap,Winpcap提供了很好的捕獲網絡數據包的方法,通過本次課程設計可以將VC++知識與Winpcap結合起來實現在一段時間內對IP數據包的流量進行統計。加深了對Winpcap的理解和運用能力,同時也增長了知識,開闊了視野,對于以后的學習有很大的幫助。
1.2 課程設計的要求
(1)理解運用VC++軟件實現對網絡中的IP數據抱流量的統計方法和步驟。(2)鍛煉獨立編程和查閱文獻資料解決問題的能力。
(3)通過課程設計培養嚴謹的科學態度,認真的工作作風。
1.3 設計平臺
Microsoft Visual C++ 6.0 2 設計原理
IP是ICP/IP協議體系中的網絡層協議,TCP、UDP、ICMP和IGMP等其他協議都是以IP協議為基礎的。程序中用到的Winpcap是 Windows packetcapture的縮寫,這是UNIX下的lipbcap移植到Windows下的產物,是Win32環境下數據包捕獲的開放代碼函數庫。
Winpcap由內核級的數據包過濾器,底層動態鏈接庫(packet.dll)和一個高層的獨立于系統的庫(wpcap.dll)組成。
2.1 IP協議
IP是TCP/IP模型中的網絡層協議,又稱為互聯網協議,是支持網間互連的數據報協議,它與TCP協議一起構成了TCP/IP協議族的核心。它提供網間連接的完善功能,包括IP數據報規定互聯網范圍內的IP地址格式。在因特網中IP協議是能使連接到網上的所有計算機網絡實現相互通信的一套規則,規定了計算機在因特網上進行通信時應當遵守的規則。任何廠家生產的計算機系統,只要遵守IP協議就可以與因特網互連互通。IP地址具有唯一性,根據用戶性質的不同,可以分為不同的類別。
IP協議的特點如下:
IP協議是一種不可靠、無連接的數據報傳送協議。IP協議是點對點的網絡層通信協議。IP協議向通信層隱藏了物理網絡的差異。
IP協議以一種數據報的形式傳輸數據,每個數據報獨立傳輸,可能通過不同路徑傳輸,因此可能不按順序到達目的地,或者出現重復。
2.2 關于Winpcap庫
Winpcap(windows packet capture)是windows平臺下一個開源的、公共的基于windows的網絡接口API庫。主要為win32應用程序提供訪問網絡底層的能力。Winpcap的主要功能在于獨立于主機協議(如TCP/IP)發送和接收原始數據報。也就是說,Winpcap不能阻塞、過濾或控制其他應用程序數據報的收發,它只是監聽共享網絡上傳送的數據報。
其功能有:捕獲原始數據包,包括在共享網絡上各主機發送接收的以及相互之間交換的數據包;在數據包發往應用程序之前,按照自定義的規則將某些特殊的數據包過濾掉;在網絡上發送原始數據包;收集網絡通信過程中的統計信息。Winpcap是針對win32平臺上的抓包和網絡分析的一個架構,它包括一個核心態的包過濾器,一個底層的動態鏈接庫(packet.dll)和一個高層的不依賴于系統的庫(wpcap.dll)。它由Packet、NPF(Netgroup Packet Filter)、packet.dll、wpcap.dll、Application組成,首先,抓包系統必須繞過操作系統的協議來訪問在網絡上傳輸的原始數據包,這就要求一部分運行在操作系統核心內部,直接與網絡接口驅動交互。這個部分是系統依賴的,在Winpcap的解決方案里它被認為是一個設備驅動,稱作NPF。其次,抓包系統必須有用戶級的程序接口,通過這些接口,用戶程序可以利用內核驅動提供的高級特性。Winpcap提供了兩個不同的庫:packet.dll和wpcap.dll。前者提供了一個底層API,伴隨著一個獨立于Microsoft操作系統的編程接口,這些API可以直接用來訪問驅動的函數;后者導出了一組更強大的與libpcap一致的高層抓包函數庫。這些函數使得數據包的捕獲以一種與網絡硬件和操作系統無關的方式進行。3 程序代碼設計步驟
根據流量設計程序的主要功能,相應的算法如下: 取得當前網絡設備列表;
將用戶選擇的網卡以混雜模式打開,以接收到所有的數據包; 設置過濾器;
捕獲IP數據包的源地址進行統計(用鏈表結構進行實現)。
獲取網卡列表是為了得到網卡的相關信息,以便于用戶進行選擇,選取Ethermet網卡是用戶所選擇的網卡類型,編譯設置過濾器是為了編譯并設置過濾器是為了只捕獲網絡數據流的某些數據,打開網卡既將網卡設置為混雜(統計)模式是為了接受所有經過網卡的數據包,包括不是發給本機的數據包,開始主循環以是否超時為判斷條件,循環體內主要有捕獲IP數據包、將IP包的源地址加入鏈表、條件判斷,循環結束后輸出鏈表內容,程序至此結束。
現將其每一步的具體步驟簡述如下:
3.1取得網絡適配器列表
//取得網絡適配器列表步驟中,alldevs是pcap_if_it指針,指向鏈表頭,errbuf是char類型數組,存儲錯誤信息。
pcap_findalldevs(&alldevs,errbuf);
cout<<”網絡適配器列表:”<<’n’;
for(d=alldevs;d;d=d->next)
{
cout<<++i<<“:” if(d->description) cout<<“" else cout<<”No description available!“<<'n'; } 3.2 指定要監聽的網絡適配器并打開 cout<<”輸入要監聽的網絡適配器號:” for(d=alldevs,i=0;inext,i++); fp=pcap_open_live(d->name,65536,1,1000,errbuf);3.3 編譯并設置過濾器 //編譯過濾器,fp指向打開的網絡適配器,fcode為編譯完成后的過濾器存儲地址,“tcp“給出了過濾條件,下一個參數表示是否被優化(0為false,1為true),最后一個參數給出了子網掩碼。 pcap_compile(fp,&fcode,”tcp”,1,netmask) pcap_setfilter(fp,&fcode)3.4 設置網絡適配器為統計模式 if(pcap_setmode(fp,MODE_STAT)<0) { cout<<”n設置網絡適配器模式錯誤!n”; pcap_close(fp); } 3.5 開始主循環,調用回調函數顯示網絡流量統計信息 //pcap_loop由Winpcap庫定義,對每個采集來的數據包都用ProcessPacket函數進行處理,fp指向打開的網絡適配器 pcap_loop(fp,0,dispatcher_handler,(PUCHAR)&st_ts); pcap_close(fp);3.6 回調函數的實現 //對于捕獲到的每一個數據包應用此回調函數 void dispatcher_handler(u_char *state,const struct pcap_pkthdr *header,const u_char *pkt_data) { struct timeval *old_ts=(struct timeval *)state; u_int delay; LARGE_INTEGER Bps,Pps; struct tm *ltime; char timestr[16]; time_t local_tv_sec; //計算距上一個數據包的時間延遲,以ms為單位 //這個值是從與一個數據包相關的時間戳中截獲的delay=(header->ts.tv_sec-old_ts->tv_sec)*1000000-old_ts->tv_usec+header->ts.tv_usec; //獲得每秒的比特數 Bps.QuadPart=(((*(LONGLONG*)(pkt_data+8))*8*1000000)/(delay)); //獲得每秒的數據包數 Pps.QuadPart=(((*(LONGLONG*)(pkt_data))*1000000)/(delay)); //將時間戳轉變位可讀的標準格式 ltime=localtime(&header->ts.tv_sec); strftime(timestr,sizeof timestr,”%H:%M:%S“,ltime); //Print timestamp printf(”%s“,timestr); //Print the samples printf(”BPS=%I64u“,Bps.QuadPart); printf(”PPS=%I64un",Pps.QuadPart); //store current timestamp old_ts->tv_sec=header->ts.tv_sec; old_ts->tv_usec=header->ts.tv_usec; };4 結果及分析 安裝好WinPcap軟件,在VC++界面上點擊工具->選項->目錄。添加Include文件夾下的所有文件和Lib下的所有內容,調試完程序無誤后,點擊開始—>運行“cmd”進入目標文件夾Debug下運行EXE文件。此時程序會檢測電腦系統中的網卡,等待程序的運行結果.圖 捕獲的IP地址和數據包的信息 常見問題及解決方法 在剛開始做此課程設計的時候我只編寫了主程序代碼,并沒有建立工程,后來通過查找資料及文獻才知道要建立一個C++應用工程,而且程序中用到的Winpcap庫文件C++中并沒有,需要自己下載WinPcap_4_1_1.exe和WpdPack_4_1_1.zip,前者是Winpcap的開發程序,后者是inlude文件和lib文件,這些都是需要自己手動添加的,這里include和lib文件夾里的東西VC++6.0里面沒有,出現error: Cannot open include file:’pcap.h’:No such file or directory這個問題,就需要添加。具體步驟如下: 第一步: 點菜單欄上的“工具“,再點擊下拉菜單中的”選項“對話框把winpcap開發包里面的lib文件添加進去。 第二步: 點擊菜單欄里的工程——設置,選擇連接在對象/庫模塊中輸入wpcap.lib和packet.lib,再點C/C++ 在“預處理程序定義”下輸入WPCAP和HAVE_REMOTE,要用逗號隔開。 至此,Winpcap環境已部署好了不會再出錯了。 接下來出錯的是程序中的一些函數的參數,比如說int pcap_compile(pcap_t *p, struct bpf_program *fp,char *str,int optimize, bpf_u_int32 netmask),int pcap_setfilter(pcap_t *p, struct bpf_program *fp)函數的參數在程序編譯的時候會報錯,通過搜集資料及與同學交流初步更正了錯誤,但是程序并不是很順利地運行出來。