畢業(yè)設(shè)計(jì)基于ICMP模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊論文_第1頁(yè)
畢業(yè)設(shè)計(jì)基于ICMP模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊論文_第2頁(yè)
畢業(yè)設(shè)計(jì)基于ICMP模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊論文_第3頁(yè)
畢業(yè)設(shè)計(jì)基于ICMP模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊論文_第4頁(yè)
畢業(yè)設(shè)計(jì)基于ICMP模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊論文_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、畢畢 業(yè)業(yè) 設(shè)設(shè) 計(jì)計(jì)( 論論 文文)基于基于 icmp 模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊控制管理模塊論論文作者姓名:文作者姓名:申申請(qǐng)請(qǐng)學(xué)位學(xué)位專(zhuān)業(yè)專(zhuān)業(yè): :申申請(qǐng)請(qǐng)學(xué)位學(xué)位類(lèi)別類(lèi)別: :指指導(dǎo)導(dǎo)教教師師姓姓名名( (職職稱(chēng)稱(chēng)) ): :論論文提交日期:文提交日期:基于基于 icmp 模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)控制管理模塊控制管理模塊摘摘 要要隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)通信已經(jīng)越來(lái)越重要。而網(wǎng)絡(luò)通信的實(shí)現(xiàn),必然離不開(kāi)網(wǎng)絡(luò)協(xié)議。網(wǎng)絡(luò)協(xié)議是一套傳遞信息、管理信息的規(guī)則。通過(guò)這套規(guī)則,計(jì)算機(jī)之間才能相互通信。目前,一些起到平臺(tái)作用的通信協(xié)議已趨于完善,如 t

2、cp、udp 和 icmp 等。它們是以 ip 數(shù)據(jù)包為載體(ip 頭+tcp/udp/icmp 頭+數(shù)據(jù))的??刂乒芾砟K的主要目標(biāo)是管理和發(fā)送控制信息,在 icmp 協(xié)議的基礎(chǔ)上,模擬出一套自定義的規(guī)則,用于實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)控制。具體實(shí)現(xiàn)是通過(guò) vc 6.0 創(chuàng)建一個(gè)對(duì)話框工程,并采用 raw socket 技術(shù)完成 icmp 數(shù)據(jù)包的發(fā)送和接收,以 icmp 的數(shù)據(jù)部分作為本協(xié)議實(shí)現(xiàn)的載體,即 ip 頭+icmp 頭+數(shù)據(jù)(自定義的簡(jiǎn)單協(xié)議)的數(shù)據(jù)包形式實(shí)現(xiàn)不同計(jì)算機(jī)之間的通信,從而達(dá)到網(wǎng)絡(luò)控制的目的。通過(guò)測(cè)試,該模塊實(shí)現(xiàn)了控制信息的管理和發(fā)送。關(guān)鍵詞:關(guān)鍵詞:icmp;raw socke

3、t;網(wǎng)絡(luò)協(xié)議;數(shù)據(jù)包the controlling and management software module development of simulating network control based on icmpabstractwith the advance of network technique, internet communication is becoming more and more important. however, it can not be realized without network protocol, which is a set of rules

4、 for transmitting and managing information. through these rules, each computer can communicate with each other. at present, a lot of basal protocols have been nearly perfect, such as tcp、udp、icmp, which are based on the ip packets (ip head + tcp/udp/icmp head + data). the main task of control module

5、 is to manage and send the control information, which is to simulate a set of self user-defined rules and realize simple network control on the basic of icmp protocol. the concrete realization is that we first establish a dialog-box project through vc 6.0, and then use raw socket technology to compl

6、ete the sending and receiving of icmp packets whose data part can be used as the carrier helping realize the protocol. it means that we can use the form of ip head + icmp head + data (simple user-defined protocol) to realize the correspondence among different computers to achieve the goal of net-con

7、trolling. through the test, the module has realized the management and transmission of control information. key words:icmp; raw socket; network protocol; data packet 目目 錄錄論文總頁(yè)數(shù):24 頁(yè)1引言.11.1課題背景.11.2國(guó)內(nèi)外研究現(xiàn)狀.11.3本課題研究的意義.11.4本課題的研究方法.22tcp/ip 概述 .22.1概念.22.2tcp/ip 分層結(jié)構(gòu).22.3數(shù)據(jù)封裝格式.33icmp 概述 .43.1icmp 介

8、紹.43.2icmp 報(bào)文格式.53.3icmp 報(bào)文的類(lèi)型.53.4icmp 的重要性簡(jiǎn)介.74網(wǎng)絡(luò)套接字.74.1套接字概述.74.2winsock中的幾個(gè)基本概念.94.2.1winsock.94.2.2阻塞和非阻塞.94.2.3字節(jié)順序.94.2.4客戶(hù)機(jī)/服務(wù)器模型.94.3winsock編程原理.104.3.1winsock 的啟動(dòng)和終止 .104.3.2錯(cuò)誤檢查和控制.114.3.3winsock 編程模型 .115控制協(xié)議的模擬實(shí)現(xiàn).155.1課題的具體要求.155.2課題的實(shí)現(xiàn)重點(diǎn).155.3可視化界面的具體實(shí)現(xiàn).165.3.1思考過(guò)程.165.3.2幾種控件的具體實(shí)現(xiàn).16

9、5.4icmp 類(lèi)的核心實(shí)現(xiàn).175.4.1在工程文件中插入 icmp,編寫(xiě) ip 和 icmp 頭結(jié)構(gòu) .175.4.2對(duì) winsock 進(jìn)行初始化.185.4.3創(chuàng)建一個(gè)原始套接字,填充地址結(jié)構(gòu).185.4.4填充數(shù)據(jù).195.4.5發(fā)送控制信息.195.5工程文件的組成.195.6控制協(xié)議的簡(jiǎn)單設(shè)計(jì).195.7模擬環(huán)境.205.7.1硬件環(huán)境.205.7.2軟件環(huán)境.205.8操作過(guò)程.20結(jié) 論.22參考文獻(xiàn).22致 謝.23聲 明.24第 1 頁(yè) 共 24 頁(yè)1 1 引言引言1.11.1 課題背景課題背景隨著科學(xué)技術(shù)的飛速發(fā)展,21 世紀(jì)的地球人已經(jīng)生活在信息時(shí)代。20 世紀(jì)人類(lèi)兩

10、大科學(xué)技術(shù)成果計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù),均已深入到人類(lèi)社會(huì)的各個(gè)領(lǐng)域,internet 把“地球村”的居民緊密聯(lián)系在一起, “天涯若比鄰”已然成為現(xiàn)實(shí)?;ヂ?lián)網(wǎng)之所以能迅速蔓延,被世人接受,是因?yàn)樗邆涮赜械男畔?lái)源。近年來(lái) internet 的迅速發(fā)展,給人們的日常生活帶來(lái)了全新的感受, “網(wǎng)絡(luò)生存”已經(jīng)成為時(shí)尚,同時(shí)人類(lèi)社會(huì)諸如政治、科研、經(jīng)濟(jì)、軍事等各種活動(dòng)對(duì)信息網(wǎng)絡(luò)的依賴(lài)程度已經(jīng)越來(lái)越強(qiáng), “網(wǎng)絡(luò)經(jīng)濟(jì)”時(shí)代已初露端倪。1.21.2 國(guó)內(nèi)外研究現(xiàn)狀國(guó)內(nèi)外研究現(xiàn)狀ping 命令早已是耳熟能詳?shù)臋z查網(wǎng)絡(luò)暢通的得力方法之一,但是 ping 命令是來(lái)自于哪個(gè)網(wǎng)絡(luò)層次的哪個(gè)協(xié)議,就不是每個(gè)人能說(shuō)得上的了

