基本網(wǎng)絡(luò)概念

網(wǎng)絡(luò)

所有現(xiàn)代計(jì)算機(jī)網(wǎng)絡(luò)都是包交換(分組交換)網(wǎng)絡(luò):流經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)分割成小塊,稱(chēng)為包(packet,也稱(chēng)為分組),每個(gè)包都單獨(dú)加以處理。每個(gè)包都包含了由誰(shuí)發(fā)送和將發(fā)往何處的信息。將數(shù)據(jù)分成單獨(dú)的帶有地址的包,其最重要的優(yōu)點(diǎn)是:
1、多個(gè)即將交換的包可以在一條線纜上傳輸,這使得建立網(wǎng)絡(luò)的成本更低;
2、分包還有一個(gè)好處,就是可以進(jìn)行校驗(yàn),用來(lái)檢測(cè)包在傳輸中是否遭到破壞;

計(jì)算機(jī)來(lái)回傳遞數(shù)據(jù)時(shí)需要用到協(xié)議(protocol),協(xié)議是定義計(jì)算機(jī)如何通信的一組明確的規(guī)則:包括地址格式、數(shù)據(jù)如何分包等。開(kāi)放、公開(kāi)的協(xié)議標(biāo)準(zhǔn)允許不同廠家的軟件和設(shè)備相互通信,Web服務(wù)器不關(guān)心客戶(hù)端是UNIX工作站、Android手機(jī)還是一個(gè)Pad,因?yàn)樗锌蛻?hù)端都是用相同的HTTP協(xié)議,與平臺(tái)無(wú)關(guān)。


網(wǎng)絡(luò)分層

常見(jiàn)的網(wǎng)絡(luò)分層模型有OSI七層網(wǎng)絡(luò)模型和TCP/IP四層網(wǎng)路模型,對(duì)于Java網(wǎng)絡(luò)程序,OSI模型過(guò)于復(fù)雜,OSI模型將主機(jī)網(wǎng)絡(luò)層分為數(shù)據(jù)鏈路層和物理層,另外在應(yīng)用層和傳輸層之間插入了表示層和會(huì)話層。OSI模型更加一般化,更適合于非TCP/IP網(wǎng)絡(luò)。

在TCP/IP四層網(wǎng)絡(luò)模型中,兩個(gè)應(yīng)用程序間的通信過(guò)程如下:

當(dāng)Web瀏覽器向Web服務(wù)器發(fā)送獲取網(wǎng)頁(yè)的請(qǐng)求時(shí),瀏覽器實(shí)際上只與本地客戶(hù)端的傳輸層對(duì)話。傳輸層將請(qǐng)求分解為T(mén)CP片,向數(shù)據(jù)添加序列號(hào)和校驗(yàn),然后將請(qǐng)求傳遞給本地網(wǎng)際層。網(wǎng)際層根據(jù)本地網(wǎng)絡(luò)所需的大小將各個(gè)TCP片分成IP數(shù)據(jù)報(bào),并傳遞到主機(jī)網(wǎng)絡(luò)層以便通過(guò)線纜傳輸數(shù)據(jù)。主機(jī)網(wǎng)絡(luò)層將數(shù)字?jǐn)?shù)據(jù)編碼為適合特定物理介質(zhì)的模擬信號(hào),將請(qǐng)求發(fā)送到線纜,目標(biāo)地址的遠(yuǎn)程服務(wù)器的主機(jī)網(wǎng)絡(luò)層可以由此讀取請(qǐng)求。

遠(yuǎn)程服務(wù)器的主機(jī)網(wǎng)絡(luò)層將模擬信號(hào)解碼為數(shù)字?jǐn)?shù)據(jù),將生成的IP數(shù)據(jù)報(bào)傳遞給服務(wù)器的網(wǎng)際層。網(wǎng)際層簡(jiǎn)單地檢查IP數(shù)據(jù)報(bào)是否被破壞,如果已經(jīng)分片則重組數(shù)據(jù),然后傳遞給服務(wù)器的傳輸層。傳輸層檢查是否所有的數(shù)據(jù)已經(jīng)到達(dá),對(duì)于丟失或破壞的部分則要求重傳(重傳得通過(guò)客戶(hù)端的傳輸層重新發(fā)送丟失的數(shù)據(jù)包,所有這些操作對(duì)于應(yīng)用層來(lái)說(shuō)都是透明的)。一旦服務(wù)器的傳輸層接收到足夠多的連續(xù)順序數(shù)據(jù)報(bào),就將其重組寫(xiě)入一個(gè)流,由服務(wù)器的應(yīng)用層解析讀取。服務(wù)器響應(yīng)這個(gè)請(qǐng)求,再通過(guò)服務(wù)器系統(tǒng)的各個(gè)分層發(fā)回響應(yīng)數(shù)據(jù)給客戶(hù)端。

