“嗨,阿米戈!”
“嗨,比拉博!”
“你今天要告訴我什麼新鮮事?”
“很多事情。但首先,我想我們將討論使用網絡和互聯網工作。有興趣嗎?”
“是的。銀河互聯網超級酷。”
“好吧,但讓我們從一些歷史開始。在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.com、google.com、new.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'是什麼。我看到到處都寫著'協議',但我不清楚那是什麼。”
“好吧,我不多說就告訴你。”
“ 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 時,我們將仔細研究這個主題。但現在,讓我們休息一下。”
“不管你說什麼。”
GO TO FULL VERSION