11、。其實(shí),ping命令就是 icmp 協(xié)議的一個(gè)重要應(yīng)用,traceroute 命令也是。icmp 協(xié)議是一個(gè)非常重要的協(xié)議,它對(duì)于網(wǎng)絡(luò)安全、網(wǎng)絡(luò)的正常運(yùn)作具有極其重要的意義。它被用于在 ip 主機(jī)、路由器之間傳遞控制消息,如網(wǎng)絡(luò)通不通、主機(jī)是否可達(dá)、路由是否可用等。這些控制信息雖然并不傳輸用戶(hù)數(shù)據(jù),但是對(duì)于用戶(hù)數(shù)據(jù)的傳遞起著重要的作用。而且,icmp 協(xié)議本身的特點(diǎn)又決定了它非常容易被用于攻擊網(wǎng)絡(luò)上的路由器和主機(jī),造成 cpu 疲與奔命,系統(tǒng)癱瘓,主機(jī)死機(jī)。1.31.3 本課題研究的意義本課題研究的意義網(wǎng)絡(luò)經(jīng)濟(jì)的發(fā)展自然離不開(kāi)網(wǎng)絡(luò),而網(wǎng)絡(luò)的發(fā)展更離不開(kāi)網(wǎng)絡(luò)協(xié)議。協(xié)議本.質(zhì)上是一套行為規(guī)則,這些

12、規(guī)則也許是非書(shū)面形式的,但卻是人們?cè)谑褂弥姓J(rèn)為是正確而接受的。由于環(huán)境和文化的原因,行為規(guī)則有些細(xì)微差別。有些行為規(guī)則是寫(xiě)在紙上的,例如交通規(guī)則。但由于國(guó)家和地區(qū)的不同,交通規(guī)則的差異也很大。例如,在中國(guó),黃色交通信號(hào)意味著“當(dāng)心,準(zhǔn)備停車(chē)” 。但是在德國(guó),同樣的黃色交通信號(hào)卻表示“準(zhǔn)備,燈就要變成綠色了” 。類(lèi)似地,當(dāng)兩臺(tái)或更多臺(tái)計(jì)算機(jī)需要通信時(shí),它們也要有行為規(guī)則和書(shū)寫(xiě)與傳送信息的習(xí)慣。就像世界各地的人們?cè)诓煌牡貐^(qū)講不同的語(yǔ)言一樣,計(jì)算機(jī)也需要“講”特定的網(wǎng)絡(luò)語(yǔ)言即“協(xié)議” 。如果一個(gè)計(jì)算機(jī)不能使用某個(gè)協(xié)議,它就不能與使用那個(gè)協(xié)議的計(jì)算機(jī)通信。網(wǎng)絡(luò)里面充斥著各種協(xié)議。一臺(tái)計(jì)算機(jī)需要準(zhǔn)確地

13、知道信息在網(wǎng)絡(luò)里以什么形式傳遞,從而確保信息到達(dá)正確的地方。它需要知道網(wǎng)絡(luò)預(yù)計(jì)的信息格式(例如,信息的哪一部分是數(shù)據(jù),哪一部分用于制定接收方的地址;只有這樣,網(wǎng)絡(luò)才能將數(shù)據(jù)順利地傳遞至目的地。就像上面提到的交通規(guī)則,我們可以稱(chēng)之為十字路口的公路交通協(xié)議,這種協(xié)議可以確保車(chē)輛的安全通過(guò)。第 2 頁(yè) 共 24 頁(yè)1.41.4 本課題的研究方法本課題的研究方法使用 vc 6.0,建立一個(gè)工程來(lái)實(shí)現(xiàn) icmp 數(shù)據(jù)包的發(fā)送和接收,用 icmp 的數(shù)據(jù)部分作為本協(xié)議實(shí)現(xiàn)的載體,即用 ip 頭+icmp 頭+數(shù)據(jù)(自己設(shè)計(jì)的簡(jiǎn)單協(xié)議)的數(shù)據(jù)包形式實(shí)現(xiàn)不同機(jī)器之間的網(wǎng)絡(luò)通信而達(dá)到網(wǎng)絡(luò)控制的目的。具體的網(wǎng)絡(luò)通

14、信編程使用的是 raw socket 即原始套接字編程。2 2tcp/iptcp/ip 概述概述2.12.1 概念概念tcp/ip(transmission control protocol/internet protocol 的簡(jiǎn)寫(xiě),中文譯名為傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議)協(xié)議是 internet 最基本的協(xié)議,簡(jiǎn)單地說(shuō),就是由底層的 ip 協(xié)議和 tcp 協(xié)議組成的。tcp/ip 是網(wǎng)絡(luò)中使用的基本的通信協(xié)議。雖然從名字上看 tcp/ip 包括兩個(gè)協(xié)議,傳輸控制協(xié)議(tcp)和網(wǎng)際協(xié)議(ip),但 tcp/ip 實(shí)際上是一組協(xié)議,它包括上百個(gè)各種功能的協(xié)議,常用的如:http 協(xié)議、ftp

15、協(xié)議、telnet 協(xié)議等,而 tcp 協(xié)議和 ip 協(xié)議是保證數(shù)據(jù)完整傳輸?shù)膬蓚€(gè)最基本的協(xié)議。通常說(shuō)的 tcp/ip 是 internet 協(xié)議族,而不單單是 tcp 和 ip。tcp/ip 是用于計(jì)算機(jī)通信的一組協(xié)議,我們通常稱(chēng)它為 tcp/ip 協(xié)議族。它是 70 年代中期美國(guó)國(guó)防部為其 arpanet 廣域網(wǎng)開(kāi)發(fā)的網(wǎng)絡(luò)體系結(jié)構(gòu)和協(xié)議標(biāo)準(zhǔn),以它為基礎(chǔ)組建的 internet 是目前國(guó)際上規(guī)模最大的計(jì)算機(jī)網(wǎng)絡(luò),正因?yàn)閕nternet 的廣泛應(yīng)用,使得 tcp/ip 成了事實(shí)上的標(biāo)準(zhǔn)。2.22.2 tcp/iptcp/ip 分層結(jié)構(gòu)分層結(jié)構(gòu)網(wǎng)絡(luò)協(xié)議通常分不同層次進(jìn)行開(kāi)發(fā),每一層分別負(fù)責(zé)不同的

16、通信功能。一個(gè)協(xié)議族,比如 tcp/ip,是一組不同層次上的多個(gè)協(xié)議的組合。tcp/ip 通常被認(rèn)為是一個(gè)四層協(xié)議系統(tǒng),應(yīng)用層,運(yùn)輸層,網(wǎng)絡(luò)層,鏈路層。下面簡(jiǎn)單介紹各層的主要功能和主要協(xié)議,它們的工作關(guān)系如圖 2-1 所示。1)鏈路層,有時(shí)也稱(chēng)作數(shù)據(jù)鏈路層或網(wǎng)絡(luò)接口層,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序和計(jì)算機(jī)中對(duì)應(yīng)的網(wǎng)絡(luò)接口卡。它們一起處理與電纜(或其它任何傳輸媒介)的物理接口細(xì)節(jié)。2)網(wǎng)絡(luò)層,有時(shí)也稱(chēng)作互聯(lián)網(wǎng)層,處理分組在網(wǎng)絡(luò)中的活動(dòng),例如分組的選路。在 tcp/ip 協(xié)議族中,網(wǎng)絡(luò)層協(xié)議包括 ip 協(xié)議,icmp 協(xié)議,以及 igmp協(xié)議。3)運(yùn)輸層主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通

