NIO實現(xiàn)聊天室:一切都要從網(wǎng)絡(luò)編程的基礎(chǔ)開始聊起!
一、寫在開頭
大家好,Build哥回來啦!停更了大概2個月之久,之前有段時間去寫小說去了,后來又因為公司活太多,牛馬干的太投入,就落下了博客的更新,國慶節(jié)期間,難得的閑下來,準(zhǔn)備回歸老本行啦。
大致的翻看了一下之前更新的內(nèi)容,已經(jīng)寫到了Java的IO部分,作為網(wǎng)絡(luò)傳輸?shù)囊淮笾攸c(diǎn)知識,IO至關(guān)重要,而為了更好的理解和使用IO,我們今天要延展的來聊一聊Java中的網(wǎng)絡(luò)編程。其實,這句話說得不太嚴(yán)謹(jǐn),網(wǎng)絡(luò)編程并非Java獨(dú)有,所有依賴Web端的程序語言,或者應(yīng)用們都離不開網(wǎng)絡(luò)編程。
二、網(wǎng)絡(luò)編程的基礎(chǔ)
ok,閑話少敘,咱們直入主題,來一起學(xué)習(xí)一下網(wǎng)絡(luò)編程,在開始學(xué)習(xí)之前,我們應(yīng)該了解一下我們?nèi)粘I钪卸茧x不開的互聯(lián)網(wǎng)及周邊產(chǎn)品(路由器,網(wǎng)址,手機(jī),電腦)等。
2.1 計算機(jī)網(wǎng)絡(luò)
電腦對于我們來說十分熟悉啦,在多臺聯(lián)網(wǎng)電腦之前,我們可以聊天,視頻,郵件交流,也可以通過不同的媒介平臺進(jìn)行互通,所有在線的用戶設(shè)備之間,像一張大網(wǎng)串聯(lián)起來,互通有無,這就是計算機(jī)的網(wǎng)絡(luò)!
圖片
如上圖,是一張概括的網(wǎng)絡(luò)拓?fù)浜唸D,非常形象易懂的囊括了我們當(dāng)下的互聯(lián)網(wǎng)世界。其中,用戶設(shè)備如手機(jī),電腦這些用于訪問網(wǎng)絡(luò)資源,如看劇,刷新聞,而網(wǎng)絡(luò)交換機(jī)則是讓手機(jī)能上網(wǎng)的橋梁,用來連接局域網(wǎng)內(nèi)的設(shè)備和路由器,而路由器呢,主要工作是實現(xiàn)不同網(wǎng)絡(luò)之間的路由,可以聯(lián)通互聯(lián)網(wǎng),而為了防止一些未經(jīng)過授權(quán)的訪問侵入設(shè)備,設(shè)備的網(wǎng)絡(luò)中均設(shè)有一道防火墻,用于攔截未授權(quán)請求;而互聯(lián)網(wǎng)呢,則是全球互通的一個信息資源網(wǎng),服務(wù)器無需多談,用于托管網(wǎng)絡(luò)應(yīng)用和數(shù)據(jù)的處理和存儲站。
那么,看到這里我們有了這樣一個疑問,全球不同國家和地區(qū)存在著不同的局域網(wǎng),遵循著不同的網(wǎng)絡(luò)協(xié)議,是怎么做到全球互通互聯(lián)網(wǎng)的呢?偉大的先輩們早就考慮到這點(diǎn)啦,因此,最早制定規(guī)范的那幫人,就互聯(lián)達(dá)成了全球性的協(xié)議規(guī)范,那就是TCP/IP協(xié)議,下面我們聊到協(xié)議時會說。
2.2 IP
對于IP來說,大家也很熟悉,我們在日常上網(wǎng)的過程中,所說的網(wǎng)址,其實主要就是這個IP(Internet Protocol),中文譯作國際互聯(lián)協(xié)議。它像一個身份證號一樣,唯一的標(biāo)識著網(wǎng)絡(luò)中的一個接口,任何聯(lián)入到互聯(lián)網(wǎng)中的計算機(jī)都只要擁有一個IP地址。
目前IP分為IPv4和IPv6,因為v4版本采用32位地址,算起來約42億個地址,目前已經(jīng)用盡,所以推出了v6版本,采用128位地址,340萬億億億億個地址,對,你沒看錯,2的128次方個地址就是這么多,這個數(shù)字是人類滅絕了都用不完的。
一個特殊的 IP 地址,稱之為本機(jī)地址,它總是127.0.0.1
IPv4(如:101.302.88.22) IPv6 (如:2001:0DA8:100A:0000:0000:1020:F2F3:1428)
圖片
我們通過ipconfig可以看到我們計算機(jī)的網(wǎng)絡(luò)信息,我們的計算機(jī)除了本地的127.0.0.1之外,還有一個IP地址,如果多個網(wǎng)卡,還會有多個IP地址,那么不同計算機(jī)之前是如何通信的呢?
這里涉及“網(wǎng)絡(luò)號”這個概念,網(wǎng)絡(luò)號由IP和子網(wǎng)掩碼計算得來,如果兩個計算機(jī)之間的網(wǎng)絡(luò)號相同,則說明兩臺計算機(jī)在同一個網(wǎng)絡(luò)中,可以直接通信,如果不同,則不在同一個網(wǎng)絡(luò),需要通過路由器或者交換機(jī)進(jìn)行間接通信,這就是網(wǎng)關(guān)。
2.3 域名
上面說網(wǎng)絡(luò)上的地址多數(shù)指的是ip,很多人會奇怪,比如我們登錄百度時,輸入的并非xxx.xxx.xxx.xxx格式的,而是www.baidu.com,而這段組合就是域名!我們通過域名解析服務(wù)器 DNS 負(fù)責(zé)把域名翻譯成對應(yīng)的 IP,客戶端再根據(jù) IP 地址訪問服務(wù)器。
很明顯,相比較一堆數(shù)字組合的IP地址來說,域名更容易被記??!我們通過nslookup命令,可以查看域名對應(yīng)的ip地址。
圖片
當(dāng)然,我們在上面說的本機(jī)ip地址 127.0.0.1 也有對應(yīng)的本機(jī)域名:localhost
圖片
2.4 網(wǎng)絡(luò)模型
對于多種設(shè)備公用互聯(lián)網(wǎng)這件事,并非我們圖1中幾條線就可以搞定噠,其內(nèi)部,底層設(shè)計十分復(fù)雜,為了能夠在全球范圍內(nèi)達(dá)成一種公用的標(biāo)準(zhǔn)接口,很多組織都發(fā)布了 類似的標(biāo)準(zhǔn)規(guī)范,其中最著名,也是現(xiàn)在普遍認(rèn)可的是--開放式系統(tǒng)互聯(lián)通信參考模型(英語:Open System Interconnection Reference Model,縮寫:OSI;簡稱為OSI模型)是一種概念模型,由國際標(biāo)準(zhǔn)化組織提出,一個試圖使各種計算機(jī)在世界范圍內(nèi)互連為網(wǎng)絡(luò)的標(biāo)準(zhǔn)框架。
OSI模型分為七層,自下而上為 物理層(Physical Layer)、數(shù)據(jù)鏈路層(Data Link Layer)、網(wǎng)絡(luò)層(Network Layer)、傳輸層(Transport Layer)、會話層(Session Layer)、表達(dá)層(Presentation Layer)、應(yīng)用層(Application Layer)。
圖片
但在我們在互聯(lián)網(wǎng)實際使用的是 TCP/IP 模型,并不是對應(yīng)到 OSI 的 7 層模型,而是大致對應(yīng) OSI 的 5 層模型,也有人說是四層模型,這個看自己,無所謂,主要是要理解這個流程。
2.5 常用協(xié)議
在上圖OSI模型中,我們可以看到在應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層都對應(yīng)著很多的網(wǎng)絡(luò)協(xié)議,我們可以將之統(tǒng)稱為TCP/IP協(xié)議簇,我們接下來就簡要的介紹一下其中幾個重要的協(xié)議:
- IP協(xié)議(互聯(lián)網(wǎng)協(xié)議):一種分組交換的協(xié)議,不保證可靠傳輸,負(fù)責(zé)將數(shù)據(jù)包從源主機(jī)路由到目標(biāo)主機(jī),是網(wǎng)絡(luò)層的一個協(xié)議;
- TCP協(xié)議(傳輸控制協(xié)議):TCP協(xié)議是建立在IP的基礎(chǔ)上的,是傳輸層的協(xié)議。IP協(xié)議負(fù)責(zé)傳輸數(shù)據(jù),而TCP協(xié)議可以在建立了安全連接的基礎(chǔ)上,控制數(shù)據(jù)傳輸,保證可靠性,并且支持雙向通信,像HTTP,HTTPS都是建立在TCP協(xié)議之上的。
- UDP協(xié)議(數(shù)據(jù)報文協(xié)議):與TCP協(xié)議一樣,都是傳輸層的協(xié)議,不同的是它是無連接協(xié)議,不保證可靠傳輸。在通信前不需要建立連接,因此它的傳輸效率比 TCP 高,而且 UDP 協(xié)議比 TCP 協(xié)議要簡單得多。選擇 UDP 協(xié)議時,傳輸?shù)臄?shù)據(jù)通常是能容忍丟失的,例如,一些語音視頻通信的應(yīng)用會選擇 UDP 協(xié)議。
三、總結(jié)
今天就說這么多啦,主要介紹一下網(wǎng)絡(luò)編程相關(guān)的基礎(chǔ)知識,在后續(xù)的博文中針對網(wǎng)絡(luò)編程所需要的內(nèi)容,再進(jìn)一步的整理與細(xì)化。
Java成長計劃75
Java成長計劃 · 目錄#Java成長計劃
上一篇NIO的三大核心組件詳解,充分說明為什么NIO在網(wǎng)絡(luò)IO中擁有高性能!