主機(jī)網(wǎng)絡(luò)層(物理連接)

主機(jī)網(wǎng)絡(luò)層由連接不同計(jì)算機(jī)的硬件(線纜、光纖電纜等)組成,一般不需要去接觸這一層,除非為了是性能問(wèn)題。

網(wǎng)際層(IP)

網(wǎng)際層協(xié)議定義了數(shù)據(jù)位和字節(jié)如何組織為更大的分組。稱(chēng)為包,還定義了尋址機(jī)制,不同計(jì)算機(jī)要按這個(gè)尋址機(jī)制查找對(duì)方。

在IPv4和IPv6中,數(shù)據(jù)按包在網(wǎng)際層上傳輸,這些包稱(chēng)為數(shù)據(jù)報(bào)(datagram)。每個(gè)IPv4數(shù)據(jù)報(bào)包含一個(gè)長(zhǎng)度為20~60字節(jié)的首部,以及一個(gè)包含多達(dá)65515字節(jié)數(shù)據(jù)的有效載荷。IPv6數(shù)據(jù)報(bào)則包含一個(gè)更大的首部,數(shù)據(jù)可以多達(dá)4G字節(jié)。

傳輸層(TCP、UDP)

傳輸層負(fù)責(zé)確保各包以發(fā)送的順序接收,并保證沒(méi)有數(shù)據(jù)丟失或破壞。如果丟包,傳輸層會(huì)請(qǐng)求發(fā)送方重傳這個(gè)包。為實(shí)現(xiàn)這個(gè)目標(biāo),IP網(wǎng)絡(luò)會(huì)給每個(gè)數(shù)據(jù)報(bào)添加一個(gè)首部,其中包含有更多信息。這個(gè)層主要有兩個(gè)協(xié)議:TCP和UDP,TCP支持對(duì)丟失或破壞的數(shù)據(jù)重傳,并按照發(fā)送時(shí)的順序進(jìn)行傳送,是一個(gè)開(kāi)銷(xiāo)很高的協(xié)議;UDP允許接收方檢測(cè)被破壞的包,但是不保證這些包以正確的順序傳送(有可能丟包)。

應(yīng)用層(HTTP、FTP)

應(yīng)用層是與用戶(hù)直接交互的協(xié)議,應(yīng)用層確定了數(shù)據(jù)傳輸后的操作,例HTTP協(xié)議可以確保Web瀏覽器將圖像顯示為圖片,而不是一長(zhǎng)串?dāng)?shù)字。


IP地址

IPv4網(wǎng)絡(luò)中的每臺(tái)計(jì)算機(jī)都有唯一的4字節(jié)地址,當(dāng)數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸時(shí),包的首部會(huì)包括要發(fā)往的目標(biāo)地址和發(fā)送這個(gè)包的源地址,包括源地址是為了讓接收方知道要向誰(shuí)響應(yīng)數(shù)據(jù)。


URL

URL是一個(gè)URI,除了標(biāo)識(shí)一個(gè)資源,還會(huì)為資源提供一個(gè)特定的網(wǎng)絡(luò)位置。在Java中,java.net.URI只標(biāo)識(shí)資源,java.net.URL既能標(biāo)識(shí)資源,又能獲取資源。URL中的網(wǎng)絡(luò)位置通常包括用來(lái)訪問(wèn)服務(wù)器的協(xié)議(如FTP、HTTP)、服務(wù)器的主機(jī)名或IP地址,以及文件在該服務(wù)器上的路徑。

URL的組成:protocol://userInfo@host:port/path?query#fragment
URL的協(xié)議(protocol):如http、https、ftp等;
URL的主機(jī)(host):服務(wù)器的名字,可以是主機(jī)名或者IP地址,如www.baidu.com或204.148.40.9;
URL的用戶(hù)信息(userInfo):服務(wù)器的登錄信息(可選),如果有則包含一個(gè)用戶(hù)名,極少情況下還包含了一個(gè)口令;
URL的端口(port):如果服務(wù)器在其默認(rèn)的端口運(yùn)行,如HTTP的默認(rèn)端口為80,則不需要這部分信息;
URL的路徑(path):執(zhí)行服務(wù)器的一個(gè)特定目錄,可以看成是一個(gè)文件系統(tǒng)的路徑;
URL的查詢(xún)(query):向服務(wù)器提交附加參數(shù),一般只在http協(xié)議中使用;

從URL獲取數(shù)據(jù)的三個(gè)方法:

public final InputStream openStream() throws java.io.IOException
openStream()方法連接到URL所引用的資源,在客戶(hù)端和服務(wù)器之間完成必要的握手,返回一個(gè)InputStream,可以由此讀取數(shù)據(jù)。從這個(gè)InputStream獲取的數(shù)據(jù)是URL引用的原始內(nèi)容(即未經(jīng)解釋的內(nèi)容):如果讀取ASCII文本則為ASCII;如果讀取HTML文件則為原始HTML;如果讀取圖像文件則為二進(jìn)制圖片數(shù)據(jù)等。它不包括任何HTTP首部或者與協(xié)議有關(guān)的任何其他信息。

