標籤: 暫無標籤

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);"
  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);"設置要綁定伺服器的哪個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結構填寫其他部分,以指明預訪問的目的地址或接收到的源地址.

上一篇[熱那亞市]    下一篇 [四氟化氙]

相關評論

同義詞:暫無同義詞