TCPIP協定

TCPIP協定

TCP/IP(Transmission Control Protocol/Internet Protocol的簡寫,中文譯名為傳輸控制協定/網際網路協定)協定是Internet最基本的協定,簡單地說,就是由底層的IP協定和TCP協定組成的。


TCPIP協定TCPIP協定

什麼是 TCP/IP?
TCP/IP 是供已連線網際網路的計算機進行通信的通信協定。
是指傳輸控制協定/網際協定 (Transmission Control Protocol / Internet Protocol)。它定義了電子設備(比如計算機)如何連入網際網路,以及數據如何在它們之間傳輸的標準。 TCP/IP的通訊協定
這部分簡要介紹一下TCP/IP的內部結構,為討論與網際網路有關的安全問題打下基礎。TCP/IP協定組之所以流行,部分原因是因為它可以用在各種各樣的信道和底層協定(例如T1和X.25、乙太網以及RS-232串列接口)之上。確切地說,TCP/IP協定是一組包括TCP協定和IP協定,UDP(User Datagram Protocol)協定、ICMP(Internet Control Message Protocol)協定和其他一些協定的協定組。
TCP/IP整體構架概述
TCP/IP協定並不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協定的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和套用層。而TCP/IP通訊協定採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這4層分別為:
套用層:應用程式間溝通的層,如簡單電子郵件傳輸(SMTP)、檔案傳輸協定(FTP)、網路遠程訪問協定(Telnet)等。
傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協定(TCP)、用戶數據報協定(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中,這一層負責傳送數據,並且確定數據已被送達並接收。
互連網路層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協定(IP)。
網路接口層:對實際的網路媒體的管理,定義如何使用實際網路(如Ethernet、Serial Line等)來傳送數據。
TCP/IP中的協定
以下簡單介紹TCP/IP中的協定都具備什麼樣的功能,都是如何工作的:
1. IP
網際協定IP是TCP/IP的心臟,也是網路層中最重要的協定。
IP層接收由更低層(網路接口層例如乙太網設備驅動程式)發來的數據包,並把該數據包傳送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因為IP並沒有做任何事情來確認數據包是按順序傳送的或者沒有被破壞。IP數據包中含有傳送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。
高層的TCP和UDP服務在接收數據包時,通常假設包中的源地址是有效的。也可以這樣說,IP位址形成了許多服務的認證基礎,這些服務相信數據包是從一個有效的主機傳送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對於一些TCP和UDP的服務來說,使用了該選項的IP包好像是從路徑上的最後一個系統傳遞過來的,而不是來自於它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統來進行平常是被禁止的連線。那么,許多依靠IP源地址做確認的服務將產生問題並且會被非法入侵。
2. TCP
如果IP數據包中有已經封好的TCP數據包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序並進行錯誤檢查,同時實現虛電路間的連線。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
TCP將它的信息送到更高層的應用程式,例如Telnet的服務程式和客戶程式。應用程式輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅動程式和物理介質,最後到接收方。
面向連線的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(傳送和接收域名資料庫),但使用UDP傳送有關單個主機的信息。
3.UDP
UDP與TCP位於同一層,但它不管數據包的順序、錯誤或重發。因此,UDP不被套用於那些使用虛電路的面向連線的服務,UDP主要用於那些面向查詢---應答的服務,例如NFS。相對於FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網路時間協定)和DNS(DNS也使用TCP)。
欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連線(也可以稱為握手)(因為在兩個系統間沒有虛電路),也就是說,與UDP相關的服務面臨著更大的危險。
4.ICMP
ICMP與IP位於同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關通向目的地址的路徑信息。ICMP的‘Redirect’信息通知主機通向其他系統的更準確的路徑,而‘Unreachable’信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連線‘體面地’終止。PING是最常用的基於ICMP的服務。
5. TCP和UDP的連線埠結構
TCP和UDP服務通常有一個客戶/伺服器的關係,例如,一個Telnet服務進程開始在系統上處於空閒狀態,等待著連線。用戶使用Telnet客戶程式與服務進程建立一個連線。客戶程式向服務進程寫入信息,服務進程讀出信息並發出回響,客戶程式讀出回響並向用戶報告。因而,這個連線是雙工的,可以用來進行讀寫。
兩個系統間的多重Telnet連線是如何相互確認並協調一致呢?TCP或UDP連線唯一地使用每個信息中的如下四項進行確認:
源IP位址 傳送包的IP位址。
目的IP位址 接收包的IP位址。
源連線埠 源系統上的連線的連線埠。
目的連線埠 目的系統上的連線的連線埠。
連線埠是一個軟體結構,被客戶程式或服務進程用來傳送和接收信息。一個連線埠對應一個16比特的數。服務進程通常使用一個固定的連線埠,例如,SMTP使用25、xwindows使用6000。這些連線埠號是‘廣為人知’的,因為在建立與特定的主機或服務的連線時,需要這些地址和目的地址進行通訊。
IP(Internet Protocol)協定的英文名直譯就是:網際網路協定。從這個名稱我們就可以知道IP協定的重要性。在現實生活中,我們進行貨物運輸時都是把貨物包裝成一個個的紙箱或者是貨櫃之後才進行運輸,在網路世界中各種信息也是通過類似的方式進行傳輸的。IP協定規定了數據傳輸時的基本單元和格式。如果比作貨物運輸,IP協定規定了貨物打包時的包裝箱尺寸和包裝的程式。 除了這些以外,IP協定還定義了數據包的遞交辦法和路由選擇。同樣用貨物運輸做比喻,IP協定規定了貨物的運輸方法和運輸路線。
TCP協定
我們已經知道了IP協定很重要,IP協定已經規定了數據傳輸的主要內容,那TCP(Transmission Control Protocol)協定是做什麼的呢?不知大家發現沒有,在IP協定中定義的傳輸是單向的,也就是說發出去的貨物對方有沒有收到我們是不知道的。就好像8毛錢一份的平信一樣。那對於重要的信件我們要寄掛號信怎么辦呢?TCP協定就是幫我們寄“掛號信”的。TCP協定提供了可靠的面向對象的數據流傳輸服務的規則和約定。簡單的說在TCP模式中,對方發一個數據包給你,你要發一個確認數據包給對方。通過這種確認來提供可靠性。
TCP/IP(Transmission Control Protocol/Internet Protocol的簡寫,中文譯名為傳輸控制協定/網際網路協定)協定是Internet最基本的協定,簡單地說,就是由底層的IP協定和TCP協定組成的。TCP/IP協定的開發工作始於70年代,是用於網際網路的第一套協定。
1.1 TCP/IP參考模型
TCP/IP協定並不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協定的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網路層、傳輸層、話路層、表示層和套用層。而TCP/IP通訊協定採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這4層分別為:
套用層:應用程式間溝通的層,如簡單電子郵件傳輸(SMTP)、檔案傳輸協定(FTP)、網路遠程訪問協定(Telnet)等。
傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協定(TCP)、用戶數據報協定(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中,這一層負責傳送數據,並且確定數據已被送達並接收。
互連網路層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協定(IP)。
網路接口層:對實際的網路媒體的管理,定義如何使用實際網路(如Ethernet、Serial Line等)來傳送數據。
1. 2 網間協定IP
Internet 上使用的一個關鍵的底層協定是網際協定,通常稱IP協定。我們利用一個共同遵守的通信協定,從而使 Internet 成為一個允許連線不同類型的計算機和不同作業系統的網路。要使兩台計算機彼此之間進行通信,必須使兩台計算機使用同一種"語言"。通信協定正像兩台計算機交換信息所使用的共同語言,它規定了通信雙方在通信中所應共同遵守的約定。
計算機的通信協定精確地定義了計算機在彼此通信過程的所有細節。例如,每台計算機傳送的信息格式和含義,在什麼情況下應傳送規定的特殊信息,以及接收方的計算機應做出哪些應答等等。
網際協定IP協定提供了能適應各種各樣網路硬體的靈活性,對底層網路硬體幾乎沒有任何要求,任何一個網路只要可以從一個地點向另一個地點傳送二進制數據,就可以使用IP協定加入 Internet 了。
如果希望能在 Internet 上進行交流和通信,則每台連上 Internet 的計算機都必須遵守IP協定。為此使用 Internet 的每台計算機都必須運行IP軟體,以便時刻準備傳送或接收信息。
IP協定對於網路通信有著重要的意義:網路中的計算機通過安裝IP軟體,使許許多多的區域網路構成了一個龐大而又嚴密的通信系統。從而使 Internet 看起來好像是真實存在的,但實際上它是一種並不存在的虛擬網路,只不過是利用IP協定把全世界上所有願意接入 Internet 的計算機區域網路連線起來,使得它們彼此之間都能夠通信。
1.3 傳輸控制協定TCP
儘管計算機通過安裝IP軟體,從而保證了計算機之間可以傳送和接收資料,但IP協定還不能解決資料分組在傳輸過程中可能出現的問題。因此,若要解決可能出現的問題,連上 Internet 的計算機還需要安裝TCP協定來提供可靠的並且無差錯的通信服務。
TCP協定被稱作一種端對端協定。這是因為它為兩台計算機之間的連線起了重要作用:當一台計算機需要與另一台遠程計算機連線時,TCP協定會讓它們建立一個連線、傳送和接收資料以及終止連線。
傳輸控制協定TCP協定利用重發技術和擁塞控制機制,向應用程式提供可靠的通信連線,使它能夠自動適應網上的各種變化。即使在 Internet 暫時出現堵塞的情況下,TCP也能夠保證通信的可靠。
眾所周知, Internet 是一個龐大的國際性網路,網路上的擁擠和空閒時間總是交替不定的,加上傳送的距離也遠近不同,所以傳輸資料所用時間也會變化不定。TCP協定具有自動調整"逾時值"的功能,能很好地適應 Internet 上各種各樣的變化,確保傳輸數值的正確。
因此,從上面我們可以了解到:IP協定只保證計算機能傳送和接收分組資料,而TCP協定則可提供一個可靠的、可流控的、全雙工的信息流傳輸服務。
綜上所述,雖然IP和TCP這兩個協定的功能不盡相同,也可以分開單獨使用,但它們是在同一時期作為一個協定來設計的,並且在功能上也是互補的。只有兩者的結合,才能保證 Internet 在複雜的環境下正常運行。凡是要連線到 Internet 的計算機,都必須同時安裝和使用這兩個協定,因此在實際中常把這兩個協定統稱作TCP/IP協定。
1. 4 IP位址及其分類
在Internet上連線的所有計算機,從大型機到微型計算機都是以獨立的身份出現,我們稱它為主機。為了實現各主機間的通信,每台主機都必須有一個唯一的網路地址。就好像每一個住宅都有唯一的門牌一樣,才不至於在傳輸資料時出現混亂。
Internet的網路地址是指連入Internet網路的計算機的地址編號。所以,在Internet網路中,網路地址唯一地標識一台計算機。
我們都已經知道,Internet是由幾千萬台計算機互相連線而成的。而我們要確認網路上的每一台計算機,靠的就是能唯一標識該計算機的網路地址,這個地址就叫做IP(Internet Protocol的簡寫)地址,即用Internet協定語言表示的地址。
目前,在Internet里,IP位址是一個32位的二進制地址,為了便於記憶,將它們分為4組,每組8位,由小數點分開,用四個位元組來表示,而且,用點分開的每個位元組的數值範圍是0~255,如202.116.0.1,這種書寫方法叫做點數表示法。
IP位址可確認網路中的任何一個網路和計算機,而要識別其它網路或其中的計算機,則是根據這些IP位址的分類來確定的。一般將IP位址按節點計算機所在網路規模的大小分為A,B,C三類,默認的網路禁止是根據IP位址中的第一個欄位確定的。
1. A類地址
A類地址的表示範圍為:0.0.0.0~126.255.255.255,默認網路禁止為:255.0.0.0;A類地址分配給規模特別大的網路使用。A類網路用第一組數字表示網路本身的地址,後面三組數字作為連線於網路上的主機的地址。分配給具有大量主機(直接個人用戶)而區域網路個數較少的大型網路。例如IBM公司的網路。
2. B類地址
B類地址的表示範圍為:128.0.0.0~191.255.255.255,默認網路禁止為:255.255.0.0;B類地址分配給一般的中型網路。B類網路用第一、二組數字表示網路的地址,後面兩組數字代表網路上的主機地址。
3. C類地址
C類地址的表示範圍為:192.0.0.0~223.255.255.255,默認網路禁止為:255.255.255.0;C類地址分配給小型網路,如一般的區域網路,它可連線的主機數量是最少的,採用把所屬的用戶分為若干的網段進行管理。C類網路用前三組數字表示網路的地址,最後一組數字作為網路上的主機地址。
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),通常使用路由器來執行NAT轉換。
實際上,還存在著D類地址E類地址。但這兩類地址用途比較特殊,在這裡只是簡單介紹一下:D類地址稱為廣播地址,供特殊協定向選定的節點傳送信息時用。E類地址保留給將來使用。
連線到Internet上的每台計算機,不論其IP位址屬於哪類都與網路中的其它計算機處於平等地位,因為只有IP位址才是區別計算機的唯一標識。所以,以上IP位址的分類只適用於網路分類。
在Internet中,一台計算機可以有一個或多個IP位址,就像一個人可以有多個通信地址一樣,但兩台或多台計算機卻不能共享一個IP位址。如果有兩台計算機的IP位址相同,則會引起異常現象,無論哪台計算機都將無法正常工作。
順便提一下幾類特殊的IP位址:
1. 廣播地址 目的端為給定網路上的所有主機,一般主機段為全0
2. 單播地址 目的端為指定網路上的單個主機地址
3. 組播地址 目的端為同一組內的所有主機地址
4. 環回地址 127.0.0.1 在環回測試和廣播測試時會使用
1.5 子網的劃分
若公司不上Internet,那一定不會煩惱IP位址的問題,因為可以任意使用所有的IP位址,不管是A類或是B類,這個時候不會想到要用子網,但若是上Internet那IP位址便彌足珍貴了,目前全球一陣Internet熱,IP位址已經愈來愈少了,而所申請的IP位址目前也趨保守,而且只有經申請的IP位址能在Internet使用,但對某些公司只能申請到一個C類的IP位址,但又有多個點需要使用,那這時便需要使用到子網,這就需要考慮子網的劃分,下面簡介子網的原理及如何規劃。
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類地址分成數組網路編碼,這要在子網掩碼上作手腳,若是要將整組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類地址但需要數個網路編碼的問題,並不是解決IP位址不夠用的問題,因為使用子網反而能使用的IP位址會變少,子網通常是使用在跨地域的網路互聯之中,兩者之間使用路由器連線,同時也上Internet,但只申請到一組C 類IP位址,過路由又需不同的網路,所以此時就必須使用到子網,當然二網路間也可以遠程橋接(Remote Bridge,字面翻譯)連線,那便沒有使用子網的問題。
網關地址
若要使兩個完全不同的網路(異構網)連線在一起,一般使用網關,在Internet中兩個網路也要通過一台稱為網關的計算機實現互聯。這台計算機能根據用戶通信目標計算機的IP位址,決定是否將用戶發出的信息送出本地網路,同時,它還將外界傳送給屬於本地網路計算機的信息接收過來,它是一個網路與另一個網路相聯的通道。為了使TCP/IP協定能夠定址,該通道被賦予一個IP位址,這個IP位址稱為網關地址。
完美測試TCP/IP協定簡介
安裝網路硬體和網路協定之後,我們一般要進行TCP/IP協定的測試工作,那么怎樣測試才算是比較全面的測試呢?我們認為,全面的測試應包括區域網路和網際網路兩個方面,因此應從區域網路和網際網路兩個方面測試,以下是我們在實際工作中利用命令行測試TCP/IP配置的步驟:
1、 單擊“開始”/“運行”,輸入CMD按回車,打開命令提示符視窗。
2、 首先檢查IP位址、子網掩碼、默認網關、DNS伺服器地址是否正確,輸入命令ipconfig /all,按回車。此時顯示了你的網路配置,觀查是否正確。
3、 輸入ping 127.0.0.1,觀查網卡是否能轉發數據,如果出現“Request timed out”,表明配置差錯或網路有問題。
4、 Ping一個網際網路地址,如ping 202.102.128.68,看是否有數據包傳回,以驗證與網際網路的連線性。
5、 Ping 一個區域網路地址,觀查與它的連通性。
6、 用nslookup測試DNS解析是否正確,輸入如nslookup www.ccidnet.com,查看是否能解析。
如果你的計算機通過了全部測試,則說明網路正常,否則網路可能有不同程度的問題。在此不展開詳述。不過,要注意,在使用 ping命令時,有些公司會在其主機設定丟棄icmp數據包,造成你的ping命令無法正常返回數據包,不防換個網站試試。
補充:
TCP/IP 協定簇
TCP/IP(Transmission Control Protocol/Internet Protocol)已成為一個事實上的工業
標準。
TCP/IP是一組協定的代名詞,它還包括許多協定,組成了TCP/IP協定簇。
TCP/IP協定簇分為四層,IP位於協定簇的第二層(對應OSI的第三層),TCP位於協定簇的第
三層(對應OSI的第四層)。
TCP和IP是TCP/IP協定簇的中間兩層,是整個協定簇的核心,起到了承上啟下的作用。
1、接口層
TCP/IP的最低層是接口層,常見的接口層協定有:
Ethernet 802.3、Token Ring 802.5、X.25、Frame reley、HDLC、PPP等。
2、網路層
網路層包括:IP(Internet Protocol)協定、ICMP(Internet Control Message Protocol)
控制報文協定、ARP(Address resolution Protocol)地址轉換協定、RARP(Reverse ARP)反向
地址轉換協定。
IP是網路層的核心,通過路由選擇將下一跳IP封裝後交給接口層。IP數據報是無連線服務