17、信。在 tcp/ip 協(xié)議族中,有兩個(gè)互不相同的協(xié)議:tcp(傳輸控制協(xié)議)和 udp(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)。tcp 為兩臺(tái)主機(jī)提供可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送第 3 頁(yè) 共 24 頁(yè)用戶(hù)進(jìn)程用戶(hù)進(jìn)程用戶(hù)進(jìn)程用戶(hù)進(jìn)程tcpudpiparp硬件接口rarpicmpigmp傳輸層應(yīng)用層網(wǎng)絡(luò)層鏈路層圖 2-1 tcp/ip 各層協(xié)議工作關(guān)系最后確認(rèn)分組的超時(shí)時(shí)鐘等。由于運(yùn)輸層高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面,udp 則為應(yīng)用層提供一種非常簡(jiǎn)單的服務(wù)。它只是把稱(chēng)作數(shù)據(jù)報(bào)的分組從一臺(tái)主機(jī)發(fā)

18、送到另一臺(tái)主機(jī),但并不保證該數(shù)據(jù)報(bào)能達(dá)到另一端。任何必須的可靠性必須由應(yīng)用層來(lái)負(fù)責(zé)。4)應(yīng)用層負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)。幾乎各種不同的 tcp/ip 實(shí)現(xiàn)都會(huì)提供下面這些通用的應(yīng)用程序:telnet 遠(yuǎn)程登陸;ftp 文件傳輸協(xié)議;smtp 簡(jiǎn)單郵件傳送協(xié)議;snmp簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議。2.32.3 數(shù)據(jù)封裝格式數(shù)據(jù)封裝格式當(dāng)應(yīng)用程序用 tcp 傳送數(shù)據(jù)時(shí),數(shù)據(jù)被送入?yún)f(xié)議棧中,然后逐個(gè)通過(guò)每一層直到被當(dāng)作一串比特流送入網(wǎng)絡(luò)。其中每一層對(duì)收到的數(shù)據(jù)都要增加一些首部信息。(有時(shí)還要增加尾部信息),該過(guò)程如圖 2-2 所示。tcp 傳給 ip 的數(shù)據(jù)單元稱(chēng)作 tcp 報(bào)文段或簡(jiǎn)稱(chēng)為 tcp 段(tc

19、p segment)。ip 傳給網(wǎng)絡(luò)接口層的數(shù)據(jù)單元稱(chēng)作 ip 數(shù)據(jù)報(bào)(ip datagram)。通過(guò)以太網(wǎng)傳輸?shù)谋忍亓鞣Q(chēng)作幀(frame)。封裝過(guò)程如圖 2-2 所示。第 4 頁(yè) 共 24 頁(yè)應(yīng)用程序iptcp以太網(wǎng)驅(qū)動(dòng)程序以太網(wǎng)尾部以太網(wǎng)首部ip 首部tcp 首部應(yīng)用數(shù)據(jù)ip 首部tcp 首部應(yīng)用數(shù)據(jù)tcp 首部用戶(hù)數(shù)據(jù)應(yīng)用數(shù)據(jù)appl首部用戶(hù)數(shù)據(jù)以太網(wǎng)幀圖 2-2 數(shù)據(jù)進(jìn)入?yún)f(xié)議棧時(shí)的封裝過(guò)程ip 數(shù)據(jù)報(bào)tcp 段以太網(wǎng)3 3icmpicmp 概述概述3.13.1 icmpicmp 介紹介紹icmp(internet control message protocol)internet 控制

20、報(bào)文協(xié)議是一個(gè)非常重要的協(xié)議,它對(duì)于網(wǎng)絡(luò)安全具有極其重要的意義。icmp 消息是隨 ip 數(shù)據(jù)報(bào)一起傳輸?shù)模撓⒈旧硪彩桥c ip 協(xié)議并行運(yùn)行在網(wǎng)絡(luò)層的協(xié)議。它是tcp/ip 協(xié)議族的子協(xié)議,用于在 ip 主機(jī)、路由器之間傳遞控制消息??刂菩畔⑹侵妇W(wǎng)絡(luò)通不通、主機(jī)是否可達(dá)、路由是否可用等網(wǎng)絡(luò)本身的消息。這些控制消息雖然并不傳輸用戶(hù)數(shù)據(jù),但是對(duì)于用戶(hù)數(shù)據(jù)的傳遞起著重要的作用。它傳遞差錯(cuò)報(bào)文以及其它需要注意的信息。我們?cè)诰W(wǎng)絡(luò)中經(jīng)常會(huì)使用到 icmp 協(xié)議,只不過(guò)我們察覺(jué)不到而已。比如我們經(jīng)常使用的用于檢查網(wǎng)絡(luò)通不通的 ping 命令,這個(gè)“ping”的過(guò)程實(shí)際上就是 icmp 協(xié)議工作的過(guò)程。

21、還有其它的網(wǎng)絡(luò)命令如跟蹤路由的 tracert 命令也是基于 icmp 協(xié)議的。第 5 頁(yè) 共 24 頁(yè)3.23.2 icmpicmp 報(bào)文格式報(bào)文格式icmp 報(bào)文是在 ip 數(shù)據(jù)報(bào)內(nèi)被傳輸?shù)娜绫?3-1 所示:表 3-1 icmp 封裝在 ip 數(shù)據(jù)報(bào)內(nèi)部ip 首部icmp 報(bào)文icmp 報(bào)文的格式如表 3-2 所示。所有報(bào)文的前四個(gè)字節(jié)都是一樣的,但是剩下的其它字節(jié)則互不相同。該消息使用了一種簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),其報(bào)頭部分由三個(gè)字段組成,作為報(bào)頭第一項(xiàng)的類(lèi)型(type)字段占用了一個(gè)字節(jié),用來(lái)表示該協(xié)議消息所實(shí)現(xiàn)的功能,而占用一個(gè)字節(jié)長(zhǎng)度的代碼(code)字段則用來(lái)進(jìn)一步對(duì)消息內(nèi)容進(jìn)行分類(lèi)。

22、報(bào)頭最后一項(xiàng)是兩個(gè)字節(jié)長(zhǎng)度的校驗(yàn)和,檢驗(yàn)和字段覆蓋整個(gè) icmp 報(bào)文,icmp 的檢驗(yàn)和是必需的。而其后的 icmp 消息內(nèi)容則與消息功能有關(guān),但所有消息內(nèi)容中都必須帶有引發(fā)錯(cuò)誤消息和數(shù)據(jù)報(bào)的 ip 報(bào)頭和前8 個(gè)字節(jié),而且這些信息足以使其上層協(xié)議對(duì)自己的報(bào)頭進(jìn)行檢查并根據(jù) icmp消息內(nèi)容來(lái)執(zhí)行適當(dāng)?shù)牟僮?。最重要的是,icmp 協(xié)議不支持?jǐn)?shù)據(jù)糾錯(cuò)功能,該協(xié)議只是通過(guò)數(shù)據(jù)源回送錯(cuò)誤消息來(lái)告訴路由錯(cuò)誤。表 3-2 icmp 報(bào)文8 位類(lèi)型(1 字節(jié))8 位代碼(1 字節(jié))16 位校驗(yàn)和(2 字節(jié))不同的類(lèi)型和代碼有不同的內(nèi)容3.33.3 icmpicmp 報(bào)文的類(lèi)型報(bào)文的類(lèi)型表 3-3 icm

