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