ICMP是網路層的補充,可以回送報文。用來檢測網路是否通暢。
Ping命令就是傳送ICMP的echo包,通過回送的echo relay進行網路測試。
ARP是正向地址解析協定,通過已知的IP,尋找對應主機的MAC地址。
RARP是反向地址解析協定,通過MAC地址確定IP位址。比如無盤工作站和DHCP服務。
3、傳輸層
傳輸層協定主要是:傳輸控制協定TCP(Transmission Control Protocol)和用戶數據報協
議UDP(User Datagram rotocol)。
TCP是面向連線的通信協定,通過三次握手建立連線,通訊時完成時要拆除連線,由於TCP
是面向連線的所以只能用於點對點的通訊。
TCP提供的是一種可靠的數據流服務,採用“帶重傳的肯定確認”技術來實現傳輸的可靠
性。TCP還採用一種稱為“滑動視窗”的方式進行流量控制,所謂視窗實際表示接收能力,用
以限制傳送方的傳送速度。
UDP是面向無連線的通訊協定,UDP數據包括目的連線埠號和源連線埠號信息,由於通訊不需要
連線,所以可以實現廣播傳送。
UDP通訊時不需要接收方確認,屬於不可靠的傳輸,可能會出丟包現象,實際套用中要求
在程式設計師編程驗證。
4、套用層
套用層一般是面向用戶的服務。如FTP、TELNET、DNS、SMTP、POP3。
FTP(File Transmision Protocol)是檔案傳輸協定,一般上傳下載用FTP服務,數據連線埠
是20H,控制連線埠是21H。
Telnet服務是用戶遠程登錄服務,使用23H連線埠,使用明碼傳送,保密性差、簡單方便。
DNS(Domain Name Service)是域名解析服務,提供域名到IP位址之間的轉換。
SMTP(Simple Mail Transfer Protocol)是簡單郵件傳輸協定,用來控制信件的傳送、中
轉。 
POP3(Post Office Protocol 3)是郵局協定第3版本,用於接收郵件。
數據格式:
數據幀:幀頭+IP數據包+幀尾 (幀頭包括源和目標主機MAC地址及類型,幀尾是校驗字)
IP數據包:IP頭部+TCP數據信息 (IP頭包括源和目標主機IP位址、類型、生存期等)
TCP數據信息:TCP頭部+實際數據 (TCP頭包括源和目標主機連線埠號、順序號、確認號、校
驗字等)
TCP/IP的實現
這是一個給予UDP協定的TCP/IP網路的C程式實現。客戶端套用層發起會話層的socket調用,在到達遠端後,伺服器端應用程式螢幕輸出字元串 Hello World
第一步 創建檔案名稱為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\n”, 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:*
您會發現運行中的server程式已經被捆綁在udp的1234連線埠.
第四步 創建檔案名稱為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…\n”,inet_ntoa(remoteAddr.sin_addr));
sendto (activeSocket,buf,sizeof(buf),0,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr));
printf(”Send Success!\n”);
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
第六步 觀察效果.現在點到server程式運行的視窗,看是不是出現了這樣一句話
Come from Client is : Hello World
上面的Hello World這句話就是客戶端client.c發來的.
程式注釋
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,下面會用到.當然您也可以不用定義,在後面的數組裡直接寫256這個數字也可以
main()
{
char buf[MAXBUF];字元串數組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函式需要傳遞3個值: 對於使用IPV4的網路接口,第1個參數必須是AF_INET.由於是UDP傳輸方式,第2個參數必須是SOCK_DGRAM.對於使用TCP或者UDP的傳輸,第3個參數都設定為0
memset(&serverAddr,0,sizeof(serverAddr));初始化變數serverAddr,使其為數字0
serverAddr.sin_family=AF_INET;把serverAddr結構中的sin_family變數賦值為AF_INET,這個值表示TCP/IP網路
serverAddr.sin_port=htons(1234);把serverAddr結構中的sin_port變數賦值為1234,這個值代表伺服器的接收連線埠為1234,您可以自行設定.htons函式是必須的,它把主機位元組順序轉換為網路位元組順序
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來轉換網路位元組順序,而htons是用來轉換2個位元組16位的連線埠地址.
if(bind (passiveSocket,(struct sockaddr *)&serverAddr,sizeof(serverAddr))==-1)
printf (”bind Error!”);使用bind函式把剛才創建的套接字描述符passiveSocket與伺服器套接字結構serverAddr捆綁在一起.
clientAddrLen=sizeof(serverAddr);
memset(buf,0,MAXBUF);初始化buf數組,設定為數字0
for(;;)因為是伺服器端程式,需要一直打開接收來自客戶端的請求,所以必須創建一個死循環
{
if(recvfrom(passiveSocket,buf,MAXBUF,0,(struct sockaddr *)&clientAddr,&clientAddrLen)>0)利用recvfrom函式接收來自客戶端的信息,並把信息存放在數組buf中.同時也把客戶端的地址存放在了clientAddr中,方便信息的回送,本例伺服器端為使用回送.
{
printf(”Come from Client is : %s\n”, 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>
以上是載入頭檔案,頭檔案里定義了一些程式運行時需要的數據.
#define MAXBUF 256 定義了常量MAXBUF的值256,下面會用到.當然您也可以不用定義,在後面的數組裡直接寫256這個數字也可以
main()
{
char buf[MAXBUF]=”Hello World”;給buf數組賦值為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中的注釋,創建一個套接字結構,成功創建後把返回的套接字描述符存儲在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函式得到預解析URL的地址儲存在hptr結構中,然後把hptr結構中的h_addr_list[0]值拷貝到套接字remoteAddr.sin_addr.s_addr變數. memcpy函式就是起到拷貝的作用.
printf(”Remote IP address is: %s…\n”,inet_ntoa(remoteAddr.sin_addr));顯示遠程伺服器的地址,這一步不是必須的.
sendto (activeSocket,buf,sizeof(buf),0,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr));發從存儲在數組buf中的信息,也就是傳送”Hello World”字元串到remoteAddr中指定的IP位址與連線埠.
printf(”Send Success!\n”);如果sendto成功則顯示Send Success!
memset (buf,0,sizeof(buf));重置buf數組
close(activeSocket);關閉activeSocket套接字釋放記憶體.
}
程式原理
在UNIX系統中,進程若對檔案進行操作,一般使用open函式調用打開一個檔案進行訪問,每個進程都有一個檔案描述符表,該表中存放了被進程打開的檔案的索引(也稱檔案描述符),索引指出了檔案在檔案描述符表中的位置,這個索引值是一個指向作業系統檔案表的指針.應用程式只要使用該描述符就可以對指定檔案進行操作.類似的,每個打開的socket函式都對應一個整數,我們稱它為socket描述符,該整數也是socket描述符在檔案描述符表中的索引值.但socket描述符在描述符表中的表項並不指向檔案表,而是指向一個與該socket有關的數據結構– socket結構.
當程式用open函式打開一檔案描述符,檔案描述符指向一個檔案表,而這個表指向檔案在硬碟的具體位置.類似的,當程式用socket函式創建一個socket結構,但這個結構並不完整,需要使用send或者recvfrom等函式向socket結構填寫其他部分,以指明預訪問的目的地址或接收到的源地址.

相關搜尋

熱門詞條

聯絡我們