public final Object getContent() throws java.io.IOException
getContent()方法獲取由URL引用的數(shù)據(jù),嘗試由它建立某種類(lèi)型的對(duì)象。如果URL指示某種文本(如ASCII或HTML文件),則返回的對(duì)象通常是某種InputStream;如果URL指示一個(gè)圖像(如GIF或JPEG文件),返回的對(duì)象是一個(gè)java.awt.ImageProducer。但是getContent()方法最大的問(wèn)題是很難預(yù)測(cè)將獲得哪種對(duì)象。

public URLConnection openConnection() throws java.io.IOException
openConnection()方法為指定的URL打開(kāi)一個(gè)Socket,并返回一個(gè)URLConnection對(duì)象。URLConnection表示一個(gè)網(wǎng)絡(luò)資源的打開(kāi)的連接。如果希望與服務(wù)器直接通信,應(yīng)當(dāng)使用該方法,通過(guò)URLConnection可以訪問(wèn)服務(wù)器發(fā)送的所有數(shù)據(jù):除了原始的文檔本身外(如HTML、純文本、二進(jìn)制圖像數(shù)據(jù)),還可以訪問(wèn)這個(gè)協(xié)議指定的所有元數(shù)據(jù),例如如果模式是HTTP或HTTPS,URLConnection允許訪問(wèn)HTTP首部以及原始HTML。而且除了從URL讀取之外,還支持寫(xiě)入數(shù)據(jù)。

獲取分解URL的9個(gè)方法:
URL url = new URL("https://www.baidu.com/");為例子

getProtocol():輸出https;
getHost():輸出www.baidu.com;
getPort():輸出-1;如果URL沒(méi)有指定的端口號(hào),則返回-1;
getDefaultPort():輸出443,;如果URL沒(méi)有指定端口號(hào),則返回默認(rèn)的端口號(hào),如果沒(méi)有默認(rèn)的端口號(hào)則返回-1;
getFile():輸出/;此方法返回URL的路徑path部分,即從主機(jī)名后的第一個(gè)斜線(/)一直到開(kāi)始片段標(biāo)識(shí)符的(#)之前的字符,其中包含查詢(xún)字段;
getPath():輸出/;此方法類(lèi)似于getFile()方法,唯一區(qū)別的是getPath()返回的字符串不包含查詢(xún)字段;
getRef():返回#號(hào)后面的部分;
getUserInfo():返回用戶(hù)信息,如果沒(méi)有則返回null;
getAuthority():輸出www.baidu.com;返回授權(quán)機(jī)構(gòu);


InetAddress

java.net.InetAddress類(lèi)是Java對(duì)IP地址的高層表示,它包括一個(gè)主機(jī)名和IP地址。InetAddress類(lèi)沒(méi)有構(gòu)造函數(shù),但是提供了一些靜態(tài)工廠方法,可以連接到DNS服務(wù)器來(lái)解析主機(jī)名。

InetAddress.getByName()

最常用的是InetAddress.getByName()方法,這個(gè)方法實(shí)際上回建立與本地DNS服務(wù)器的一個(gè)連接,來(lái)查找名字和數(shù)字地址,同時(shí)還有緩存作用,如果之前查找過(guò)這個(gè)主機(jī),這些信息可能會(huì)緩存到本地,這樣下次再獲取這些信息時(shí)就不用再進(jìn)行網(wǎng)絡(luò)連接了。

InetAddress.getByName()

InetAddress.getLocalHost()

getLocalHost()返回的是運(yùn)行這個(gè)代碼的主機(jī)的InetAddress對(duì)象。這個(gè)方法嘗試連接DNS來(lái)得到一個(gè)真正的主機(jī)名和IP地址,如果沒(méi)有連接到Internet,系統(tǒng)也沒(méi)有固定IP地址或域名,則會(huì)返回回送地址,即主機(jī)名“l(fā)ocalhost”和IP地址“127.0.0.1”

InetAddress.getLocalHost()

緩存

由于DNS查找的開(kāi)銷(xiāo)可能相當(dāng)大(如果請(qǐng)求需要經(jīng)過(guò)多個(gè)中間服務(wù)器,或者嘗試解析一個(gè)不可達(dá)的主機(jī)),所以InetAddress類(lèi)會(huì)緩存查找的結(jié)果。一旦得到一個(gè)給定主機(jī)的地址,就不會(huì)再次查找,即使你為同一個(gè)主機(jī)創(chuàng)建一個(gè)新的InetAddress對(duì)象,也不會(huì)再次查找地址。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容