“嗨,阿米戈!”

“嗨,比拉博!”

“你今天要告訴我什麼新鮮事?”

“很多事情。但首先,我想我們將討論使用網絡和互聯網工作。有興趣嗎?”

“是的。銀河互聯網超級酷。”

“好吧,但讓我們從一些歷史開始。在21世紀初,情況是這樣的……”

“每台連接到互聯網的計算機都有一個唯一的編號。這是一個普通的 4 字節數字。它被稱為 IP 地址。”

“但人類的記憶力很差,很難記住像 2108458776 這樣的東西,所以他們經常把每個字節分開寫。”

“如果我們將四字節數字 2108458776 拆分為單獨的字節,我們將得到 125.172.135.24。您會記得,每個字節由 8 位組成,可以包含從 0 到 255 的數字。”

“所以,這就是我們寫數字的方式?”

“是的。以這種方式書寫時,(對人類而言)更容易記住四字節數字。”

“碰巧的是,只使用 4 個字節的選擇很快就對他們上了一個殘酷的把戲。連接到互聯網的設備數量增長如此之快,以至於他們很快就用完了。”

“他們是怎麼解決這個問題的?”

“他們做了人類通常做的事情。”

“他們提出了一個新的 IP 地址標準,並自豪地將其命名為 IPv6。”

“與使用 4 個字節構成唯一編號的普通 IP 地址(稱為 IPv4)不同,新標準使用 16 個字節。”

“想想看,人類記不住一個普通數字的10個數字(比如2108458776),所以他們不得不把它們分成4個部分,但後來他們想到了用16個字節組成的數字。”

“是啊,有時候人類很奇怪。”

“是啊。人就是人。”

“也就是說,他們確實擺脫了困境。”

“他們厭倦了記住數字,決定用文字代替。”

“怎麼樣?能舉個例子嗎?”

“當然,web.mail.comgoogle.comnew.books.amazon.com ……”

“這種名字叫做域。”

“為了讓這個 Internet 正常工作,他們創建了一個名為域名系統 (DNS) 的特殊表,用於存儲每個域名的 IP 地址。”

“這就是它的工作原理。”

1) 用戶在瀏覽器中輸入地址,例如web.mail.com

2) 瀏覽器訪問DNS,使用域名獲取IP地址。

3) 帶有所需 URL 的請求被發送到該 IP 地址。

“這看起來不是很簡單。”

“但這種方法確實有幾個好處:”

1) 人類發現很容易記住可以用語言表達的名字。”

" 2) 可以通過在名稱的開頭添加子域來分層構建域名。就像 Java 中的包名一樣。"

" 3) 如果需要更改 Web 服務器的 IP 地址,只需更改 DNS 記錄,一切都會像以前一樣工作——用戶不必記住新地址。"

“DNS 看起來像這樣:”

域名 IP地址
郵件.com 128.35.36.189
web.mail.com 145.12.17.13
new.mail.com 192.155.15.3
谷歌.com 92.117.151.100
谷歌.com 193.168.0.1
docs.google.com 217.12.222.1
……

“說得通。”

“無論如何,域是計算機的名稱,但我們不需要計算機——我們需要計算機上的內容。這就是 URL 的用途。”

“最初,URL 實際上是指向另一台計算機上文件的鏈接。例如:”

例子
http://info.codegym.cc/user/info/profile.html _ _ _ _
描述
http 是客戶端-服務器通信的協議
info.codegym.cc 是電腦的域名
user/info/profile.html 是文件在電腦上的路徑

“在網絡發展之初,Web 服務器只能使用 URL 來提供它存儲在某處的文件。URL 實際上是文件的全局路徑:計算機名 + 路徑。”

“後來,當網絡服務器開始自己生成文件時,URL發生了一些變化,變成了對網絡服務器的請求。請求參數也被添加了。”

“如今很少在 URL 的末尾看到文件擴展名。”現代 URL 只是帶有參數的唯一鏈接。更像是一個方法調用而不是全局文件路徑。”

