TCPIP協(xié)議
什么是 TCP/IP?
TCP/IP 是供已連接因特網(wǎng)的計(jì)算機(jī)進(jìn)行通信的通信協(xié)議。
是指傳輸控制協(xié)議/網(wǎng)際協(xié)議 (Transmission Control Protocol / Internet Protocol)。它定義了電子設(shè)備(比如計(jì)算機(jī))如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間傳輸?shù)臉?biāo)準(zhǔn)。 TCP/IP的通訊協(xié)議
這部分簡要介紹一下TCP/IP的內(nèi)部結(jié)構(gòu),為討論與互聯(lián)網(wǎng)有關(guān)的安全問題打下基礎(chǔ)。TCP/IP協(xié)議組之所以流行,部分原因是因?yàn)樗梢杂迷诟鞣N各樣的信道和底層協(xié)議(例如T1和X.25、以太網(wǎng)以及RS-232串行接口)之上。確切地說,TCP/IP協(xié)議是一組包括TCP協(xié)議和IP協(xié)議,UDP(User Datagram Protocol)協(xié)議、ICMP(Internet Control Message Protocol)協(xié)議和其他一些協(xié)議的協(xié)議組。
TCP/IP整體構(gòu)架概述
TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求。這4層分別為:
應(yīng)用層:應(yīng)用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議(Telnet)等。
傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又校@一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。
互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。
網(wǎng)絡(luò)接口層:對實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。
TCP/IP中的協(xié)議
以下簡單介紹TCP/IP中的協(xié)議都具備什么樣的功能,都是如何工作的:
1. IP
網(wǎng)際協(xié)議IP是TCP/IP的心臟,也是網(wǎng)絡(luò)層中最重要的協(xié)議。
IP層接收由更低層(網(wǎng)絡(luò)接口層例如以太網(wǎng)設(shè)備驅(qū)動(dòng)程序)發(fā)來的數(shù)據(jù)包,并把該數(shù)據(jù)包發(fā)送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數(shù)據(jù)包傳送到更低層。IP數(shù)據(jù)包是不可靠的,因?yàn)镮P并沒有做任何事情來確認(rèn)數(shù)據(jù)包是按順序發(fā)送的或者沒有被破壞。IP數(shù)據(jù)包中含有發(fā)送它的主機(jī)的地址(源地址)和接收它的主機(jī)的地址(目的地址)。
高層的TCP和UDP服務(wù)在接收數(shù)據(jù)包時(shí),通常假設(shè)包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務(wù)的認(rèn)證基礎(chǔ),這些服務(wù)相信數(shù)據(jù)包是從一個(gè)有效的主機(jī)發(fā)送來的。IP確認(rèn)包含一個(gè)選項(xiàng),叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對于一些TCP和UDP的服務(wù)來說,使用了該選項(xiàng)的IP包好像是從路徑上的最后一個(gè)系統(tǒng)傳遞過來的,而不是來自于它的真實(shí)地點(diǎn)。這個(gè)選項(xiàng)是為了測試而存在的,說明了它可以被用來欺騙系統(tǒng)來進(jìn)行平常是被禁止的連接。那么,許多依靠IP源地址做確認(rèn)的服務(wù)將產(chǎn)生問題并且會(huì)被非法入侵。
2. TCP
如果IP數(shù)據(jù)包中有已經(jīng)封好的TCP數(shù)據(jù)包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進(jìn)行錯(cuò)誤檢查,同時(shí)實(shí)現(xiàn)虛電路間的連接。TCP數(shù)據(jù)包中包括序號和確認(rèn),所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
TCP將它的信息送到更高層的應(yīng)用程序,例如Telnet的服務(wù)程序和客戶程序。應(yīng)用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設(shè)備驅(qū)動(dòng)程序和物理介質(zhì),最后到接收方。
面向連接的服務(wù)(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發(fā)送和接收域名數(shù)據(jù)庫),但使用UDP傳送有關(guān)單個(gè)主機(jī)的信息。
3.UDP
UDP與TCP位于同一層,但它不管數(shù)據(jù)包的順序、錯(cuò)誤或重發(fā)。因此,UDP不被應(yīng)用于那些使用虛電路的面向連接的服務(wù),UDP主要用于那些面向查詢---應(yīng)答的服務(wù),例如NFS。相對于FTP或Telnet,這些服務(wù)需要交換的信息量較小。使用UDP的服務(wù)包括NTP(網(wǎng)絡(luò)時(shí)間協(xié)議)和DNS(DNS也使用TCP)。
欺騙UDP包比欺騙TCP包更容易,因?yàn)閁DP沒有建立初始化連接(也可以稱為握手)(因?yàn)樵趦蓚(gè)系統(tǒng)間沒有虛電路),也就是說,與UDP相關(guān)的服務(wù)面臨著更大的危險(xiǎn)。
4.ICMP
ICMP與IP位于同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關(guān)通向目的地址的路徑信息。ICMP的‘Redirect’信息通知主機(jī)通向其他系統(tǒng)的更準(zhǔn)確的路徑,而‘Unreachable’信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連接‘體面地’終止。PING是最常用的基于ICMP的服務(wù)。
5. TCP和UDP的端口結(jié)構(gòu)
TCP和UDP服務(wù)通常有一個(gè)客戶/服務(wù)器的關(guān)系,例如,一個(gè)Telnet服務(wù)進(jìn)程開始在系統(tǒng)上處于空閑狀態(tài),等待著連接。用戶使用Telnet客戶程序與服務(wù)進(jìn)程建立一個(gè)連接?蛻舫绦蛳蚍⻊(wù)進(jìn)程寫入信息,服務(wù)進(jìn)程讀出信息并發(fā)出響應(yīng),客戶程序讀出響應(yīng)并向用戶報(bào)告。因而,這個(gè)連接是雙工的,可以用來進(jìn)行讀寫。
兩個(gè)系統(tǒng)間的多重Telnet連接是如何相互確認(rèn)并協(xié)調(diào)一致呢?TCP或UDP連接唯一地使用每個(gè)信息中的如下四項(xiàng)進(jìn)行確認(rèn):
源IP地址 發(fā)送包的IP地址。
目的IP地址 接收包的IP地址。
源端口 源系統(tǒng)上的連接的端口。
目的端口 目的系統(tǒng)上的連接的端口。
端口是一個(gè)軟件結(jié)構(gòu),被客戶程序或服務(wù)進(jìn)程用來發(fā)送和接收信息。一個(gè)端口對應(yīng)一個(gè)16比特的數(shù)。服務(wù)進(jìn)程通常使用一個(gè)固定的端口,例如,SMTP使用25、Xwindows使用6000。這些端口號是‘廣為人知’的,因?yàn)樵诮⑴c特定的主機(jī)或服務(wù)的連接時(shí),需要這些地址和目的地址進(jìn)行通訊。
IP(Internet Protocol)協(xié)議的英文名直譯就是:因特網(wǎng)協(xié)議。從這個(gè)名稱我們就可以知道IP協(xié)議的重要性。在現(xiàn)實(shí)生活中,我們進(jìn)行貨物運(yùn)輸時(shí)都是把貨物包裝成一個(gè)個(gè)的紙箱或者是集裝箱之后才進(jìn)行運(yùn)輸,在網(wǎng)絡(luò)世界中各種信息也是通過類似的方式進(jìn)行傳輸?shù)摹P協(xié)議規(guī)定了數(shù)據(jù)傳輸時(shí)的基本單元和格式。如果比作貨物運(yùn)輸,IP協(xié)議規(guī)定了貨物打包時(shí)的包裝箱尺寸和包裝的程序。 除了這些以外,IP協(xié)議還定義了數(shù)據(jù)包的遞交辦法和路由選擇。同樣用貨物運(yùn)輸做比喻,IP協(xié)議規(guī)定了貨物的運(yùn)輸方法和運(yùn)輸路線。
TCP協(xié)議
我們已經(jīng)知道了IP協(xié)議很重要,IP協(xié)議已經(jīng)規(guī)定了數(shù)據(jù)傳輸?shù)闹饕獌?nèi)容,那TCP(Transmission Control Protocol)協(xié)議是做什么的呢?不知大家發(fā)現(xiàn)沒有,在IP協(xié)議中定義的傳輸是單向的,也就是說發(fā)出去的貨物對方有沒有收到我們是不知道的。就好像8毛錢一份的平信一樣。那對于重要的信件我們要寄掛號信怎么辦呢?TCP協(xié)議就是幫我們寄“掛號信”的。TCP協(xié)議提供了可靠的面向?qū)ο蟮臄?shù)據(jù)流傳輸服務(wù)的規(guī)則和約定。簡單的說在TCP模式中,對方發(fā)一個(gè)數(shù)據(jù)包給你,你要發(fā)一個(gè)確認(rèn)數(shù)據(jù)包給對方。通過這種確認(rèn)來提供可靠性。
TCP/IP(Transmission Control Protocol/Internet Protocol的簡寫,中文譯名為傳輸控制協(xié)議/互聯(lián)網(wǎng)絡(luò)協(xié)議)協(xié)議是Internet最基本的協(xié)議,簡單地說,就是由底層的IP協(xié)議和TCP協(xié)議組成的。TCP/IP協(xié)議的開發(fā)工作始于70年代,是用于互聯(lián)網(wǎng)的第一套協(xié)議。
1.1 TCP/IP參考模型
TCP/IP協(xié)議并不完全符合OSI的七層參考模型。傳統(tǒng)的開放式系統(tǒng)互連參考模型,是一種通信協(xié)議的7層抽象的參考模型,其中每一層執(zhí)行某一特定任務(wù)。該模型的目的是使各種硬件在相同的層次上相互通信。這7層是:物理層、數(shù)據(jù)鏈路層、網(wǎng)路層、傳輸層、話路層、表示層和應(yīng)用層。而TCP/IP通訊協(xié)議采用了4層的層級結(jié)構(gòu),每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來完成自己的需求。這4層分別為:
應(yīng)用層:應(yīng)用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協(xié)議(FTP)、網(wǎng)絡(luò)遠(yuǎn)程訪問協(xié)議(Telnet)等。
傳輸層:在此層中,它提供了節(jié)點(diǎn)間的數(shù)據(jù)傳送服務(wù),如傳輸控制協(xié)議(TCP)、用戶數(shù)據(jù)報(bào)協(xié)議(UDP)等,TCP和UDP給數(shù)據(jù)包加入傳輸數(shù)據(jù)并把它傳輸?shù)较乱粚又,這一層負(fù)責(zé)傳送數(shù)據(jù),并且確定數(shù)據(jù)已被送達(dá)并接收。
互連網(wǎng)絡(luò)層:負(fù)責(zé)提供基本的數(shù)據(jù)封包傳送功能,讓每一塊數(shù)據(jù)包都能夠到達(dá)目的主機(jī)(但不檢查是否被正確接收),如網(wǎng)際協(xié)議(IP)。
網(wǎng)絡(luò)接口層:對實(shí)際的網(wǎng)絡(luò)媒體的管理,定義如何使用實(shí)際網(wǎng)絡(luò)(如Ethernet、Serial Line等)來傳送數(shù)據(jù)。
1. 2 網(wǎng)間協(xié)議IP
Internet 上使用的一個(gè)關(guān)鍵的底層協(xié)議是網(wǎng)際協(xié)議,通常稱IP協(xié)議。我們利用一個(gè)共同遵守的通信協(xié)議,從而使 Internet 成為一個(gè)允許連接不同類型的計(jì)算機(jī)和不同操作系統(tǒng)的網(wǎng)絡(luò)。要使兩臺(tái)計(jì)算機(jī)彼此之間進(jìn)行通信,必須使兩臺(tái)計(jì)算機(jī)使用同一種"語言"。通信協(xié)議正像兩臺(tái)計(jì)算機(jī)交換信息所使用的共同語言,它規(guī)定了通信雙方在通信中所應(yīng)共同遵守的約定。
計(jì)算機(jī)的通信協(xié)議精確地定義了計(jì)算機(jī)在彼此通信過程的所有細(xì)節(jié)。例如,每臺(tái)計(jì)算機(jī)發(fā)送的信息格式和含義,在什么情況下應(yīng)發(fā)送規(guī)定的特殊信息,以及接收方的計(jì)算機(jī)應(yīng)做出哪些應(yīng)答等等。
網(wǎng)際協(xié)議IP協(xié)議提供了能適應(yīng)各種各樣網(wǎng)絡(luò)硬件的靈活性,對底層網(wǎng)絡(luò)硬件幾乎沒有任何要求,任何一個(gè)網(wǎng)絡(luò)只要可以從一個(gè)地點(diǎn)向另一個(gè)地點(diǎn)傳送二進(jìn)制數(shù)據(jù),就可以使用IP協(xié)議加入 Internet 了。
如果希望能在 Internet 上進(jìn)行交流和通信,則每臺(tái)連上 Internet 的計(jì)算機(jī)都必須遵守IP協(xié)議。為此使用 Internet 的每臺(tái)計(jì)算機(jī)都必須運(yùn)行IP軟件,以便時(shí)刻準(zhǔn)備發(fā)送或接收信息。
IP協(xié)議對于網(wǎng)絡(luò)通信有著重要的意義:網(wǎng)絡(luò)中的計(jì)算機(jī)通過安裝IP軟件,使許許多多的局域網(wǎng)絡(luò)構(gòu)成了一個(gè)龐大而又嚴(yán)密的通信系統(tǒng)。從而使 Internet 看起來好像是真實(shí)存在的,但實(shí)際上它是一種并不存在的虛擬網(wǎng)絡(luò),只不過是利用IP協(xié)議把全世界上所有愿意接入 Internet 的計(jì)算機(jī)局域網(wǎng)絡(luò)連接起來,使得它們彼此之間都能夠通信。
1.3 傳輸控制協(xié)議TCP
盡管計(jì)算機(jī)通過安裝IP軟件,從而保證了計(jì)算機(jī)之間可以發(fā)送和接收資料,但I(xiàn)P協(xié)議還不能解決資料分組在傳輸過程中可能出現(xiàn)的問題。因此,若要解決可能出現(xiàn)的問題,連上 Internet 的計(jì)算機(jī)還需要安裝TCP協(xié)議來提供可靠的并且無差錯(cuò)的通信服務(wù)。
TCP協(xié)議被稱作一種端對端協(xié)議。這是因?yàn)樗鼮閮膳_(tái)計(jì)算機(jī)之間的連接起了重要作用:當(dāng)一臺(tái)計(jì)算機(jī)需要與另一臺(tái)遠(yuǎn)程計(jì)算機(jī)連接時(shí),TCP協(xié)議會(huì)讓它們建立一個(gè)連接、發(fā)送和接收資料以及終止連接。
傳輸控制協(xié)議TCP協(xié)議利用重發(fā)技術(shù)和擁塞控制機(jī)制,向應(yīng)用程序提供可靠的通信連接,使它能夠自動(dòng)適應(yīng)網(wǎng)上的各種變化。即使在 Internet 暫時(shí)出現(xiàn)堵塞的情況下,TCP也能夠保證通信的可靠。
眾所周知, Internet 是一個(gè)龐大的國際性網(wǎng)絡(luò),網(wǎng)絡(luò)上的擁擠和空閑時(shí)間總是交替不定的,加上傳送的距離也遠(yuǎn)近不同,所以傳輸資料所用時(shí)間也會(huì)變化不定。TCP協(xié)議具有自動(dòng)調(diào)整"超時(shí)值"的功能,能很好地適應(yīng) Internet 上各種各樣的變化,確保傳輸數(shù)值的正確。
因此,從上面我們可以了解到:IP協(xié)議只保證計(jì)算機(jī)能發(fā)送和接收分組資料,而TCP協(xié)議則可提供一個(gè)可靠的、可流控的、全雙工的信息流傳輸服務(wù)。
綜上所述,雖然IP和TCP這兩個(gè)協(xié)議的功能不盡相同,也可以分開單獨(dú)使用,但它們是在同一時(shí)期作為一個(gè)協(xié)議來設(shè)計(jì)的,并且在功能上也是互補(bǔ)的。只有兩者的結(jié)合,才能保證 Internet 在復(fù)雜的環(huán)境下正常運(yùn)行。凡是要連接到 Internet 的計(jì)算機(jī),都必須同時(shí)安裝和使用這兩個(gè)協(xié)議,因此在實(shí)際中常把這兩個(gè)協(xié)議統(tǒng)稱作TCP/IP協(xié)議。
1. 4 IP地址及其分類
在Internet上連接的所有計(jì)算機(jī),從大型機(jī)到微型計(jì)算機(jī)都是以獨(dú)立的身份出現(xiàn),我們稱它為主機(jī)。為了實(shí)現(xiàn)各主機(jī)間的通信,每臺(tái)主機(jī)都必須有一個(gè)唯一的網(wǎng)絡(luò)地址。就好像每一個(gè)住宅都有唯一的門牌一樣,才不至于在傳輸資料時(shí)出現(xiàn)混亂。
Internet的網(wǎng)絡(luò)地址是指連入Internet網(wǎng)絡(luò)的計(jì)算機(jī)的地址編號。所以,在Internet網(wǎng)絡(luò)中,網(wǎng)絡(luò)地址唯一地標(biāo)識(shí)一臺(tái)計(jì)算機(jī)。
我們都已經(jīng)知道,Internet是由幾千萬臺(tái)計(jì)算機(jī)互相連接而成的。而我們要確認(rèn)網(wǎng)絡(luò)上的每一臺(tái)計(jì)算機(jī),靠的就是能唯一標(biāo)識(shí)該計(jì)算機(jī)的網(wǎng)絡(luò)地址,這個(gè)地址就叫做IP(Internet Protocol的簡寫)地址,即用Internet協(xié)議語言表示的地址。
目前,在Internet里,IP地址是一個(gè)32位的二進(jìn)制地址,為了便于記憶,將它們分為4組,每組8位,由小數(shù)點(diǎn)分開,用四個(gè)字節(jié)來表示,而且,用點(diǎn)分開的每個(gè)字節(jié)的數(shù)值范圍是0~255,如202.116.0.1,這種書寫方法叫做點(diǎn)數(shù)表示法。
IP地址可確認(rèn)網(wǎng)絡(luò)中的任何一個(gè)網(wǎng)絡(luò)和計(jì)算機(jī),而要識(shí)別其它網(wǎng)絡(luò)或其中的計(jì)算機(jī),則是根據(jù)這些IP地址的分類來確定的。一般將IP地址按節(jié)點(diǎn)計(jì)算機(jī)所在網(wǎng)絡(luò)規(guī)模的大小分為A,B,C三類,默認(rèn)的網(wǎng)絡(luò)屏蔽是根據(jù)IP地址中的第一個(gè)字段確定的。
1. A類地址
A類地址的表示范圍為:0.0.0.0~126.255.255.255,默認(rèn)網(wǎng)絡(luò)屏蔽為:255.0.0.0;A類地址分配給規(guī)模特別大的網(wǎng)絡(luò)使用。A類網(wǎng)絡(luò)用第一組數(shù)字表示網(wǎng)絡(luò)本身的地址,后面三組數(shù)字作為連接于網(wǎng)絡(luò)上的主機(jī)的地址。分配給具有大量主機(jī)(直接個(gè)人用戶)而局域網(wǎng)絡(luò)個(gè)數(shù)較少的大型網(wǎng)絡(luò)。例如IBM公司的網(wǎng)絡(luò)。
2. B類地址
B類地址的表示范圍為:128.0.0.0~191.255.255.255,默認(rèn)網(wǎng)絡(luò)屏蔽為:255.255.0.0;B類地址分配給一般的中型網(wǎng)絡(luò)。B類網(wǎng)絡(luò)用第一、二組數(shù)字表示網(wǎng)絡(luò)的地址,后面兩組數(shù)字代表網(wǎng)絡(luò)上的主機(jī)地址。
3. C類地址
C類地址的表示范圍為:192.0.0.0~223.255.255.255,默認(rèn)網(wǎng)絡(luò)屏蔽為:255.255.255.0;C類地址分配給小型網(wǎng)絡(luò),如一般的局域網(wǎng),它可連接的主機(jī)數(shù)量是最少的,采用把所屬的用戶分為若干的網(wǎng)段進(jìn)行管理。C類網(wǎng)絡(luò)用前三組數(shù)字表示網(wǎng)絡(luò)的地址,最后一組數(shù)字作為網(wǎng)絡(luò)上的主機(jī)地址。
RFC 1918留出了3塊IP地址空間(1個(gè)A類地址段,16個(gè)B類地址段,256個(gè)C類地址段)作為私有的內(nèi)部使用的地址。在這個(gè)范圍內(nèi)的IP地址不能被路由到Internet骨干網(wǎng)上;Internet路由器將丟棄該私有地址。
IP地址類別 RFC 1918內(nèi)部地址范圍
A類 10.0.0.0到10.255.255.255
B類 172.16.0.0到172.31.255.255
C類 192.168.0.0到192.168.255.255
使用私有地址將網(wǎng)絡(luò)連至Internet,需要將私有地址轉(zhuǎn)換為公有地址。這個(gè)轉(zhuǎn)換過程稱為網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,NAT),通常使用路由器來執(zhí)行NAT轉(zhuǎn)換。
實(shí)際上,還存在著D類地址和E類地址。但這兩類地址用途比較特殊,在這里只是簡單介紹一下:D類地址稱為廣播地址,供特殊協(xié)議向選定的節(jié)點(diǎn)發(fā)送信息時(shí)用。E類地址保留給將來使用。
連接到Internet上的每臺(tái)計(jì)算機(jī),不論其IP地址屬于哪類都與網(wǎng)絡(luò)中的其它計(jì)算機(jī)處于平等地位,因?yàn)橹挥蠭P地址才是區(qū)別計(jì)算機(jī)的唯一標(biāo)識(shí)。所以,以上IP地址的分類只適用于網(wǎng)絡(luò)分類。
在Internet中,一臺(tái)計(jì)算機(jī)可以有一個(gè)或多個(gè)IP地址,就像一個(gè)人可以有多個(gè)通信地址一樣,但兩臺(tái)或多臺(tái)計(jì)算機(jī)卻不能共享一個(gè)IP地址。如果有兩臺(tái)計(jì)算機(jī)的IP地址相同,則會(huì)引起異,F(xiàn)象,無論哪臺(tái)計(jì)算機(jī)都將無法正常工作。
順便提一下幾類特殊的IP地址:
1. 廣播地址 目的端為給定網(wǎng)絡(luò)上的所有主機(jī),一般主機(jī)段為全0
2. 單播地址 目的端為指定網(wǎng)絡(luò)上的單個(gè)主機(jī)地址
3. 組播地址 目的端為同一組內(nèi)的所有主機(jī)地址
4. 環(huán)回地址 127.0.0.1 在環(huán)回測試和廣播測試時(shí)會(huì)使用
1.5 子網(wǎng)的劃分
若公司不上Internet,那一定不會(huì)煩惱IP地址的問題,因?yàn)榭梢匀我馐褂盟械腎P地址,不管是A類或是B類,這個(gè)時(shí)候不會(huì)想到要用子網(wǎng),但若是上Internet那IP地址便彌足珍貴了,目前全球一陣Internet熱,IP地址已經(jīng)愈來愈少了,而所申請的IP地址目前也趨保守,而且只有經(jīng)申請的IP地址能在Internet使用,但對某些公司只能申請到一個(gè)C類的IP地址,但又有多個(gè)點(diǎn)需要使用,那這時(shí)便需要使用到子網(wǎng),這就需要考慮子網(wǎng)的劃分,下面簡介子網(wǎng)的原理及如何規(guī)劃。
1.5.1 子網(wǎng)掩碼(Subnet Mask)的介紹
設(shè)定任何網(wǎng)絡(luò)上的任何設(shè)備不管是主機(jī)、個(gè)人電腦、路由器等皆需要設(shè)定IP地址,而跟隨著IP地址的是所謂的子網(wǎng)掩碼(NetMask,Subnet Mask),這個(gè)子網(wǎng)掩碼主要的目的是由IP地址中也能獲得網(wǎng)絡(luò)編碼,也就是說IP地址和子網(wǎng)掩碼作和而得到網(wǎng)絡(luò)編碼,如下所示:
IP地址
192.10.10.6 11000000.00001010.00001010.00000110
子網(wǎng)掩碼
255.255.255.0 11111111.11111111.11111111.00000000
AND
-------------------------------------------------------------------
Network Number
192.10.10.0 11000000.00001010.00001010.00000000
子網(wǎng)掩碼有所謂的默認(rèn)值,如下所示
類 IP地址 范圍 子網(wǎng)掩碼
A 1.0.0.0-126.255.255.255 255.0.0.0
B 128.0.0.0-191.255.255.255 255.255.0.0
C 192.0.0.0-223.255.255.255 255.255.255.0
在預(yù)設(shè)的子網(wǎng)掩碼(Net Mask)都只有255的值,在談到子網(wǎng)掩碼(Subnet Mask)時(shí)這個(gè)值便不一定是255了。在完整一組C類地址中如203.67.10.0-203.67.10.255 子網(wǎng)掩碼255.255.255.0,203.67.10.0稱之網(wǎng)絡(luò)編碼(Network Number,將IP 地址和子網(wǎng)掩碼作和),而203.67.10.255是廣播的IP地址,所以這兩者皆不能使用,實(shí)際只能使用203.67.10.1--203.67.10.254等254個(gè)IP地址,這是以255.255.255.0作子網(wǎng)掩碼的結(jié)果,而所謂Subnet Msk尚可將整組C類地址分成數(shù)組網(wǎng)絡(luò)編碼,這要在子網(wǎng)掩碼上作手腳,若是要將整組C類地址分成2個(gè)網(wǎng)絡(luò)編碼那子網(wǎng)掩碼設(shè)定為255.255.255.192,若是要將整組C類分成8組網(wǎng)絡(luò)編碼則子網(wǎng)掩碼要為255.255.255.224,這是怎么來的,由以上知道網(wǎng)絡(luò)編碼是由IP地址和子網(wǎng)掩碼作AND而來的,而且將子網(wǎng)掩碼以二進(jìn)制表示法知道是1的會(huì)保留,而為0的去掉
192.10.10.193--11000000.00001010.00001010.10000001
255.255.255.0--11111111.11111111.11111111.00000000
--------------------------------------------------------------
192.10.10.0--11000000.00001010.00001010.00000000
以上是以255.255.255.0為子網(wǎng)掩碼的結(jié)果,網(wǎng)絡(luò)編碼是192.10.10.0,若是使用255.255.255.224作子網(wǎng)掩碼結(jié)果便有所不同
192.10.10.193--11000000.00001010.00001010.10000000
255.255.255.224--11111111.11111111.11111111.11100000
--------------------------------------------------------------
192.10.10.192--11000000.00001010.00001010.10000000
此時(shí)網(wǎng)絡(luò)編碼變成了192.10.10.192,這便是子網(wǎng)。那要如何決定所使用的子網(wǎng)掩碼,255.255.255.224以二進(jìn)制表示法為11111111.11111111.11111111.11100000,變化是在最后一組,11100000便是224,以三個(gè)位(Bit)可表示2的3次方便是8個(gè)網(wǎng)絡(luò)編碼
子網(wǎng)掩碼二進(jìn)制表示法可分幾個(gè)網(wǎng)絡(luò)
255.255.255.011111111.11111111.11111111.000000001
255.255.255.128
11111111.11111111.11111111.100000002
255.255.255.192
11111111.11111111.11111111.110000004
255.255.255.224
11111111.11111111.11111111.111000008
255.255.255.240
11111111.11111111.11111111.1111000016
255.255.255.248
11111111.11111111.11111111.1111100032
255.255.255.252
11111111.11111111.11111111.1111110064
以下使用255.255.255.224將C類地址203.67.10.0分成8組網(wǎng)絡(luò)編碼,各個(gè)網(wǎng)絡(luò)編碼及其廣播IP地址及可使用之IP地址序號網(wǎng)絡(luò)編碼廣播可使用之IP地址
。1)203.67.10.0--203.67.10.31
203.67.10.1--203.67.10.30
。2)203.67.10.32--203.67.10.63
203.67.10.33--203.67.10.62
(3)203.67.10.64--203.67.10.95
203.67.10.65--203.67.10.94
。4)203.67.10.96--203.67.10.127
203.67.10.97--203.67.10.126
(5)203.67.10.128--203.67.10.159
203.67.10.129--203.67.10.158
。6)203.67.10.160--203.67.10.191
203.67.10.161--203.67.10.190
(7)203.67.10.192--203.67.10.223
203.67.10.193--203.67.10.222
。8)203.67.10.224--203.67.10.255
203.67.10.225--203.67.10.254
可驗(yàn)證所使用的IP地址是否如上表所示
203.67.10.115--11001011.01000011.00001010.01110011
255.255.255.224--11111111.11111111.11111111.11100000
--------------------------------------------------------------
203.67.10.96--11001011.01000011.00001010.01100000
203.67.10.55--11001011.01000011.00001010.00110111
255.255.255.224--11111111.11111111.11111111.11100000
--------------------------------------------------------------
203.67.10.32--11001011.01000011.00001010.00100000
其它的子網(wǎng)掩碼所分成的網(wǎng)絡(luò)編碼可自行以上述方法自行推演出來。
1.5.3 子網(wǎng)的應(yīng)用
使用子網(wǎng)是要解決只有一組C類地址但需要數(shù)個(gè)網(wǎng)絡(luò)編碼的問題,并不是解決IP地址不夠用的問題,因?yàn)槭褂米泳W(wǎng)反而能使用的IP地址會(huì)變少,子網(wǎng)通常是使用在跨地域的網(wǎng)絡(luò)互聯(lián)之中,兩者之間使用路由器連線,同時(shí)也上Internet,但只申請到一組C 類IP地址,過路由又需不同的網(wǎng)絡(luò),所以此時(shí)就必須使用到子網(wǎng),當(dāng)然二網(wǎng)絡(luò)間也可以遠(yuǎn)程橋接(Remote Bridge,字面翻譯)連接,那便沒有使用子網(wǎng)的問題。
網(wǎng)關(guān)地址
若要使兩個(gè)完全不同的網(wǎng)絡(luò)(異構(gòu)網(wǎng))連接在一起,一般使用網(wǎng)關(guān),在Internet中兩個(gè)網(wǎng)絡(luò)也要通過一臺(tái)稱為網(wǎng)關(guān)的計(jì)算機(jī)實(shí)現(xiàn)互聯(lián)。這臺(tái)計(jì)算機(jī)能根據(jù)用戶通信目標(biāo)計(jì)算機(jī)的IP地址,決定是否將用戶發(fā)出的信息送出本地網(wǎng)絡(luò),同時(shí),它還將外界發(fā)送給屬于本地網(wǎng)絡(luò)計(jì)算機(jī)的信息接收過來,它是一個(gè)網(wǎng)絡(luò)與另一個(gè)網(wǎng)絡(luò)相聯(lián)的通道。為了使TCP/IP協(xié)議能夠?qū)ぶ,該通道被賦予一個(gè)IP地址,這個(gè)IP地址稱為網(wǎng)關(guān)地址。
完美測試TCP/IP協(xié)議簡介
安裝網(wǎng)絡(luò)硬件和網(wǎng)絡(luò)協(xié)議之后,我們一般要進(jìn)行TCP/IP協(xié)議的測試工作,那么怎樣測試才算是比較全面的測試呢?我們認(rèn)為,全面的測試應(yīng)包括局域網(wǎng)和互聯(lián)網(wǎng)兩個(gè)方面,因此應(yīng)從局域網(wǎng)和互聯(lián)網(wǎng)兩個(gè)方面測試,以下是我們在實(shí)際工作中利用命令行測試TCP/IP配置的步驟:
1、 單擊“開始”/“運(yùn)行”,輸入CMD按回車,打開命令提示符窗口。
2、 首先檢查IP地址、子網(wǎng)掩碼、默認(rèn)網(wǎng)關(guān)、DNS服務(wù)器地址是否正確,輸入命令ipconfig /all,按回車。此時(shí)顯示了你的網(wǎng)絡(luò)配置,觀查是否正確。
3、 輸入ping 127.0.0.1,觀查網(wǎng)卡是否能轉(zhuǎn)發(fā)數(shù)據(jù),如果出現(xiàn)“Request timed out”,表明配置差錯(cuò)或網(wǎng)絡(luò)有問題。
4、 Ping一個(gè)互聯(lián)網(wǎng)地址,如ping 202.102.128.68,看是否有數(shù)據(jù)包傳回,以驗(yàn)證與互聯(lián)網(wǎng)的連接性。
5、 Ping 一個(gè)局域網(wǎng)地址,觀查與它的連通性。
6、 用nslookup測試DNS解析是否正確,輸入如nslookup www.ccidnet.com,查看是否能解析。
如果你的計(jì)算機(jī)通過了全部測試,則說明網(wǎng)絡(luò)正常,否則網(wǎng)絡(luò)可能有不同程度的問題。在此不展開詳述。不過,要注意,在使用 ping命令時(shí),有些公司會(huì)在其主機(jī)設(shè)置丟棄ICMP數(shù)據(jù)包,造成你的ping命令無法正常返回?cái)?shù)據(jù)包,不防換個(gè)網(wǎng)站試試。
補(bǔ)充:
TCP/IP 協(xié)議簇
TCP/IP(Transmission Control Protocol/Internet Protocol)已成為一個(gè)事實(shí)上的工業(yè)
標(biāo)準(zhǔn)。
TCP/IP是一組協(xié)議的代名詞,它還包括許多協(xié)議,組成了TCP/IP協(xié)議簇。
TCP/IP協(xié)議簇分為四層,IP位于協(xié)議簇的第二層(對應(yīng)OSI的第三層),TCP位于協(xié)議簇的第
三層(對應(yīng)OSI的第四層)。
TCP和IP是TCP/IP協(xié)議簇的中間兩層,是整個(gè)協(xié)議簇的核心,起到了承上啟下的作用。
1、接口層
TCP/IP的最低層是接口層,常見的接口層協(xié)議有:
Ethernet 802.3、Token Ring 802.5、X.25、Frame reley、HDLC、PPP等。
2、網(wǎng)絡(luò)層
網(wǎng)絡(luò)層包括:IP(Internet Protocol)協(xié)議、ICMP(Internet Control Message Protocol)
控制報(bào)文協(xié)議、ARP(Address Resolution Protocol)地址轉(zhuǎn)換協(xié)議、RARP(Reverse ARP)反向
地址轉(zhuǎn)換協(xié)議。
IP是網(wǎng)絡(luò)層的核心,通過路由選擇將下一跳IP封裝后交給接口層。IP數(shù)據(jù)報(bào)是無連接服務(wù)
。
ICMP是網(wǎng)絡(luò)層的補(bǔ)充,可以回送報(bào)文。用來檢測網(wǎng)絡(luò)是否通暢。
Ping命令就是發(fā)送ICMP的echo包,通過回送的echo relay進(jìn)行網(wǎng)絡(luò)測試。
ARP是正向地址解析協(xié)議,通過已知的IP,尋找對應(yīng)主機(jī)的MAC地址。
RARP是反向地址解析協(xié)議,通過MAC地址確定IP地址。比如無盤工作站和DHCP服務(wù)。
3、傳輸層
傳輸層協(xié)議主要是:傳輸控制協(xié)議TCP(Transmission Control Protocol)和用戶數(shù)據(jù)報(bào)協(xié)
議UDP(User Datagram rotocol)。
TCP是面向連接的通信協(xié)議,通過三次握手建立連接,通訊時(shí)完成時(shí)要拆除連接,由于TCP
是面向連接的所以只能用于點(diǎn)對點(diǎn)的通訊。
TCP提供的是一種可靠的數(shù)據(jù)流服務(wù),采用“帶重傳的肯定確認(rèn)”技術(shù)來實(shí)現(xiàn)傳輸?shù)目煽?br> 性。TCP還采用一種稱為“滑動(dòng)窗口”的方式進(jìn)行流量控制,所謂窗口實(shí)際表示接收能力,用
以限制發(fā)送方的發(fā)送速度。
UDP是面向無連接的通訊協(xié)議,UDP數(shù)據(jù)包括目的端口號和源端口號信息,由于通訊不需要
連接,所以可以實(shí)現(xiàn)廣播發(fā)送。
UDP通訊時(shí)不需要接收方確認(rèn),屬于不可靠的傳輸,可能會(huì)出丟包現(xiàn)象,實(shí)際應(yīng)用中要求
在程序員編程驗(yàn)證。
4、應(yīng)用層
應(yīng)用層一般是面向用戶的服務(wù)。如FTP、TELNET、DNS、SMTP、POP3。
FTP(File Transmision Protocol)是文件傳輸協(xié)議,一般上傳下載用FTP服務(wù),數(shù)據(jù)端口
是20H,控制端口是21H。
Telnet服務(wù)是用戶遠(yuǎn)程登錄服務(wù),使用23H端口,使用明碼傳送,保密性差、簡單方便。
DNS(Domain Name Service)是域名解析服務(wù),提供域名到IP地址之間的轉(zhuǎn)換。
SMTP(Simple Mail Transfer Protocol)是簡單郵件傳輸協(xié)議,用來控制信件的發(fā)送、中
轉(zhuǎn)!
POP3(Post Office Protocol 3)是郵局協(xié)議第3版本,用于接收郵件。
數(shù)據(jù)格式:
數(shù)據(jù)幀:幀頭+I(xiàn)P數(shù)據(jù)包+幀尾 (幀頭包括源和目標(biāo)主機(jī)MAC地址及類型,幀尾是校驗(yàn)字)
IP數(shù)據(jù)包:IP頭部+TCP數(shù)據(jù)信息 (IP頭包括源和目標(biāo)主機(jī)IP地址、類型、生存期等)
TCP數(shù)據(jù)信息:TCP頭部+實(shí)際數(shù)據(jù) (TCP頭包括源和目標(biāo)主機(jī)端口號、順序號、確認(rèn)號、校
驗(yàn)字等)
TCP/IP的實(shí)現(xiàn)
這是一個(gè)給予UDP協(xié)議的TCP/IP網(wǎng)絡(luò)的C程序?qū)崿F(xiàn)。客戶端應(yīng)用層發(fā)起會(huì)話層的socket調(diào)用,在到達(dá)遠(yuǎn)端后,服務(wù)器端應(yīng)用程序屏幕輸出字符串 Hello World
第一步 創(chuàng)建文件名為server.c的文件,然后拷貝以下代碼到此文件:
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXBUF 256
main()
{
char buf[MAXBUF];
int passiveSocket;
socklen_t clientAddrLen;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
passiveSocket=socket(AF_INET,SOCK_DGRAM,0);
memset(&serverAddr,0,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons(1234);
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);/* serverAddr.sin_addr.s_addr = inet_addr(”127.0.0.1″); */
if(bind (passiveSocket,(struct sockaddr *)&serverAddr,sizeof(serverAddr))==-1)
printf (”bind Error!”);
clientAddrLen=sizeof(serverAddr);
memset(buf,0,MAXBUF);
for(;;)
{
if(recvfrom(passiveSocket,buf,MAXBUF,0,(struct sockaddr *)&clientAddr,&clientAddrLen)>0)
{
printf(”Come from Client is : %s
”, buf);
memset (buf,0,sizeof(buf));
}
}
}
第二步 編譯并運(yùn)行server程序.在命令行下進(jìn)入到server.c所在的文件夾,輸入下列命令(黑體字為輸入部分)
[root@Linux test]#gcc -c server.c
[root@Linux test]#gcc -o server server.o
[root@website program]#./server
第三步 完成以上步驟,server程序已經(jīng)運(yùn)行,這個(gè)窗口不要關(guān),另開一個(gè)新窗口,輸入
[root@Linux test]# netstat -an | grep 1234
udp 0 0 0.0.0.0:1234 0.0.0.0:*
您會(huì)發(fā)現(xiàn)運(yùn)行中的server程序已經(jīng)被捆綁在udp的1234端口.
第四步 創(chuàng)建文件名為client.c的文件,然后拷貝以下代碼到此文件:
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXBUF 256
main()
{
char buf[MAXBUF]=”Hello World”;
int activeSocket;
struct sockaddr_in remoteAddr;
struct sockaddr_in localAddr;
struct hostent *hptr;
activeSocket=socket(AF_INET,SOCK_DGRAM,0);
memset(&remoteAddr,0,sizeof(remoteAddr));
remoteAddr.sin_family=AF_INET;
remoteAddr.sin_port=htons(1234);
remoteAddr.sin_addr.s_addr=inet_addr(”127.0.0.1″);
/*hptr=gethostbyname(”www.aorb.org”);
memcpy((char*)&remoteAddr.sin_addr.s_addr,hptr->h_addr_list[0],hptr->h_length);*/
printf(”Remote IP address is: %s…
”,inet_ntoa(remoteAddr.sin_addr));
sendto (activeSocket,buf,sizeof(buf),0,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr));
printf(”Send Success!
”);
memset (buf,0,sizeof(buf));
close(activeSocket);
}
第五步 編譯并運(yùn)行client程序.打開一個(gè)新命令窗口,在命令行下進(jìn)入到client.c所在的文件夾,輸入下列命令:
[root@Linux test]#gcc -c client.c
[root@Linux test]#gcc -o client client.o
[root@Linux test]#./client
第六步 觀察效果.現(xiàn)在點(diǎn)到server程序運(yùn)行的窗口,看是不是出現(xiàn)了這樣一句話
Come from Client is : Hello World
上面的Hello World這句話就是客戶端client.c發(fā)來的.
程序注釋
server.c
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
以上是加載頭文件,頭文件里定義了一些程序運(yùn)行時(shí)需要的東東,不用管它.
#define MAXBUF 256
定義了常量MAXBUF的值256,下面會(huì)用到.當(dāng)然您也可以不用定義,在后面的數(shù)組里直接寫256這個(gè)數(shù)字也可以
main()
{
char buf[MAXBUF];字符串?dāng)?shù)組buf的大小是256
int passiveSocket;定義一個(gè)int類型的變量passiveSocket,它用來存儲(chǔ)套接字描述符
socklen_t clientAddrLen;定義一個(gè)socklen_t類型的變量clientAddrlen,用來接收客戶端地址的長度
struct sockaddr_in serverAddr;定義一個(gè)sockaddr_in類型的結(jié)構(gòu)變量serverAddr,用來存儲(chǔ)服務(wù)器端的IP地址,端口等信息
struct sockaddr_in clientAddr;定義一個(gè)sockaddr_in類型的結(jié)構(gòu)變量clientAddr,用來存儲(chǔ)客戶端的IP地址,端口等信息
passiveSocket=socket(AF_INET,SOCK_DGRAM,0);socket函數(shù)需要傳遞3個(gè)值: 對于使用IPV4的網(wǎng)絡(luò)接口,第1個(gè)參數(shù)必須是AF_INET.由于是UDP傳輸方式,第2個(gè)參數(shù)必須是SOCK_DGRAM.對于使用TCP或者UDP的傳輸,第3個(gè)參數(shù)都設(shè)置為0
memset(&serverAddr,0,sizeof(serverAddr));初始化變量serverAddr,使其為數(shù)字0
serverAddr.sin_family=AF_INET;把serverAddr結(jié)構(gòu)中的sin_family變量賦值為AF_INET,這個(gè)值表示TCP/IP網(wǎng)絡(luò)
serverAddr.sin_port=htons(1234);把serverAddr結(jié)構(gòu)中的sin_port變量賦值為1234,這個(gè)值代表服務(wù)器的接收端口為1234,您可以自行設(shè)置.htons函數(shù)是必須的,它把主機(jī)字節(jié)順序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)順序
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);/* serverAddr.sin_addr.s_addr = inet_addr(”127.0.0.1″); */設(shè)置要綁定服務(wù)器的哪個(gè)IP地址.使用INADDR_ANY可以把服務(wù)器綁定在本機(jī)的所有IP地址.也可以使用inet_addr捆綁在特定端口.因?yàn)镮P地址是32位的,所以需要使用htonl來轉(zhuǎn)換網(wǎng)絡(luò)字節(jié)順序,而htons是用來轉(zhuǎn)換2個(gè)字節(jié)16位的端口地址.
if(bind (passiveSocket,(struct sockaddr *)&serverAddr,sizeof(serverAddr))==-1)
printf (”bind Error!”);使用bind函數(shù)把剛才創(chuàng)建的套接字描述符passiveSocket與服務(wù)器套接字結(jié)構(gòu)serverAddr捆綁在一起.
clientAddrLen=sizeof(serverAddr);
memset(buf,0,MAXBUF);初始化buf數(shù)組,設(shè)置為數(shù)字0
for(;;)因?yàn)槭欠⻊?wù)器端程序,需要一直打開接收來自客戶端的請求,所以必須創(chuàng)建一個(gè)死循環(huán)
{
if(recvfrom(passiveSocket,buf,MAXBUF,0,(struct sockaddr *)&clientAddr,&clientAddrLen)>0)利用recvfrom函數(shù)接收來自客戶端的信息,并把信息存放在數(shù)組buf中.同時(shí)也把客戶端的地址存放在了clientAddr中,方便信息的回送,本例服務(wù)器端為使用回送.
{
printf(”Come from Client is : %s
”, buf);打印輸出來buf中自客戶端的信息
memset (buf,0,sizeof(buf));清空buf
}
}
}
client.c
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
以上是加載頭文件,頭文件里定義了一些程序運(yùn)行時(shí)需要的數(shù)據(jù).
#define MAXBUF 256 定義了常量MAXBUF的值256,下面會(huì)用到.當(dāng)然您也可以不用定義,在后面的數(shù)組里直接寫256這個(gè)數(shù)字也可以
main()
{
char buf[MAXBUF]=”Hello World”;給buf數(shù)組賦值為Hello World,這個(gè)字符串是后面要傳送給服務(wù)器的信息.
int activeSocket;定義一個(gè)整型變量activeSocket,它用來存儲(chǔ)套接字描述符.
struct sockaddr_in remoteAddr;同server.c中注釋,設(shè)置Internet套接字地址結(jié)構(gòu)變量remoteAddr
struct sockaddr_in localAddr;同server.c中注釋,設(shè)置Internet套接字地址結(jié)構(gòu)變量localAddr
struct hostent *hptr; 如果鏈接遠(yuǎn)程服務(wù)器使用URL的方式,則需定義此變量用來接收解析后的IP地址.
activeSocket=socket(AF_INET,SOCK_DGRAM,0);同server.c中的注釋,創(chuàng)建一個(gè)套接字結(jié)構(gòu),成功創(chuàng)建后把返回的套接字描述符存儲(chǔ)在activeSocket
memset(&remoteAddr,0,sizeof(remoteAddr));同server.c中的注釋
remoteAddr.sin_family=AF_INET;同server.c中注釋
remoteAddr.sin_port=htons(1234);設(shè)置遠(yuǎn)程服務(wù)器的端口地址
remoteAddr.sin_addr.s_addr=inet_addr(”127.0.0.1″);設(shè)置遠(yuǎn)程服務(wù)器的IP地址,本例因?yàn)榉⻊?wù)器和客戶端在同一臺(tái)機(jī)器上,所以使用同一個(gè)地址.
/*hptr=gethostbyname(”www.aorb.org”);
memcpy((char*)&remoteAddr.sin_addr.s_addr,hptr->h_addr_list[0],hptr->h_length);*/
如果鏈接遠(yuǎn)程服務(wù)器使用URL,則需要用gethostbyname函數(shù)得到預(yù)解析URL的地址儲(chǔ)存在hptr結(jié)構(gòu)中,然后把hptr結(jié)構(gòu)中的h_addr_list[0]值拷貝到套接字remoteAddr.sin_addr.s_addr變量. memcpy函數(shù)就是起到拷貝的作用.
printf(”Remote IP address is: %s…
”,inet_ntoa(remoteAddr.sin_addr));顯示遠(yuǎn)程服務(wù)器的地址,這一步不是必須的.
sendto (activeSocket,buf,sizeof(buf),0,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr));發(fā)從存儲(chǔ)在數(shù)組buf中的信息,也就是發(fā)送”Hello World”字符串到remoteAddr中指定的IP地址與端口.
printf(”Send Success!
”);如果sendto成功則顯示Send Success!
memset (buf,0,sizeof(buf));重置buf數(shù)組
close(activeSocket);關(guān)閉activeSocket套接字釋放內(nèi)存.
}
程序原理
在UNIX系統(tǒng)中,進(jìn)程若對文件進(jìn)行操作,一般使用open函數(shù)調(diào)用打開一個(gè)文件進(jìn)行訪問,每個(gè)進(jìn)程都有一個(gè)文件描述符表,該表中存放了被進(jìn)程打開的文件的索引(也稱文件描述符),索引指出了文件在文件描述符表中的位置,這個(gè)索引值是一個(gè)指向操作系統(tǒng)文件表的指針.應(yīng)用程序只要使用該描述符就可以對指定文件進(jìn)行操作.類似的,每個(gè)打開的socket函數(shù)都對應(yīng)一個(gè)整數(shù),我們稱它為socket描述符,該整數(shù)也是socket描述符在文件描述符表中的索引值.但socket描述符在描述符表中的表項(xiàng)并不指向文件表,而是指向一個(gè)與該socket有關(guān)的數(shù)據(jù)結(jié)構(gòu)