[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的請求響應模型以及幫助我們自定義發出請求和自定義服務器。

 

三、總結

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

當我們在瀏覽器中輸入www.baidu.com時,這意味着瀏覽器要向百度發送一個網頁數據包,要發送數據包,需要知道對方的IP地址,這里我們只知道網址為www.baidu.com,卻不知道IP地址,此時應用層協議DNS協議會幫我們把網址解析為IP地址,此時會發送一個DNS數據包給DNS服務器,DNS服務器再做出響應來告訴我們百度的IP地址為220.181.111.147,這樣我們就知道百度(我們需要通信的主機)的IP地址。

應用層:

 瀏覽網頁采用的是HTTP 協議,HTTP數據包會嵌入在TCP數據包中,此時我們發送的HTTP數據包內容為:

GET http://www.baidu.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; InfoPath.3; MS-RTC LM 8)
Accept-Encoding: gzip, deflate, peerdist
Proxy-Connection: Keep-Alive
Host: www.baidu.com
Cookie: BDSFRCVID=H1K_JgC2l434o0a3SlYrhIyDwFLxPM7C3J; H_BDCLCKID_SF=tJAt_C8htDv5HTuRj63D5JcH-UnLqMkDWaOZ0h8-aI-5MbAx-jb6hhFXM-r80nblBTbT2C3nthF0HPonHj8Bej5L3J; BAIDUID=C0E879D1A40237E70E9FA559D40EE0AC:FG=1; BDUT=w5n3C0E879D1A40237E70E9FA559D40EE0AC13914a661370; BDUSS=FEQVdNdjllMTYyYlRxY3ZZbW1hM2htemdqZFVJcWRLWmFBaEtqd1FoTDNXeE5SQUFBQUFBJCQAAAAAAAAAAAoqyysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEwLjI2LjE5Ny43NwAAAADAxFInAAAAAPcNJlD3DSZQYV; BDRCVFR[eYjbPwSqvSs]=2g3v5sBI-NCpv4EILPoXi4WUvY; Hm_lvt_9f14aaa038bbba8b12ec2a4a3e51d254=1344671219756; Hm_lpvt_9f14aaa038bbba8b12ec2a4a3e51d254=1344671219756
X-P2P-PeerDist: Version=1.0

傳輸層:
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協議進行詳細的介紹。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM