1. 網(wǎng)絡(luò)應(yīng)用程序的設(shè)計(jì)模式
(1)C/S架構(gòu)
client/server架構(gòu),即客戶端/服務(wù)器架構(gòu)。
- 優(yōu)點(diǎn):協(xié)議選用比較靈活;可以緩存數(shù)據(jù),比如說我們?cè)诖蛴螒驎r(shí),在游戲過程中,實(shí)際上一些音效、圖片都已經(jīng)緩存下來了,想象一下,如果你玩LOL的時(shí)候,音效和動(dòng)畫需要去服務(wù)器實(shí)時(shí)下載,那么游戲會(huì)卡成什么樣子。
- 缺點(diǎn):對(duì)用戶的安全構(gòu)成威脅,因?yàn)榭蛻舳耸占四男┬畔?,這些信息用于什么工作我們都不知道;客戶端開發(fā)工作量大,調(diào)試?yán)щy,需要考慮多線程和數(shù)據(jù)同步。
- 典型的C/S架構(gòu)比如QQ微信,我們?cè)谑褂肣Q或者微信的時(shí)候都需要安裝一個(gè)客戶端軟件,也就是說,需要安裝客戶端軟件的都是基于C/S架構(gòu)。
?(2)B/S架構(gòu)
browser/server架構(gòu),即瀏覽器/服務(wù)器架構(gòu)。
- 優(yōu)點(diǎn):跨平臺(tái)。瀏覽器不需要我們開發(fā),我們只需要下載一個(gè)瀏覽器即可,并且可以在各個(gè)平臺(tái)通過瀏覽器訪問網(wǎng)站數(shù)據(jù)(手機(jī)、電腦等),那么既然是跨平臺(tái)訪問,在開發(fā)的時(shí)候就需要考慮跨平臺(tái)開發(fā)語言,比如Java和QT等等,QT提供了統(tǒng)一的接口,只不過在不同平臺(tái)下封裝的API不同,有Windows、Linux等,但是可以通過同樣的接口去調(diào)用。Java是運(yùn)行在虛擬機(jī)上的,只要在不同平臺(tái)安裝Java虛擬機(jī)即可。
- 缺點(diǎn):只能使用http或https去實(shí)現(xiàn)。比如說,我們?cè)跒g覽器輸入百度的域名http://www.baidu.com,這個(gè)域名對(duì)應(yīng)一個(gè)IP,瀏覽器會(huì)根據(jù)解析出的IP向百度的服務(wù)器發(fā)送一個(gè)http請(qǐng)求。
對(duì)于兩種架構(gòu),并沒有好壞之分,它們的應(yīng)用場(chǎng)景不同。比如說,大型游戲必須要通過客戶端來運(yùn)行,比如我們玩的LOL、DNF、CF都需要下載一個(gè)客戶端。而小型游戲只要在web服務(wù)器運(yùn)行就可以了,比如4399小游戲等。
?2. 協(xié)議
協(xié)議就是指數(shù)據(jù)傳輸和數(shù)據(jù)解釋的規(guī)則,典型的協(xié)議比如TCP/UDP協(xié)議、HTTP協(xié)議、FTP協(xié)議、IP協(xié)議、ARP協(xié)議等。
發(fā)送數(shù)據(jù)和接收數(shù)據(jù)要遵守相同的協(xié)議,否則就無法正確解析。同時(shí),發(fā)送數(shù)據(jù)的大小一般不要太大,因?yàn)檫@些數(shù)據(jù)是存放在棧上的,而??臻g的大小在Linux下默認(rèn)只有8M。
3. 網(wǎng)絡(luò)分層模型
① 七層OSI模型
- 數(shù)據(jù)鏈路層:數(shù)據(jù)傳輸、錯(cuò)誤檢測(cè)
- 網(wǎng)絡(luò)層:路由轉(zhuǎn)發(fā)
- 傳輸層:提供端對(duì)端的接口
- 會(huì)話層:解除或建立節(jié)點(diǎn)之間的聯(lián)系
- 表示層:數(shù)據(jù)格式化、代碼轉(zhuǎn)換、數(shù)據(jù)加密
- 應(yīng)用層:文件傳輸、電子郵件、文件服務(wù)、虛擬終端
② TCP/IP四層模型
- 數(shù)據(jù)鏈路層
- 網(wǎng)絡(luò)層
- 傳輸層
- 應(yīng)用層
作為程序員主要關(guān)注的是應(yīng)用層協(xié)議(其它三層由操作系統(tǒng)完成),我們可以自己去定義一套應(yīng)用層協(xié)議,實(shí)際上大公司都有自己的應(yīng)用層協(xié)議。
4. 協(xié)議格式——數(shù)據(jù)包的封裝思想
(1)以太網(wǎng)幀格式
以太網(wǎng)幀是在數(shù)據(jù)鏈路層傳輸?shù)臄?shù)據(jù)格式,借助mac地址完成數(shù)據(jù)報(bào)的傳遞
MAC地址就是網(wǎng)卡編號(hào),我們使用ifconfig就可以看到,硬件地址HWaddr就是MAC地址,這個(gè)編號(hào)是全世界唯一的,Windows下ipconfig顯示的物理地址就是MAC地址(Linux中用:間隔,Windows中用-間隔)
以太網(wǎng)幀發(fā)送數(shù)據(jù)報(bào)的前提是知道MAC地址,否則就要通過ARP協(xié)議根據(jù)對(duì)方的IP(對(duì)方的IP我們肯定是知道的,不然的話我們?cè)趺唇o他發(fā)數(shù)據(jù))去獲取對(duì)方的MAC地址,我們只需要關(guān)注類型,0800表示正常發(fā)送數(shù)據(jù),0806表示要獲取對(duì)方的MAC地址,至于報(bào)文數(shù)據(jù)的填充我們不需要知道,這是操作系統(tǒng)完成的(只有應(yīng)用層協(xié)議的封裝由用戶完成),當(dāng)我們發(fā)送0806類型的數(shù)據(jù)包,對(duì)方會(huì)回復(fù)一條ARP數(shù)據(jù)報(bào),我們就可以獲得對(duì)方的MAC地址(見下面ARP協(xié)議示意圖)。也就是說,以太網(wǎng)幀是根據(jù)MAC地址發(fā)送數(shù)據(jù)的,并不是根據(jù)IP地址發(fā)送數(shù)據(jù),IP地址是用來獲取MAC地址的,獲取到MAC地址后,再通過MAC地址發(fā)送數(shù)據(jù)。RARP協(xié)議就是通過MAC地址獲取IP地址的。
ARP數(shù)據(jù)報(bào)的格式(ARP用于根據(jù)IP地址獲取MAC地址)
ARP協(xié)議的工作示意圖如下
比如說,我們?cè)诒本┮驈V州的人員發(fā)送數(shù)據(jù),我們只知道對(duì)方的IP不知道MAC地址,那么是如何實(shí)現(xiàn)以太網(wǎng)幀發(fā)送的呢?首先北京的主機(jī)會(huì)向廣州的主機(jī)發(fā)送一個(gè)ARP協(xié)議包,幀類型為0806,以太網(wǎng)源地址和發(fā)送端地址都是北京本地主機(jī)的MAC地址,發(fā)送端IP為北京本地主機(jī)的IP,目的IP為要發(fā)送到的廣州主機(jī)的IP地址,以太網(wǎng)目的地址我們不知道就填充FF。廣州主機(jī)接收到這個(gè)數(shù)據(jù)包之后,會(huì)回復(fù)一個(gè)ARP數(shù)據(jù)包,類型同樣為0806,這其中就包含了廣州主機(jī)的MAC地址,有了這個(gè)MAC地址就可以進(jìn)行以太網(wǎng)幀的發(fā)送了。
(2)IP段數(shù)據(jù)格式
- 4位版本:ipv4、ipv6,當(dāng)前主要是ipv4
- 8位生存時(shí)間(TTL):最多經(jīng)過多少跳,即路由
- 32位源IP地址:數(shù)據(jù)發(fā)送端地址
- 32位目的IP地址:數(shù)據(jù)接收端地址
需要注意的是,IP協(xié)議和IP地址是兩個(gè)不同的概念,不要混淆。
關(guān)于路由:每經(jīng)過一個(gè)路由結(jié)點(diǎn),TTL減一,為了防止無限跳導(dǎo)致垃圾數(shù)據(jù)包,這個(gè)操作是由路由器完成的,當(dāng)TTL減為0,路由器就不會(huì)再轉(zhuǎn)發(fā)這個(gè)數(shù)據(jù)包了,而是直接丟棄。假如要從中國(guó)通過其他國(guó)家,可能通過海底光纖一跳就到達(dá)了,所以完全不必?fù)?dān)心256跳(2的8次方)不夠用,并且路由會(huì)選擇最短路徑。
(3)UDP數(shù)據(jù)包格式
在UDP數(shù)據(jù)包中包含一個(gè)16位源端口號(hào)和一個(gè)16位目的端口號(hào),端口號(hào)是用來標(biāo)識(shí)進(jìn)程的,每個(gè)進(jìn)程對(duì)應(yīng)位一一個(gè)PID。在網(wǎng)絡(luò)環(huán)境中,IP可以定位網(wǎng)絡(luò)中的一臺(tái)主機(jī),而port端口可以定位一臺(tái)主機(jī)中的一個(gè)進(jìn)程,格式一般為IP:Port,比如127.0.0.1:80。端口是16位的,端口最大值為65535(2的16次方減一)。
(4)TCP數(shù)據(jù)報(bào)格式
這里有一個(gè)16位的滑動(dòng)窗口,滑動(dòng)窗口實(shí)際上是代表了存儲(chǔ)空間的大小。比如說,A給B發(fā)送數(shù)據(jù),A發(fā)送的速度快,而B處理數(shù)據(jù)的速度較慢,那么A發(fā)送的數(shù)據(jù)就要先存儲(chǔ)起來,B就可以告訴A我的滑動(dòng)窗口是多大,也就是我能緩存多少數(shù)據(jù),A發(fā)送的數(shù)據(jù)就存儲(chǔ)在這個(gè)緩存中,當(dāng)緩存區(qū)滿了后,A就不在發(fā)送了?;瑒?dòng)窗口就是做流量控制的,當(dāng)B的緩存區(qū)滿了,A就會(huì)阻塞,等到B處理了一部分?jǐn)?shù)據(jù)后,A再發(fā)送數(shù)據(jù)。
在傳輸層是不需要封裝IP地址的,這是因?yàn)閭鬏攲拥臄?shù)據(jù)包還要經(jīng)過網(wǎng)絡(luò)層的包裝,而網(wǎng)絡(luò)層的IP協(xié)議中已經(jīng)封裝了IP地址,所以傳輸層就不需要IP了,傳輸層主要是封裝端口號(hào),端口號(hào)用于標(biāo)識(shí)源主機(jī)哪個(gè)進(jìn)程傳遞給目標(biāo)主機(jī)的哪個(gè)目標(biāo)進(jìn)程。
?(5)數(shù)據(jù)的封裝過程
5. TCP/UDP傳輸層協(xié)議簡(jiǎn)介
(1)TCP協(xié)議
面向連接的安全的流式傳輸協(xié)議
- 連接的時(shí)候,自動(dòng)進(jìn)行三次握手
- 數(shù)據(jù)發(fā)送的時(shí)候,會(huì)進(jìn)行數(shù)據(jù)確認(rèn),是否收到
- 數(shù)據(jù)丟失之后,會(huì)進(jìn)行數(shù)據(jù)重傳
(2)UDP協(xié)議
面向無連接的不安全的報(bào)式傳輸
- 連接的時(shí)候不會(huì)握手,通過IP和PORT連接
- 數(shù)據(jù)發(fā)送出去之后就不再管了,即不在乎對(duì)方收沒收到
實(shí)際上,雖然UDP不會(huì)校驗(yàn)數(shù)據(jù),也就是不安全的,但是實(shí)際上我們可以在應(yīng)用層對(duì)數(shù)據(jù)做校驗(yàn)來實(shí)現(xiàn)UDP的安全傳輸,比如說QQ發(fā)消息就是使用的UDP協(xié)議,但是它在應(yīng)用層自己定義了一套協(xié)議來保證安全傳輸,如果傳輸失敗可以再次傳輸,而QQ密碼校驗(yàn)和文件傳輸則是使用TCP傳輸。
?6. DNS服務(wù)器
DNS服務(wù)器也叫做域名解析服務(wù)器,根據(jù)域名解析出IP地址,比如說在瀏覽器輸入一個(gè)域名www.baidu.com,該域名將會(huì)通過DNS服務(wù)器解析得到IP地址。DNS根服務(wù)器在全世界總共有13臺(tái),其中美國(guó)10臺(tái),英國(guó)、瑞典、日本各有一臺(tái)。如果其他國(guó)家不向中國(guó)提供域名解析服務(wù),那么我們就無法上網(wǎng)了,所以中國(guó)現(xiàn)在主推IPv6,實(shí)現(xiàn)DNS根服務(wù)器的多國(guó)治理。