23、p 報(bào)文類(lèi)型類(lèi) 型代 碼描述查 詢(xún)差 錯(cuò)0 0回顯應(yīng)答3目的不可達(dá) 0網(wǎng)絡(luò)不可達(dá) 1主機(jī)不可達(dá) 2協(xié)議不可達(dá) 3端口不可達(dá) 4需要進(jìn)行分片但設(shè)置了不分片比特 5源站選路失敗 6目的網(wǎng)絡(luò)不認(rèn)識(shí) 7目的主機(jī)不認(rèn)識(shí) 第 6 頁(yè) 共 24 頁(yè)8源主機(jī)被隔離 9目的網(wǎng)絡(luò)被強(qiáng)制禁止 10目的主機(jī)被強(qiáng)制禁止 11由于服務(wù)類(lèi)型 tos,網(wǎng)絡(luò)不可達(dá) 12由于服務(wù)類(lèi)型 tos,主機(jī)不可達(dá) 13由于過(guò)濾,通信被強(qiáng)制禁止 14主機(jī)選權(quán) 15優(yōu)先權(quán)中止生效 40源端口關(guān)閉 5重定向 0對(duì)網(wǎng)絡(luò)重定向 1對(duì)主機(jī)重定向 2對(duì)服務(wù)類(lèi)型和網(wǎng)絡(luò)重定向 3對(duì)服務(wù)類(lèi)型和主機(jī)重定向 80請(qǐng)求回顯 90路由器通告 100路由器請(qǐng)求 11超

24、時(shí)0傳輸期間生存時(shí)間為 0 1在數(shù)據(jù)報(bào)組裝期間生存時(shí)間為 0 12參數(shù)問(wèn)題0壞的 ip 首部 1缺少必須的選項(xiàng) 130時(shí)間戳請(qǐng)求 140時(shí)間戳應(yīng)答 150信息請(qǐng)求 160信息應(yīng)答 170地址掩碼請(qǐng)求 180地址掩碼應(yīng)答 各種類(lèi)型的 icmp 報(bào)文如表 3-3 所示,不同類(lèi)型由報(bào)文中的類(lèi)型字段和代碼字段來(lái)共同決定。表中的最后兩列表明 icmp 報(bào)文是一份查詢(xún)報(bào)文還是一份差錯(cuò)報(bào)文。因?yàn)?icmp 差錯(cuò)報(bào)文需要做特殊處理,因此需要對(duì)它們進(jìn)行區(qū)分。例如,在對(duì) icmp 差錯(cuò)報(bào)文進(jìn)行響應(yīng)時(shí),永遠(yuǎn)不會(huì)生成另一份 icmp 差錯(cuò)報(bào)文(如果沒(méi)有這個(gè)限制,可能會(huì)遇到一個(gè)差錯(cuò)產(chǎn)生另一個(gè)差錯(cuò)的情況,而差錯(cuò)再產(chǎn)第 7

25、 頁(yè) 共 24 頁(yè)生差錯(cuò),這樣會(huì)無(wú)休止地循環(huán)下去)。當(dāng)發(fā)送一份 icmp 差錯(cuò)報(bào)文時(shí),報(bào)文始終包含 ip 的首部和產(chǎn)生 icmp 差錯(cuò)報(bào)文的 ip 數(shù)據(jù)報(bào)的前 8 個(gè)字節(jié)。這樣,接收 icmp 差錯(cuò)報(bào)文的模塊就會(huì)把它與某個(gè)特定的協(xié)議(根據(jù) ip 數(shù)據(jù)報(bào)首部中的協(xié)議字段來(lái)判斷)和用戶(hù)進(jìn)程(根據(jù)包含在 ip 數(shù)據(jù)報(bào)前 8 個(gè)字節(jié)中的 tcp 或 udp 報(bào)文首部中的 tcp 或 udp 端口號(hào)來(lái)判斷)聯(lián)系起來(lái)。下面各種情況都不會(huì)導(dǎo)致產(chǎn)生 icmp 差錯(cuò)報(bào)文:1)icmp 差錯(cuò)報(bào)文(但是,icmp 查詢(xún)報(bào)文可能會(huì)產(chǎn)生 icmp 差錯(cuò)報(bào)文)。2)目的地址是廣播地址或多播地址的 ip 數(shù)據(jù)報(bào)。3)作為鏈

26、路層廣播的數(shù)據(jù)報(bào)。4)不是 ip 分片的第一片。5)源地址不是單個(gè)主機(jī)的數(shù)據(jù)報(bào)。這就是說(shuō),源地址不能為零地址、環(huán)回地址、廣播地址或多播地址。這些規(guī)則是為了防止過(guò)去允許 icmp 差錯(cuò)報(bào)文廣播分組響應(yīng)所帶來(lái)的廣播風(fēng)暴。3.43.4 icmpicmp 的重要性簡(jiǎn)介的重要性簡(jiǎn)介icmp 協(xié)議對(duì)于網(wǎng)絡(luò)安全具有極其重要的意義。icmp 協(xié)議本身的特點(diǎn)決定了它非常容易被用于攻擊網(wǎng)絡(luò)上的路由器和主機(jī)。例如,在 1999 年 8 月海信集團(tuán)“懸賞”50 萬(wàn)元人民幣測(cè)試防火墻的過(guò)程中,其防火墻遭受到的 icmp 攻擊達(dá) 334050 次之多,占整個(gè)攻擊總數(shù)的 90%以上!可見(jiàn),icmp 的重要性絕不可以忽視。比

27、如,可以利用操作系統(tǒng)規(guī)定的 icmp 數(shù)據(jù)包的最大尺寸不超過(guò) 64kb這一規(guī)定,向主機(jī)發(fā)起“ping of death”(死亡之 ping)攻擊。 “ping of death”攻擊的原理是:如果 icmp 數(shù)據(jù)包的尺寸超過(guò) 64kb 上限時(shí),主機(jī)就會(huì)出現(xiàn)內(nèi)存分配錯(cuò)誤,導(dǎo)致 tcp/ip 堆棧崩潰,致使主機(jī)死機(jī)。此外,向目標(biāo)主機(jī)長(zhǎng)時(shí)間、連續(xù)、大量地發(fā)送 icmp 數(shù)據(jù)包,也會(huì)最終使系統(tǒng)癱瘓。大量的 icmp 數(shù)據(jù)包會(huì)形成“icmp”風(fēng)暴,使得目標(biāo)主機(jī)耗費(fèi)大量的 cpu 資源,疲于奔命。4 4網(wǎng)絡(luò)套接字網(wǎng)絡(luò)套接字4.14.1 套接字概述套接字概述網(wǎng)絡(luò)通信是以套接字為基礎(chǔ)的,一個(gè)套接字就是通信的一

28、端。在通信的每一端,都可以找到與其對(duì)應(yīng)的一個(gè)套接字。每當(dāng)一臺(tái)主機(jī)要與另一臺(tái)機(jī)器對(duì)話時(shí),它首先就要?jiǎng)?chuàng)建一對(duì)套接字,即使它正在使用著一對(duì)套接字與那臺(tái)計(jì)算機(jī)通信,因?yàn)檫@次又開(kāi)始了一次新的對(duì)話。通常所說(shuō)的網(wǎng)絡(luò)通信,實(shí)際上是兩臺(tái)計(jì)算機(jī)通過(guò)一對(duì)套接字相互傳輸數(shù)據(jù)的過(guò)程。一個(gè)正在被使用的套接字有著它的類(lèi)型與其相關(guān)的進(jìn)程。最早使用套接字編程的是 berkeley 分校的研究人員們,他們?cè)?unix 平臺(tái)上開(kāi)發(fā)了 berkeley 套接字方案,使得通過(guò)這種接口能實(shí)現(xiàn)多第 8 頁(yè) 共 24 頁(yè)種網(wǎng)絡(luò)協(xié)議之間的連接。套接字可以根據(jù)通信任務(wù)的性質(zhì)分類(lèi)。用戶(hù)可以覺(jué)察出它們的區(qū)別。應(yīng)用程序一般僅在同一類(lèi)的套接字間通信。目