“經典的現代 URL 如下所示:”

解析網址
http://codegym.cc/alpha/api/contacts ? _ _ _ _ userid=13&filter=none&page=3
部分網址說明
codegym.cc 是域名 — 計算機在互聯網上的唯一名稱(地址)
http 是客戶端-服務器通信的協議
alpha/api/contacts 是 web 服務器請求或請求服務器上的網頁
userid=13 & filter=none & page=3 是帶有請求參數的字符串

“是的,我記得。你最近告訴我關於 URL 的事。”

“還有港口。你用了公寓樓的例子。”

“最好告訴我'http'是什麼。我看到到處都寫著'協議',但我不清楚那是什麼。”

“好吧,我不多說就告訴你。”

IP 地址、域、URL - 1

HTTP代表Hyper T ext Transport Protocol ,用於傳輸超文本

“什麼是超文本?”

“它是 HTML。”

“粗略地說,協議就是一套通信規則。它描述了可以發送到網絡服務器的請求,以什麼格式,以及網絡服務器應該如何響應。”

“簡而言之,情況是這樣的。在客戶端和服務器之間發送普通文本文件,或者,如果你願意,也可以發送大塊文本。

請求到達服務器,服務器對每個請求提供響應。”

“以下是此類請求和響應的示例:”

要求
GET alpha/api/contacts HTTP/1.1
Host: codegym.cc
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
描述
GET – request subtype
alpha/api/contacts – request to the web server
HTTP/1.1 – protocol version – HTTP/1.1
Host: codegym.cc – domain name
User-Agent: Mozilla/5… – unique browser name
Accept: text/html – requested document type: HTML
Connection: close – close the server connection after processing the request.

“第一行是實際請求。接下來是額外的請求參數,也稱為‘標頭字段’。”

“這是一個響應示例:”

回复
HTTP/1.1 200 OK
Date: Wed, 11 Feb 2009 11:20:59 GMT
Server: Apache
X-Powered-By: PHP/5.2.4-2ubuntu5wm1
Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT
Content-Language: en
Content-Type: text/html; charset=utf-8
Content-Length: 1234
Connection: close
<html><body><a href="http://ample.com/about.html#contacts">Click here</a></body></html>
HTTP/1.1 200 OK - «200 OK» means everything is okay.
Date: Wed, 11 Feb 2009 - Date on which the request was processed
Server: Apache - Name of the web server
X-Powered-By: PHP - The server uses PHP
Last-Modified: Wed, 11 Feb 2009 - The time of the last update of the requested file
Content-Language: en - The language of the file
Content-Type: text/html; charset=utf-8 – This is an HTML-file with UTF-8 encoding
Content-Length: 1234 - The response is 1234 bytes long
Connection: close - The connection will be closed after the request is handled
<html><body><a href="http://ample - The HTML file itself.

“我想提請你注意兩件事:”

“首先,無論你請求什麼,它看起來都像是向服務器發出的文件請求。文件是否在服務器上或服務器響應請求生成它並不重要。”

“其次,文件本身作為 HTTP 響應的一部分發送。換句話說,我們在服務器響應的開頭看到一些額外的數據,然後是正在提供的文件的主體。

“多麼有趣!我不確定我是否理解了所有內容。我稍後再讀一遍。”

“哦,我確實想告訴你另一件小而有趣的事情:餅乾。”

“那些是什麼?”

“根據 HTTP 協議,cookie 是服務器發送給客戶端的小塊信息,用於存儲在客戶端上。它們作為後續請求的一部分發送回服務器。

“那有什麼意義呢?”

“假設用戶在網站首頁登錄,服務器在服務器上為這個用戶創建一個session對象,並將一個唯一的session號作為cookie發送給客戶端。在客戶端下一次請求時服務器,此會話號將與其他 cookie 一起發送回服務器。這意味著服務器可以識別發送新請求的用戶。”

“多麼有趣!”

“是的。當你編寫自己的 servlet 時,我們將仔細研究這個主題。但現在,讓我們休息一下。”

“不管你說什麼。”