天天看點

[C#網絡程式設計系列]專題一:網絡協定簡介

因為這段時間都在研究C#網絡程式設計的一些知識, 是以在這裡把我學習到的在這裡和大家分享下的,這樣既可以達到分享的目的也可以讓大家監督我,如果有什麼地方了解錯了,還請大家不吝賜教的。

很多人寫網絡程式設計這快都沒有怎麼講網絡中的協定,然而我覺得既然是網絡程式設計肯定要介紹下網絡程式設計中一些協定的,這樣可以讓更好的梳理網絡程式設計的知識的,是以我在這系列中會用兩個專題去講協定,第一個專題簡單介紹網絡分層以及各層之間如何通信的隻是,第二專題将會介紹下應用層協定——Http協定,了解這個不僅對網絡程式設計有個理論基礎,也可以幫助更好地了解Web(Asp.net)的開發。

一、網絡分層

網絡上的計算機之是以可以互相通信,是因為它們之間都遵守互相都可以“認識”的網際網路協定(就如同人交流一樣,兩個人能夠交流,互相必須知道對象的語言),網際網路上的計算機互相通信又歸根于網絡中層與層之間的通信,OSI模型把網絡通信分成七層:實體層、資料鍊路層、網絡層、傳輸層、會話層、表示層和應用層,對于開發網絡應用人員來說,一般把網絡分成五層,這樣比較容易了解。這五層為:實體層、資料鍊路層、網絡層、傳輸層和應用層(最頂層),下面是一張網絡分層的圖檔(來源于網絡):

二、各層的協定

網絡中的計算機互相通信就是實作了層與層之間的通信,要實作層與層之間的通信,則各層都要遵守規則,這樣才能完成更好的通信, 我們就把它們之間遵守的規則就叫個“協定”,然而網絡上的五層之間遵守的協定不一樣,每層都有各自的協定。下面就由下至上的講述每層的協定

2.1 實體層協定

實體層是五層模型中的最底層,實體層為計算機之間的資料通信提供了傳輸媒體和互連裝置,為資料傳輸提供了可靠的環境,媒體包括電纜、光纖、無線信道等,互連裝置指是計算機和數據機之間的互連裝置,如各種插頭、插座等。該層的作用是透明的傳輸比特流(即二進制流),為資料鍊路層提供一個傳輸原始比特流的實體連接配接

2.2 資料鍊路層

資料鍊路層是模型中的第2層,該層對接受到實體層傳輸過來的比特流進行分組,一組電信号構成的資料包,就叫做"幀",資料鍊鍊路層就是來傳輸以"幀"為機關的資料包,把資料傳遞給上一層(網絡層),幀資料由兩部分組成:幀頭和幀資料,幀頭包括接受方實體位址(就是網卡的位址)和其他的網絡資訊,幀資料就是要傳輸的資料體。資料幀的最長為1500位元組,如果資料很長,就必須分割成多個幀進行發送。

2.3 網絡層

該層通過尋址(尋址位址)來建立兩個節點之間的連接配接,大家都知道我們的電腦連接配接上網絡後都一個IP位址,我們可以通過IP位址來确定不同的計算機是否在同一個子網路。如果我們的電腦連接配接上網絡後就有兩種位址:實體位址和網絡位址(IP位址),網絡上的計算機要通信,必須要知道通信的計算機“在哪裡”, 首先通過網絡位址來判斷是否處于同一個子網絡,然後再對實體位址(MAC)位址進行處理,進而準确确定要通信計算機的位置。

在網絡層中有我們熟悉的IP協定(即規定網絡位址的協定),目前廣泛采用的是IP協定第四版(IPv4),這個版本規定,網絡位址由32位二進制位組成。我們可以自己配置IP位址也可以自動獲得的方式得到IP位址,Ip位址分成兩部分,前24位代表網絡,後8位代表主機号, 如192.168.254.1和192.168.254.2就處于同一個子網絡裡,因為這兩個IP位址的前24位相同。

網絡層中以IP資料包的形式來傳遞資料,IP資料包也包括兩部分:頭(Head)和資料(Data),IP資料包放進資料幀中的資料部分進行傳輸。

2.4 傳輸層

通過MAC和IP位址,我們可以找到網際網路上任意兩台主機來建立通信。然而這裡有一個問題,找到主機後,主機上有很多程式都需要用到網絡,比如說你在一邊聽歌和好用QQ聊天, 當網絡上發送來一個資料包時, 是怎麼知道它是表示聊天的内容還是歌曲的内容的, 這時候就需要一個參數來表示這個資料包是發送給那個程式(程序)來使用的,這個參數我們就叫做端口号,主機上用端口号來辨別不同的程式(程序),端口是0到65535之間的一個整數,0到1023的端口被系統占用,使用者隻能選擇大于1023的端口。

傳輸層的功能就是建立端口到端口的通信,網絡層就是建立主機與主機的通信,這樣如果我們确定了主機和端口,這樣就可以實作程式之間的通信了。我們所說的Socket程式設計就是通過代碼來實作傳輸層之間的通信。因為初始化Socket類對象要指定IP位址和端口号。

在傳輸層有兩個非常重要的協定:UDP 協定和TCP協定

采用UDP協定話傳輸的就是UDP資料包,同樣UDP資料包也由頭和資料兩部分組成,頭部分主要辨別了發送端口和接受端口,資料部分就是具體的内容資訊。同樣UDP資料包是放入IP資料包中的"資料"部分,IP資料包再放入資料幀中在網絡上傳輸。

由于UDP協定的可靠性差(資料發送後無法确定對方是否收到),是以又定義了一個可靠性高的協定——TCP協定,TCP協定采取了握手的方式要確定對方收到了資料。

2.5 應用層

應用層是模型中的最頂層,是使用者與網絡的接口,該層通過應用程式來完成網絡使用者的應用需求。該層的資料放在TCP資料包的資料部分,該層定義了一個很重要的協定——Http協定,我們一般的Web開發都是基于應用層的開發, 是以後面專題将會和大家介紹下Http協定。了解Http協定可以幫助我們了解Asp.net的請求響應模型以及幫助我們自定義送出請求和自定義伺服器。

三、總結

現在通過一個簡單的通路網頁的例子來說明網絡中的通信。

應用層:

浏覽網頁采用的是HTTP 協定,HTTP資料包會嵌入在TCP資料包中,此時我們發送的HTTP資料包内容為:

傳輸層:

TCP資料包需要設定端口,接收方(百度)的Http端口預設是80,本機的端口是一個1024-65535之間的随機整數,這裡假設為1025,這樣TCP資料包由标頭(辨別着發方和接收方的端口資訊)+HTTP資料包,這樣TCP資料包再嵌入IP資料包中在網絡上傳送

網絡層:

IP資料包需要知道雙方的IP位址,本機IP位址假定為192.168.1.5,接受方IP位址為220.181.111.147(百度),這樣IP資料包由頭部(IP位址資訊)+TCP資料包,

資料鍊路層:

IP資料包嵌入到資料幀(以太網資料包)中,以太網資料包需要知道雙方的MAC(實體位址),發送方為本機的網卡位址,接受方為網關192.168.1.1的MAC位址(通過ARP位址解析協定得到的)。這樣資料幀由頭部(MAC位址)+IP資料包組成。

經過多個網關的轉發到百度伺服器220.181.111.147,伺服器接受到發送過來的以太網資料包,然後再從以太網資料包中提取IP資料包——>TCP資料包——>HTTP資料包,最後伺服器做出"HTTP響應",再用TCP協定發回給用戶端(浏覽器),浏覽器同樣的過程讀取到HTTP響應的内容(HTTP響應資料包),然後浏覽器對接受到的HTML頁面進行解析,把網頁顯示出來呈現給使用者,這樣就完成了一次網絡通信了。

後面一個專題将對HTTP協定進行詳細的介紹。

     本文轉自LearningHard 51CTO部落格,原文連結:http://blog.51cto.com/learninghard/1038652,如需轉載請自行聯系原作者

繼續閱讀