29、前可以使用三種套接字,即流套接字、數(shù)據(jù)報(bào)套接字和原始套接字。下面簡(jiǎn)單介紹三種套接字的特點(diǎn)。1)流套接字,提供了雙向的、有序的、無(wú)重復(fù)并且無(wú)記錄邊界的數(shù)據(jù)流服務(wù),它適用于處理大量數(shù)據(jù)。網(wǎng)絡(luò)傳輸層可以將數(shù)據(jù)分散或集中到合適尺寸的數(shù)據(jù)報(bào)中。流套接字是面向連接的,通信雙方進(jìn)行數(shù)據(jù)交換之前,必須建立一條路徑,這樣既確定了它們之間存在的路由,又保證了雙方都是活動(dòng)的、可彼此響應(yīng)的,但在通信雙方之間建立一個(gè)通信信道需要很多開(kāi)支。除此以外,大部分面向連接的協(xié)議為保證發(fā)送無(wú)誤,可能會(huì)需要執(zhí)行額外的計(jì)算來(lái)驗(yàn)證正確性,因此會(huì)進(jìn)一步增加開(kāi)銷(xiāo)。2)數(shù)據(jù)報(bào)套接字,支持雙向的數(shù)據(jù)流,但并不保證數(shù)據(jù)是可靠、有序和無(wú)重復(fù)的。也就

30、是說(shuō),一個(gè)從數(shù)據(jù)報(bào)套接字中接收信息的進(jìn)程有可能發(fā)現(xiàn)信息重復(fù)或者和發(fā)出時(shí)的順序不同。此外,數(shù)據(jù)報(bào)套接字的一個(gè)重要特點(diǎn)是它保留了記錄邊界。對(duì)于這一特點(diǎn),數(shù)據(jù)報(bào)套接口采用了與現(xiàn)在許多包交換網(wǎng)絡(luò)(例如以太網(wǎng))非常類(lèi)似的模型。數(shù)據(jù)報(bào)套接字是無(wú)連接的,它不保證接收端是否正在偵聽(tīng),類(lèi)似與郵政服務(wù):發(fā)信人把信裝入郵箱即可,至于收信人是否能收到這封信或郵局是否能按時(shí)將信件投遞到收信人處等,發(fā)信人都不得而知。因此,數(shù)據(jù)報(bào)并不可靠,需由程序員負(fù)責(zé)管理數(shù)據(jù)報(bào)的排序和可靠性。應(yīng)用程序一般僅在同一類(lèi)的套接口間通信,不過(guò)只要底層的通信協(xié)議允許,不同類(lèi)型的套接口間也照樣可以通信。3)原始套接字,從用戶(hù)的角度看,sock_st

31、ream、sock_dgram 這兩類(lèi)套接字似乎的確涵蓋了 tcp/ip 應(yīng)用的全部,因?yàn)榛?tcp/ip 的應(yīng)用,從協(xié)議棧的層次上講,在傳輸層的確只可能建立于 tcp 或 udp 協(xié)議之上,而sock_stream、sock_dgram 又分別對(duì)應(yīng)于 tcp 和 udp,所以幾乎所有的應(yīng)用都可以用這兩類(lèi)套接字實(shí)現(xiàn)。但是,當(dāng)我們面對(duì)如下問(wèn)題時(shí),sock_stream、sock_dgram 將顯得這樣無(wú)助:(1)怎樣發(fā)送一個(gè)自定義的 ip 包?(2)怎樣發(fā)送一個(gè) icmp 協(xié)議包?(3)怎樣分析所有經(jīng)過(guò)網(wǎng)絡(luò)的包,而不管這包是否是發(fā)給自己的?raw socket 與標(biāo)準(zhǔn)套接字(scck_stre

32、am、sock_dgram)的區(qū)別在于前者直接置“根”與操作系統(tǒng)網(wǎng)絡(luò)核心(network core),而第 9 頁(yè) 共 24 頁(yè)sock_stream、sock_dgram“懸浮”與 tcp 和 udp 協(xié)議的外圍。當(dāng)我們使用 raw socket 的時(shí)候,可以完全自定義 ip 包,一切形式的包都可以“制造”出來(lái)。4.24.2 winsockwinsock 中的幾個(gè)基本概念中的幾個(gè)基本概念.1 winsockwinsockwindows 下網(wǎng)絡(luò)編程的規(guī)范windows sockets 是得到廣泛應(yīng)用的、開(kāi)放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口。該規(guī)范以 u.c.berkeley 大學(xué)

33、 bsd unix 中流行的 socket 接口為范例定義了一套 microsoft windows 下網(wǎng)絡(luò)編程接口。它不僅包含了人們所熟悉的 berkeley socket 風(fēng)格的庫(kù)函數(shù),也包含了一組針對(duì)windows 的擴(kuò)展函數(shù),以使程序員能充分利用 windows 消息驅(qū)動(dòng)機(jī)制進(jìn)行編程。.2 阻塞和非阻塞阻塞和非阻塞套接字可以處于阻塞或非阻塞模式。在阻塞模式下,在 i/o 操作完成前,執(zhí)行操作的 winsock 函數(shù)會(huì)一直等待下去,不會(huì)立即返回(將控制權(quán)交還給程序),直到操作完成。在非阻塞模式下,winsock 函數(shù)無(wú)論如何都會(huì)立即返回并交出程序的控制權(quán),在默認(rèn)情況下,套

34、接字為阻塞模式。.3 字節(jié)順序字節(jié)順序不同的計(jì)算機(jī)有時(shí)使用不同的字節(jié)順序存儲(chǔ)數(shù)據(jù)。任何從 winsock 函數(shù)對(duì)ip 地址和端口號(hào)的引用和傳送給 winsock 函數(shù)的 ip 地址和端口號(hào)均是按照網(wǎng)絡(luò)順序組織的,這也包括了 sockaddr_in 這一數(shù)據(jù)結(jié)構(gòu)中的 ip 地址和端口號(hào)(但不包括 sin family)。.4 客戶(hù)機(jī)客戶(hù)機(jī)/服務(wù)器模型服務(wù)器模型一個(gè)在建立分布式應(yīng)用時(shí)最常用的范例便是客戶(hù)機(jī)/服務(wù)器模型。在這種方案中客戶(hù)應(yīng)用程序向服務(wù)器程序請(qǐng)求服務(wù)。這種方式隱含了在建立客戶(hù)機(jī)/服務(wù)器間通信的非對(duì)稱(chēng)性。該模型工作時(shí)要求有一套為客戶(hù)機(jī)和服務(wù)器所共識(shí)的慣例,

35、來(lái)保證服務(wù)能夠被提供。這一套慣例包含了一套協(xié)議,它必須在通信的兩頭都被實(shí)現(xiàn)。根據(jù)不同的情況,協(xié)議可能是對(duì)稱(chēng)的或是非對(duì)稱(chēng)的。在對(duì)稱(chēng)的協(xié)議中,每一方都有可能扮演主從角色;在非對(duì)稱(chēng)協(xié)議中,一方被不可改變地認(rèn)為是主機(jī),而另一方則是從機(jī)。一個(gè)對(duì)稱(chēng)協(xié)議的例子是 internet 中用于終端仿真的 telnet。而非對(duì)稱(chēng)協(xié)議的例子是 internet 中的 ftp。無(wú)論具體的協(xié)議是對(duì)稱(chēng)的還是非對(duì)稱(chēng)的,當(dāng)服務(wù)被提供時(shí)必然存在“客戶(hù)進(jìn)程”和“服務(wù)進(jìn)程” 。一個(gè)服務(wù)程序通常在一個(gè)眾所周知的地址監(jiān)聽(tīng)對(duì)服務(wù)的請(qǐng)求,也就是說(shuō),第 10 頁(yè) 共 24 頁(yè)服務(wù)進(jìn)程一直處于休眠狀態(tài),直到一個(gè)客戶(hù)對(duì)這個(gè)服務(wù)的地址提出了連接請(qǐng)求

36、。在這個(gè)時(shí)刻,服務(wù)程序被“驚醒”并且為客戶(hù)提供服務(wù)對(duì)客戶(hù)的請(qǐng)求做出適當(dāng)?shù)姆磻?yīng)。4.34.3 winsockwinsock 編程原理編程原理.1 winsockwinsock 的啟動(dòng)和終止的啟動(dòng)和終止由于 winsock 的服務(wù)是以動(dòng)態(tài)連接庫(kù) winsock dll 形式實(shí)現(xiàn)的,因此必須先調(diào)用 wsastartup 函數(shù)對(duì) winsock 進(jìn)行初始化,協(xié)商 winsock 的版本支持,并分配必要的資源。如果在調(diào)用 winsock 函數(shù)之前,沒(méi)有加載 winsock 庫(kù),則會(huì)返回 socket_error 錯(cuò)誤,錯(cuò)誤信息是 wsanotinitialised。 wsastartup

37、 函數(shù)原形如下:int wsastartup(word wversionrequested,lpwsadata lpwsadata);其中 wversionrequested 用于指定準(zhǔn)備加載的 winsock 庫(kù)的版本,通常的做法是高位字節(jié)指定所需要的 winsock 庫(kù)的副版本,而低位字節(jié)則是主版本,然后,再用宏 makeword(x,y)(x 是高位字節(jié),y 是低位字節(jié))獲得wversionrequested 的正確值。lpwsadata 參數(shù)是指向 lpwsadata 結(jié)構(gòu)的指針,該結(jié)構(gòu)包含了加載的庫(kù)版本有關(guān)的信息,它的格式如下:typedef struct wsadata word

38、wversion;word whighversion;char szdescription wsadescription_len+1;char szsystemstatus wsasys_status_len+1;unsighed short imaxsockets;unsighed short imaxudpdg;char far * lpvendorinfo; wsadata, *lpwsadata;其中,wversion 字段為希望使用它們的 winsock 版本。字段 whighversion返回現(xiàn)有 winsock 的最高版本。szdescription 和 szsystemstat

39、us 這兩個(gè)字段由特定的 winsock 實(shí)施方案設(shè)定,事實(shí)上沒(méi)有用。字段 imaxsockets 和 imaxudpdg分別為可同時(shí)打開(kāi)的套接字?jǐn)?shù)和數(shù)據(jù)報(bào)的最大長(zhǎng)度,一般不要使用它們,若想知道數(shù)據(jù)報(bào)的最大長(zhǎng)度則應(yīng)該通過(guò) wsaenumprotocols 函數(shù)來(lái)查詢(xún)協(xié)議信息,而可同時(shí)打開(kāi)套接字的最大數(shù)目不是固定的,它很大程度上和可用物理內(nèi)存的多少有關(guān)。最后一個(gè)字段 lpvendorinfo 是為 winsock 實(shí)施方案有關(guān)的指定廠商信息預(yù)留的,任何一個(gè) win32 平臺(tái)上都沒(méi)有使用這個(gè)字段。此外,在應(yīng)用程序關(guān)閉套接字后,還應(yīng)調(diào)用 wsacleanup 函數(shù)終止對(duì)第 11 頁(yè) 共 24 頁(yè)wi

40、nsock dll 的使用,并釋放資源,以備下一次使用。wsacleanup 函數(shù)的原形如下:int wsacleanup(void);該函數(shù)不帶任何參數(shù),若調(diào)用成功則返回 0,否則返回錯(cuò)誤。4.3.2錯(cuò)誤檢查和控制錯(cuò)誤檢查和控制錯(cuò)誤檢查和控制對(duì)于 winsock 應(yīng)用程序是至關(guān)重要的。事實(shí)上,對(duì)winsock api 函數(shù)來(lái)說(shuō),返回錯(cuò)誤是常見(jiàn)的,但是多數(shù)情況下,通信仍可在套接字上進(jìn)行。 盡管返回錯(cuò)誤的值并非一成不變,但不成功的 winsock 調(diào)用返回的最常見(jiàn)的值是 socket_error(值為-1 的常量)。如果錯(cuò)誤情況發(fā)生了,就可用 wsagetlasterror 函數(shù)來(lái)獲得一段代碼,

41、這段代碼明確地表明產(chǎn)生錯(cuò)誤的原因。該函數(shù)原形為:int wsagetlasterror(void);該函數(shù)返回的錯(cuò)誤都是預(yù)先聲明的常量,根據(jù) winsock 版本的不同,這些值的聲明不在 winsock 1.h 中,就會(huì)在 winsock2.h 中。兩個(gè)頭字段的惟一差別是 winsock2.h 中包含的錯(cuò)誤代碼(針對(duì) winsock2.h 中引入的一些新的 api 函數(shù))更多。為各種錯(cuò)誤代碼聲明的常量一般都以 wsae 開(kāi)頭。.3 winsockwinsock 編程模型編程模型不論是流套接字還是數(shù)據(jù)報(bào)套接字編程,一般都采用客戶(hù)/服務(wù)器方式,它們的運(yùn)作過(guò)程基本類(lèi)似,下面簡(jiǎn)單介紹兩

42、種基本的套接字編成模型。(1) 數(shù)據(jù)報(bào)套接字編程模型。數(shù)據(jù)報(bào)套接字編程的時(shí)序圖如圖 4-1 所示。1.1)服務(wù)器進(jìn)程創(chuàng)建套接字服務(wù)進(jìn)程總是先于客戶(hù)進(jìn)程啟動(dòng),服務(wù)進(jìn)程首先調(diào)用 socket 函數(shù)創(chuàng)建一個(gè)套接字。socket 函數(shù)原形如下:socket socket (int af, int type, int protocol);其中,參數(shù) af 用于指定網(wǎng)絡(luò)地址類(lèi)型,一般取 af_inet,表示該套接字在internet 域中進(jìn)行通信。參數(shù) type 用于指定套接字類(lèi)型,若取 sock_dgram表示要?jiǎng)?chuàng)建的套接字是數(shù)據(jù)報(bào)套接字,若取 sock_raw 表示要?jiǎng)?chuàng)建的套接字是原始套接字。參數(shù) p

43、rotocol 用于指定網(wǎng)絡(luò)協(xié)議,一般取 0,表示默認(rèn)為tcp/ip 協(xié)議,本課題指定協(xié)議為 ipproto_icmp,表示創(chuàng)建一個(gè)將 icmp 作為一種基層 ip 協(xié)議的套接字。1.2)將本地地址綁定到所創(chuàng)建的套接字上以便在網(wǎng)絡(luò)上表示該套接字。這個(gè)過(guò)程就是通過(guò)調(diào)用 bind 函數(shù)來(lái)完成的,該函數(shù)原形如下:int bind(socket s, const struct sockaddr *name, int namelen);第 12 頁(yè) 共 24 頁(yè)其中,參數(shù) s 表示一個(gè)未捆綁套接字描述符。參數(shù) name 是賦予套接字的地址,它由 struct sockaddr 結(jié)構(gòu)表示,該結(jié)構(gòu)的格式如下

44、:struct sockaddru_short sa_family;char sa_data14;該地址結(jié)構(gòu)隨選擇的協(xié)議的不同而變化,因此一般情況下另一個(gè)與該地址結(jié)構(gòu)大小相同的 sockaddr_in 結(jié)構(gòu)更為常用,sockaddr_in 結(jié)構(gòu)用來(lái)表示 tcp/ip 協(xié)議下的地址,在 tcp/ip 協(xié)議下,可以方便地通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換把 sockaddr_in 結(jié)構(gòu)轉(zhuǎn)換為 sockaddr 結(jié)構(gòu)。sockaddr_in 結(jié)構(gòu)的格式如下:struct sockaddr_in short sin_family; unsigned short sin_port; struct in_addr sin_

