C#網(wǎng)絡(luò)編程系列一:網(wǎng)絡(luò)協(xié)議簡(jiǎn)介
因?yàn)檫@段時(shí)間都在研究C#網(wǎng)絡(luò)編程的一些知識(shí), 所以在這里把我學(xué)習(xí)到的在這里和大家分享下的,這樣既可以達(dá)到分享的目的也可以讓大家監(jiān)督我,如果有什么地方理解錯(cuò)了,還請(qǐng)大家不吝賜教的。
很多人寫網(wǎng)絡(luò)編程這快都沒(méi)有怎么講網(wǎng)絡(luò)中的協(xié)議,然而我覺(jué)得既然是網(wǎng)絡(luò)編程肯定要介紹下網(wǎng)絡(luò)編程中一些協(xié)議的,這樣可以讓更好的梳理網(wǎng)絡(luò)編程的知識(shí)的,所以我在這系列中會(huì)用兩個(gè)專題去講協(xié)議,***個(gè)專題簡(jiǎn)單介紹網(wǎng)絡(luò)分層以及各層之間如何通信的只是,第二專題將會(huì)介紹下應(yīng)用層協(xié)議——Http協(xié)議,了解這個(gè)不僅對(duì)網(wǎng)絡(luò)編程有個(gè)理論基礎(chǔ),也可以幫助更好地理解Web(Asp.net)的開發(fā)。
一、網(wǎng)絡(luò)分層
網(wǎng)絡(luò)上的計(jì)算機(jī)之所以可以互相通信,是因?yàn)樗鼈冎g都遵守互相都可以“認(rèn)識(shí)”的互聯(lián)網(wǎng)協(xié)議(就如同人交流一樣,兩個(gè)人能夠交流,互相必須知道對(duì)象的語(yǔ)言),互聯(lián)網(wǎng)上的計(jì)算機(jī)互相通信又歸根于網(wǎng)絡(luò)中層與層之間的通信,OSI模型把網(wǎng)絡(luò)通信分成七層:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層和應(yīng)用層,對(duì)于開發(fā)網(wǎng)絡(luò)應(yīng)用人員來(lái)說(shuō),一般把網(wǎng)絡(luò)分成五層,這樣比較容易理解。這五層為:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層(最頂層),下面是一張網(wǎng)絡(luò)分層的圖片(來(lái)源于網(wǎng)絡(luò))
二、各層的協(xié)議
網(wǎng)絡(luò)中的計(jì)算機(jī)互相通信就是實(shí)現(xiàn)了層與層之間的通信,要實(shí)現(xiàn)層與層之間的通信,則各層都要遵守規(guī)則,這樣才能完成更好的通信, 我們就把它們之間遵守的規(guī)則就叫個(gè)“協(xié)議”,然而網(wǎng)絡(luò)上的五層之間遵守的協(xié)議不一樣,每層都有各自的協(xié)議。下面就由下至上的講述每層的協(xié)議
2.1 物理層協(xié)議
物理層是五層模型中的***層,物理層為計(jì)算機(jī)之間的數(shù)據(jù)通信提供了傳輸媒體和互連設(shè)備,為數(shù)據(jù)傳輸提供了可靠的環(huán)境,媒體包括電纜、光纖、無(wú)線信道等,互連設(shè)備指是計(jì)算機(jī)和調(diào)制解調(diào)器之間的互連設(shè)備,如各種插頭、插座等。該層的作用是透明的傳輸比特流(即二進(jìn)制流),為數(shù)據(jù)鏈路層提供一個(gè)傳輸原始比特流的物理連接
2.2 數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層是模型中的第2層,該層對(duì)接受到物理層傳輸過(guò)來(lái)的比特流進(jìn)行分組,一組電信號(hào)構(gòu)成的數(shù)據(jù)包,就叫做"幀",數(shù)據(jù)鏈鏈路層就是來(lái)傳輸以"幀"為單位的數(shù)據(jù)包,把數(shù)據(jù)傳遞給上一層(網(wǎng)絡(luò)層),幀數(shù)據(jù)由兩部分組成:幀頭和幀數(shù)據(jù),幀頭包括接受方物理地址(就是網(wǎng)卡的地址)和其他的網(wǎng)絡(luò)信息,幀數(shù)據(jù)就是要傳輸?shù)臄?shù)據(jù)體。數(shù)據(jù)幀的最長(zhǎng)為1500字節(jié),如果數(shù)據(jù)很長(zhǎng),就必須分割成多個(gè)幀進(jìn)行發(fā)送。
2.3 網(wǎng)絡(luò)層
該層通過(guò)尋址(尋址地址)來(lái)建立兩個(gè)節(jié)點(diǎn)之間的連接,大家都知道我們的電腦連接上網(wǎng)絡(luò)后都一個(gè)IP地址,我們可以通過(guò)IP地址來(lái)確定不同的計(jì)算機(jī)是否在同一個(gè)子網(wǎng)路。如果我們的電腦連接上網(wǎng)絡(luò)后就有兩種地址:物理地址和網(wǎng)絡(luò)地址(IP地址),網(wǎng)絡(luò)上的計(jì)算機(jī)要通信,必須要知道通信的計(jì)算機(jī)“在哪里”, 首先通過(guò)網(wǎng)絡(luò)地址來(lái)判斷是否處于同一個(gè)子網(wǎng)絡(luò),然后再對(duì)物理地址(MAC)地址進(jìn)行處理,從而準(zhǔn)確確定要通信計(jì)算機(jī)的位置。
在網(wǎng)絡(luò)層中有我們熟悉的IP協(xié)議(即規(guī)定網(wǎng)絡(luò)地址的協(xié)議),目前廣泛采用的是IP協(xié)議第四版(IPv4),這個(gè)版本規(guī)定,網(wǎng)絡(luò)地址由32位二進(jìn)制位組成。我們可以自己配置IP地址也可以自動(dòng)獲得的方式得到IP地址,Ip地址分成兩部分,前24位代表網(wǎng)絡(luò),后8位代表主機(jī)號(hào), 如192.168.254.1和192.168.254.2就處于同一個(gè)子網(wǎng)絡(luò)里,因?yàn)檫@兩個(gè)IP地址的前24位相同。
網(wǎng)絡(luò)層中以IP數(shù)據(jù)包的形式來(lái)傳遞數(shù)據(jù),IP數(shù)據(jù)包也包括兩部分:頭(Head)和數(shù)據(jù)(Data),IP數(shù)據(jù)包放進(jìn)數(shù)據(jù)幀中的數(shù)據(jù)部分進(jìn)行傳輸。
2.4 傳輸層
通過(guò)MAC和IP地址,我們可以找到互聯(lián)網(wǎng)上任意兩臺(tái)主機(jī)來(lái)建立通信。然而這里有一個(gè)問(wèn)題,找到主機(jī)后,主機(jī)上有很多程序都需要用到網(wǎng)絡(luò),比如說(shuō)你在一邊聽歌和好用QQ聊天, 當(dāng)網(wǎng)絡(luò)上發(fā)送來(lái)一個(gè)數(shù)據(jù)包時(shí), 是怎么知道它是表示聊天的內(nèi)容還是歌曲的內(nèi)容的, 這時(shí)候就需要一個(gè)參數(shù)來(lái)表示這個(gè)數(shù)據(jù)包是發(fā)送給那個(gè)程序(進(jìn)程)來(lái)使用的,這個(gè)參數(shù)我們就叫做端口號(hào),主機(jī)上用端口號(hào)來(lái)標(biāo)識(shí)不同的程序(進(jìn)程),端口是0到65535之間的一個(gè)整數(shù),0到1023的端口被系統(tǒng)占用,用戶只能選擇大于1023的端口。
傳輸層的功能就是建立端口到端口的通信,網(wǎng)絡(luò)層就是建立主機(jī)與主機(jī)的通信,這樣如果我們確定了主機(jī)和端口,這樣就可以實(shí)現(xiàn)程序之間的通信了。我們所說(shuō)的Socket編程就是通過(guò)代碼來(lái)實(shí)現(xiàn)傳輸層之間的通信。因?yàn)槌跏蓟疭ocket類對(duì)象要指定IP地址和端口號(hào)。
在傳輸層有兩個(gè)非常重要的協(xié)議:UDP 協(xié)議和TCP協(xié)議
采用UDP協(xié)議話傳輸?shù)木褪荱DP數(shù)據(jù)包,同樣UDP數(shù)據(jù)包也由頭和數(shù)據(jù)兩部分組成,頭部分主要標(biāo)識(shí)了發(fā)送端口和接受端口,數(shù)據(jù)部分就是具體的內(nèi)容信息。同樣UDP數(shù)據(jù)包是放入IP數(shù)據(jù)包中的"數(shù)據(jù)"部分,IP數(shù)據(jù)包再放入數(shù)據(jù)幀中在網(wǎng)絡(luò)上傳輸。
由于UDP協(xié)議的可靠性差(數(shù)據(jù)發(fā)送后無(wú)法確定對(duì)方是否收到),所以又定義了一個(gè)可靠性高的協(xié)議——TCP協(xié)議,TCP協(xié)議采取了握手的方式要確保對(duì)方收到了數(shù)據(jù)。
2.5 應(yīng)用層
應(yīng)用層是模型中的最頂層,是用戶與網(wǎng)絡(luò)的接口,該層通過(guò)應(yīng)用程序來(lái)完成網(wǎng)絡(luò)用戶的應(yīng)用需求。該層的數(shù)據(jù)放在TCP數(shù)據(jù)包的數(shù)據(jù)部分,該層定義了一個(gè)很重要的協(xié)議——Http協(xié)議,我們一般的Web開發(fā)都是基于應(yīng)用層的開發(fā), 所以后面專題將會(huì)和大家介紹下Http協(xié)議。理解Http協(xié)議可以幫助我們理解Asp.net的請(qǐng)求響應(yīng)模型以及幫助我們自定義發(fā)出請(qǐng)求和自定義服務(wù)器。
三、總結(jié)
現(xiàn)在通過(guò)一個(gè)簡(jiǎn)單的訪問(wèn)網(wǎng)頁(yè)的例子來(lái)說(shuō)明網(wǎng)絡(luò)中的通信。
當(dāng)我們?cè)跒g覽器中輸入www.baidu.com時(shí),這意味著瀏覽器要向百度發(fā)送一個(gè)網(wǎng)頁(yè)數(shù)據(jù)包,要發(fā)送數(shù)據(jù)包,需要知道對(duì)方的IP地址,這里我們只知道網(wǎng)址為www.baidu.com,卻不知道IP地址,此時(shí)應(yīng)用層協(xié)議DNS協(xié)議會(huì)幫我們把網(wǎng)址解析為IP地址,此時(shí)會(huì)發(fā)送一個(gè)DNS數(shù)據(jù)包給DNS服務(wù)器,DNS服務(wù)器再做出響應(yīng)來(lái)告訴我們百度的IP地址為220.181.111.147,這樣我們就知道百度(我們需要通信的主機(jī))的IP地址。
應(yīng)用層:
瀏覽網(wǎng)頁(yè)采用的是HTTP 協(xié)議,HTTP數(shù)據(jù)包會(huì)嵌入在TCP數(shù)據(jù)包中,此時(shí)我們發(fā)送的HTTP數(shù)據(jù)包內(nèi)容為:
- 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數(shù)據(jù)包需要設(shè)置端口,接收方(百度)的Http端口默認(rèn)是80,本機(jī)的端口是一個(gè)1024-65535之間的隨機(jī)整數(shù),這里假設(shè)為1025,這樣TCP數(shù)據(jù)包由標(biāo)頭(標(biāo)識(shí)著發(fā)方和接收方的端口信息)+HTTP數(shù)據(jù)包,這樣TCP數(shù)據(jù)包再嵌入IP數(shù)據(jù)包中在網(wǎng)絡(luò)上傳送
網(wǎng)絡(luò)層:
IP數(shù)據(jù)包需要知道雙方的IP地址,本機(jī)IP地址假定為192.168.1.5,接受方IP地址為220.181.111.147(百度),這樣IP數(shù)據(jù)包由頭部(IP地址信息)+TCP數(shù)據(jù)包,
數(shù)據(jù)鏈路層:
IP數(shù)據(jù)包嵌入到數(shù)據(jù)幀(以太網(wǎng)數(shù)據(jù)包)中,以太網(wǎng)數(shù)據(jù)包需要知道雙方的MAC(物理地址),發(fā)送方為本機(jī)的網(wǎng)卡地址,接受方為網(wǎng)關(guān)192.168.1.1的MAC地址(通過(guò)ARP地址解析協(xié)議得到的)。這樣數(shù)據(jù)幀由頭部(MAC地址)+IP數(shù)據(jù)包組成。
經(jīng)過(guò)多個(gè)網(wǎng)關(guān)的轉(zhuǎn)發(fā)到百度服務(wù)器220.181.111.147,服務(wù)器接受到發(fā)送過(guò)來(lái)的以太網(wǎng)數(shù)據(jù)包,然后再?gòu)囊蕴W(wǎng)數(shù)據(jù)包中提取IP數(shù)據(jù)包——>TCP數(shù)據(jù)包——>HTTP數(shù)據(jù)包,***服務(wù)器做出"HTTP響應(yīng)",再用TCP協(xié)議發(fā)回給客戶端(瀏覽器),瀏覽器同樣的過(guò)程讀取到HTTP響應(yīng)的內(nèi)容(HTTP響應(yīng)數(shù)據(jù)包),然后瀏覽器對(duì)接受到的HTML頁(yè)面進(jìn)行解析,把網(wǎng)頁(yè)顯示出來(lái)呈現(xiàn)給用戶,這樣就完成了一次網(wǎng)絡(luò)通信了。
后面一個(gè)專題將對(duì)HTTP協(xié)議進(jìn)行詳細(xì)的介紹。
原文鏈接:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html
【編輯推薦】
- C#網(wǎng)絡(luò)編程系列二:HTTP協(xié)議詳解
- C#網(wǎng)絡(luò)編程系列三:自定義Web服務(wù)器
- C#網(wǎng)絡(luò)編程系列四:自定義Web瀏覽器
- C#網(wǎng)絡(luò)編程系列五:TCP編程
- C#網(wǎng)絡(luò)編程系列六:UDP編程
- C#網(wǎng)絡(luò)編程系列七:UDP編程補(bǔ)充
- C#網(wǎng)絡(luò)編程系列八:P2P編程
- C#網(wǎng)絡(luò)編程系列九:類似QQ的即時(shí)通信程序
- C#網(wǎng)絡(luò)編程系列十:實(shí)現(xiàn)簡(jiǎn)單的郵件收發(fā)器