45、addr; char sin _zero 8;其中,sin_family 字段必須為 af_inet,表示該 socket 處于 internet 域;參數(shù) in_port 和 sin_addr 用于指定端口和 ip 地址;字段 sin_ zero 只充當(dāng)填充項(xiàng),以使 sockaddr_in 結(jié)構(gòu)和 sockaddr 結(jié)構(gòu)的長(zhǎng)度一樣。1.3)等待接收數(shù)據(jù)常用的接收數(shù)據(jù)的函數(shù)是 recvfrom,它的原型是:int recvfrom(socket s, char *buf, int len, int flags, struct sockaddr *from,int *fromlen);其中,參數(shù)

46、 s 是準(zhǔn)備接收數(shù)據(jù)報(bào)的套接字,參數(shù) buf 是即將收到數(shù)據(jù)的字符緩沖區(qū),參數(shù) len 是準(zhǔn)備接收的字節(jié)數(shù)或 buf 的長(zhǎng)度。參數(shù) flags 可以是0、msg_peek、msg_oob,0 表示無(wú)特殊行為,參數(shù) from 是一個(gè) sockaddr 結(jié)構(gòu)指針,參數(shù) fromlen 是帶有指向地址結(jié)構(gòu)的長(zhǎng)度的指針。 1.4)客戶(hù)進(jìn)程調(diào)用 socket 函數(shù)創(chuàng)建客戶(hù)端套接字。1.5)客戶(hù)進(jìn)程調(diào)用 bind 函數(shù)將本地地址綁定到所創(chuàng)建的套接字上。1.6)客戶(hù)進(jìn)程發(fā)送數(shù)據(jù)對(duì)于發(fā)送端的數(shù)據(jù)報(bào)套接字來(lái)說(shuō),也可以在創(chuàng)建套接字后,直接調(diào)用sendto 函數(shù),這是最簡(jiǎn)單的發(fā)送數(shù)據(jù)的方式,該函數(shù)原型為:int s

47、endto(socket s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen );除了 buf 是發(fā)送數(shù)據(jù)的緩沖,len 指明發(fā)送的字節(jié)外,其余參數(shù)和recvfrom 的參數(shù)一樣,to 是一個(gè)指向 sockaddr 結(jié)構(gòu)指針,帶有接收數(shù)據(jù)的套接字目標(biāo)地址信息。1.7)調(diào)用 closesocket 函數(shù)來(lái)釋放套接字資源。因?yàn)閿?shù)據(jù)報(bào)套接字沒(méi)有連接,在接收端或發(fā)送端結(jié)束收發(fā)數(shù)據(jù)時(shí),只需在套接字描述符上調(diào)用 closesocket 函數(shù)來(lái)釋放套接字的資源即可。第 13 頁(yè) 共 24 頁(yè)圖 4-1 非面

48、向連接的套接字編成時(shí)序圖(2)流套接字編程模型流套接字編程的時(shí)序圖如圖 4-2 所示。2.1)服務(wù)器進(jìn)程創(chuàng)建套接字服務(wù)進(jìn)程總是先于客戶(hù)進(jìn)程啟動(dòng),服務(wù)進(jìn)程首先調(diào)用 socket 函數(shù)創(chuàng)建一個(gè)套接字。socket 函數(shù)原形如下:socket socket(int af ,int type, int protocol);其中,參數(shù) af 用于指定網(wǎng)絡(luò)地址類(lèi)型,一般取 af_inet,表示該套接字在internet 域中進(jìn)行通信。參數(shù) type 用于指定套接字類(lèi)型,若取 sock_dgram表示要?jiǎng)?chuàng)建的套接字是數(shù)據(jù)報(bào)套接字,若取 sock_raw 表示要?jiǎng)?chuàng)建的套接字是原始套接字。參數(shù) protocol

49、 用于指定網(wǎng)絡(luò)協(xié)議,一般取 0,表示默認(rèn)為tcp/ip 協(xié)議, 2.2)將本地地址綁定到所創(chuàng)建的套接字上以便在網(wǎng)絡(luò)上表示該套接字。第 14 頁(yè) 共 24 頁(yè)這個(gè)過(guò)程就是通過(guò)調(diào)用 bind 函數(shù)來(lái)完成的,該函數(shù)原形如下:int bind(socket s, const struct sockaddr*name, int namelen);其中,參數(shù) s 表示一個(gè)未捆綁套接字描述符。參數(shù) name 是賦予套接字的地址,它由 struct sockaddr 結(jié)構(gòu)表示,該結(jié)構(gòu)的格式如下:struct sockaddr u_short sa_family; char sa_data14;該地址結(jié)構(gòu)隨選擇

50、的協(xié)議的不同而變化,因此一般情況下另一個(gè)與該地址結(jié)構(gòu)大小相同的 sockaddr_in 結(jié)構(gòu)更為常用,sockaddr_in結(jié)構(gòu)用來(lái)表示 tcp/ip 協(xié)議下的地址,在 tcp/ip 協(xié)議下,可以方便地通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換把 sockaddr_in 結(jié)構(gòu)轉(zhuǎn)換為 sockaddr 結(jié)構(gòu)。sockaddr_in 結(jié)構(gòu)的格式如下:struct sockaddr_in short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero 8;其中,sin_family 字段必須為 af_inet,表示該 sock

51、et 處于 internet 域;參數(shù) in_port 和 sin_addr 用于指定端口和 ip 地址;字段 sin_zero 只充當(dāng)填充項(xiàng),以使 sockaddr_in 結(jié)構(gòu)和 sockaddr 結(jié)構(gòu)的長(zhǎng)度一樣。2.3)將套接字置入監(jiān)聽(tīng)模式并準(zhǔn)備接收連接請(qǐng)求。bind 函數(shù)的作用只是將一個(gè)套接字和一個(gè)指定的地址關(guān)聯(lián)在一起,讓一個(gè)套接字等候進(jìn)入連接的 api 函數(shù)則是 listen,其原型為:int listen (socket s, int banklog);其中,參數(shù) s 標(biāo)識(shí)一個(gè)已捆綁未連接的套接字描述符。backlog 參數(shù)用于指定正在等待連接的最大隊(duì)列長(zhǎng)度,這個(gè)參數(shù)非常重要,因?yàn)橥?/p>

52、全有可能同時(shí)出現(xiàn)幾個(gè)服務(wù)器連接請(qǐng)求。例如,假定 backlog 參數(shù)為 2,如果三個(gè)客戶(hù)機(jī)同時(shí)發(fā)出請(qǐng)求,那么頭兩個(gè)會(huì)被放在一個(gè)等待處理隊(duì)列中,以便應(yīng)用程序依次為它們提供服務(wù),而第三個(gè)連接(既隊(duì)列已滿)會(huì)造成一個(gè)錯(cuò)誤。2.4)進(jìn)入監(jiān)聽(tīng)狀態(tài)之后,通過(guò)調(diào)用 accept 函數(shù)使套接字作好接收客戶(hù)連接的準(zhǔn)備。該函數(shù)原型為:socket accept (socket s, struct sockaddr * addr, int addrlen);其中,參數(shù) s 是屬于監(jiān)聽(tīng)模式的套接字描述符。第二個(gè)參數(shù)是一個(gè)有效的sockaddr_in 結(jié)構(gòu)的地址,而 addrlen 是 sockaddr_in 結(jié)構(gòu)的長(zhǎng)

53、度。這樣,服務(wù)器便可為等待連接隊(duì)列中的第一個(gè)連接請(qǐng)求提供服務(wù)了。accept 函數(shù)返回后,addr 參數(shù)變量中會(huì)包含一個(gè)新的套接字描述符,它對(duì)應(yīng)于已經(jīng)接收的那個(gè)客戶(hù)機(jī)連接。對(duì)于該客戶(hù)機(jī)后續(xù)的所有操作,都應(yīng)使用這個(gè)新套接字,至于原來(lái)那個(gè)監(jiān)聽(tīng)套接字,它仍然用于接收其它客戶(hù)機(jī)連接,而且仍處于監(jiān)聽(tīng)模式。如果無(wú)連接請(qǐng)求,服務(wù)進(jìn)程被阻塞。2.5)客戶(hù)進(jìn)程調(diào)用 socket 函數(shù)創(chuàng)建客戶(hù)端套接字。第 15 頁(yè) 共 24 頁(yè)2.6)客戶(hù)向服務(wù)進(jìn)程發(fā)出連接請(qǐng)求。通過(guò)調(diào)用 connect 函數(shù)可以建立一個(gè)端對(duì)端的連接。該函數(shù)原型為:int connect (socket s, const struct socka

54、ddr far *name, int namelen);其中,參數(shù) s 標(biāo)識(shí)一個(gè)未連接的套接字描述符。name 是針對(duì)于 tcp 的套接字地址結(jié)構(gòu),它標(biāo)示服務(wù)進(jìn)程 ip 的地址信息。namelen 則用于標(biāo)識(shí) name 的長(zhǎng)度。2.7)當(dāng)連接請(qǐng)求到來(lái)后,被阻塞的服務(wù)進(jìn)程的 accept 函數(shù)會(huì)生成一個(gè)新的套接字與客戶(hù)套接字建立連接,并向客戶(hù)端返回接收信號(hào)。2.8)一但客戶(hù)機(jī)的套接字收到來(lái)自服務(wù)器的接收信號(hào),則表示客戶(hù)機(jī)與服務(wù)器已實(shí)現(xiàn)連接,則可進(jìn)行數(shù)據(jù)傳輸了。send、recv 函數(shù)是進(jìn)行數(shù)據(jù)收發(fā)的函數(shù)。send 函數(shù)原型為:int send (socket s, const char *buf

55、, int len, int flags);其中,參數(shù) s 是已經(jīng)建立連接的套接字描述符。第二個(gè)參數(shù)發(fā)送數(shù)據(jù)的緩沖區(qū)。參數(shù) len 指定發(fā)送數(shù)據(jù)的長(zhǎng)度。沒(méi)有特殊情況,參數(shù) flags 一般取 0。recv 函數(shù)的原型為:int recv (socket s, char *buf, int len, int flags);參數(shù) s 指準(zhǔn)備接收數(shù)據(jù)報(bào)的套接字。buf 指存放接收數(shù)據(jù)的緩沖區(qū)。len 為準(zhǔn)備接收數(shù)據(jù)的長(zhǎng)度或緩沖區(qū)的長(zhǎng)度。參數(shù) flags 同 send 函數(shù)。2.9)關(guān)閉套接字,先調(diào)用 shutdown 函數(shù)關(guān)閉連接,再調(diào)用 closesocket 函數(shù)關(guān)閉套接字,以免丟失數(shù)據(jù)。 圖

56、4-2 面向連接的套接字編成時(shí)序圖 第 16 頁(yè) 共 24 頁(yè)5 5控制協(xié)議的模擬實(shí)現(xiàn)控制協(xié)議的模擬實(shí)現(xiàn)5.15.1 課題的具體要求課題的具體要求此次畢業(yè)設(shè)計(jì)的題目是:基于 icmp 模擬網(wǎng)絡(luò)控制軟件的開(kāi)發(fā)(控制管理模塊),也就是在 icmp 協(xié)議的基礎(chǔ)上,開(kāi)發(fā)出自己的一套規(guī)則,來(lái)模擬網(wǎng)絡(luò)控制。 通過(guò)在控制端輸入控制信息,接收端收到后做出相應(yīng)的行為。5.25.2 課題的實(shí)現(xiàn)重點(diǎn)課題的實(shí)現(xiàn)重點(diǎn)1) 為了控制端操作方便,采用可視化的界面,利用 visual c+6.0 制作一個(gè)包含幾種控件的對(duì)話框界面。2) 利用套接字編程知識(shí),正確地把控制信息發(fā)送到接收端5.35.3 可視化界面的具體實(shí)現(xiàn)可視化界

57、面的具體實(shí)現(xiàn)5.3.1思考過(guò)程思考過(guò)程首先應(yīng)使用 visual c+的 appwizard 創(chuàng)建一個(gè) mfc appwizard(exe)類(lèi)型的工程文件,并命名為 myicmp,應(yīng)用程序的類(lèi)型選擇基于對(duì)話框,然后再進(jìn)行界面設(shè)計(jì)。 為了操作方便靈活,需要一個(gè)組合框,用來(lái)存儲(chǔ)控制信息,操作員也可以在組合框的編輯框中手工輸入。為了慎重起見(jiàn),先從組合框中選擇一控制信息,傳送到另外一個(gè)編輯框中,核實(shí)無(wú)誤后,再發(fā)送到接收端。同時(shí)為了方便操作員記錄發(fā)送控制的日期、時(shí)間,界面用一個(gè)分組框來(lái)顯示當(dāng)前的日期和時(shí)間。設(shè)計(jì)的界面如圖 5-1 所示: 圖 5-1 設(shè)計(jì)的程序界面第 17 頁(yè) 共 24 頁(yè)5.3.2幾種控

58、件的具體實(shí)現(xiàn)幾種控件的具體實(shí)現(xiàn)1)對(duì)話框中各個(gè)控件屬性,如表 5-1。具體實(shí)現(xiàn)時(shí)需要做好以下兩個(gè)前提工作:1.1)在 stdafx.h 中加入#include winsock2.h。1.2)打開(kāi)選擇菜單 project-setting (alt+f7),進(jìn)入 project setting 對(duì)話框,在 link 下的 object/library modules 輸入 ws2_32.lib,然后點(diǎn)ok。表 5-1 控件屬性表對(duì)象idcaption復(fù)選框 dateidc_date_checkdate復(fù)選框 timeidc_time_checktime編輯框idc_date_edit無(wú)編輯框idc

59、_time_edit無(wú)編輯框idc_edit無(wú)命令按鈕idc_show_button&selecting命令按鈕idc_send_button&send命令按鈕idc_exit_buttone&xit組合框idc_message_combo無(wú)分組框idc_staticclock靜態(tài)文本idc_staticcontrolmes:靜態(tài)文本idc_staticcurrentmes2)對(duì)話框中控件的關(guān)聯(lián)變量如下表:表 5-2 控件關(guān)聯(lián)變量表id變量名類(lèi)別類(lèi)型idc_date_checkm_datecheckvalueboolidc_time_checkm_timecheckvalueboolidc_d

60、ate_editm_dateeditcontrolcedit第 18 頁(yè) 共 24 頁(yè)idc_time_editm_timeeditcontrolceditidc_editm_streditvaluecstringidc_editm_editcontrolceditidc_message_combom_messagecombocontrolccombobox5.45.4 icmpicmp 類(lèi)的核心實(shí)現(xiàn)類(lèi)的核心實(shí)現(xiàn).1 在工程文件中插入在工程文件中插入 icmpicmp,編寫(xiě),編寫(xiě) ipip 和和 icmpicmp 頭結(jié)構(gòu)頭結(jié)構(gòu)1)自定義一個(gè) icmp 類(lèi),過(guò)程如下:點(diǎn)擊菜單中的

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論