SSL/TLS的原理以及互聯網究竟是如何工作的(9)——想知道瀏覽網頁是個怎樣的過程嗎?3W工作室的成員們在此!

Chapter 1:愛吹牛的HTTP!

我:又有段時間沒來網絡工作室了。上次和TCP還有UDP聊了聊,這次去看望誰呢?
(走著走著,突然撞上了一個傢伙)

我:啊,撞到誰了?你是……

HTTP:(非常熱情的)Hi,幽靈,我是大名鼎鼎的HTTP(HyperText Transfer Protocol,超文本傳輸協議)啊,你平時上網最喜歡做的事情就是瀏覽網頁了吧?那就是要靠我才能做到啊:我負責客戶端(通常是瀏覽器,但現在越來越多的其他應用程序也開始用HTTP協議進行通信了,例如殺毒軟件更新病毒庫)和服務器端的通信,當你在瀏覽器地址欄內輸入URL(Uniform Resource Locater)並敲擊回車鍵之後,我就向網站服務器發出請求,服務器接收到請求之後就把網頁發送回來,然後你就看到網頁啦!

我:……你應該省略了很多技術細節吧?

HTTP:(眼中閃過一絲驚慌,但馬上恢復了平靜)啊,是的,不過你只要知道我是應用層的主角就行了,是我讓你看到網頁的,就是我哦!
(突然稀里嘩啦的衝出了好幾個人)

HTML&CSS&XML&CGI&PHP&JavaScript&Java applet&AJAX&TCP:(大吼)HTTP你這個不要臉的,竟然把功勞都攬在自己身上!

我:(驚訝)怎麼一下子出現了這麼多人?啊,TCP我認識,其他那些都是誰啊?TCP,這是怎麼回事?

TCP:我說幽靈,你應該明白HTTP作為一個應用層協議是根本不可能單獨工作的吧?

我:TCP,你的意思是HTTP工作在TCP之上?

TCP:對,默認端口80。瀏覽器先與服務器建立TCP連接,然後再發送HTTP請求,HTTP本身只是個非常簡單的請求——響應協議,什麼連接可靠性擁塞控制這些全都是我在負責。

我:這樣啊。那麼那幾位又分別是誰?

HTML:(突然開口)你叫幽靈?我聽TCP說過你,是一個很好學的小鬼頭。先說一下,我們幾位和HTTP都是WWW(World Wide Web,萬維網)工作室的成員,WWW工作室是網絡工作室的子工作室,隸屬於應用層工作組。(生氣)HTTP是我們當中最愛吹牛的一個了,每次一看到陌生人都馬上衝出去搭訕外加把功勞都攬在自己身上,真是的!

我:那個,請問你是……

HTML:我是HTML(HyperText Markup Language,超文本標記語言)。我想問一下,你認為你看到的網頁是怎樣產生的?

我:我認為,這和文檔一樣,網站服務器就是直接把一個可交互的文檔發過來了而已,然後我就看到了頁面……

HTML:請問你是停留在20年前嗎?哈,還是先說說我自己吧:超文本標記語言,請注意,”標記語言“,我和C啊JAVA那些程序語言在本質上是不一樣的!程序語言是按照自己的句法和邏輯一句句執行下去的,還有自定義的各種關鍵詞函數變量常量這些,而我——標記語言,沒有這些!我只是對於已有的文本進行字體啊,段落啊這些進行用於排版的標記而已。

瀏覽器向服務器發送請求之後,服務器就把我(HTML源代碼)發送過來,瀏覽器再進行闡釋和渲染從而得到頁面。當然了,這只適用於只有文本的情況,如果頁面上有圖片視頻音頻這些文件,那麼瀏覽器還要再次發送請求,服務器再把這些文件發送過來……

HTTP:我來說!這是我的領域:(尷尬的笑笑)我是工作在TCP之上的,剛開始的時候,TCP連接建立之後我就發送請求,然後服務器傳送HTML源代碼過來,然後TCP連接就被釋放了;接下來,如果瀏覽器發現還需要再次發送請求,那麼就要重新建立連接,這樣自然是一件非常耗費資源且效率極低的事情;後來我就被改進了,在第一次請求——響應過程完成之後,TCP連接不被釋放,而是一直保持在那裡(keep–alive)……

我:等一下……那麼應該如何判斷何時頁面完全加載完成,然後再釋放連接呢?

HTTP:有一種方法是如果用戶請求了另一個頁面,那麼就釋放當前頁面的連接,不過考慮到視頻越來越受歡迎,這麼做明顯是不合適的;現在通行做法是噹噹前TCP連接閒置一段時間(例如60s)之後就釋放連接。除此之外,我還支持管道(pipeline),舉個例子:Tor官網主頁上有不少圖像資源,常規過程是先發送一個圖像加載請求,等到接收到服務器送來的圖像資源過後再發送第二個圖像加載請求,然後以此類推直到最後一個圖像加載完成;很明顯,這麼做的效率非常低,而所謂的管道就是這樣一個過程:發送了第一個圖像加載請求之後馬上發送第二個圖像加載請求,這樣就能縮短加載時間了。

我:很聰明的辦法。

HTTP:多謝誇獎(笑)。還有一種提高效率的辦法:同時建立多條TCP連接(TCP parallel ),不過這麼做缺點很明顯:一是會額外耗費大量資源,二是每條TCP連接都單獨進行擁塞控制,結果導致連接之間惡性競爭,降低了整體傳輸效率。所以實際上最常用的還是keep–alive和pipeline。

我是一個簡單的請求——響應協議(同時瞪了TCP一眼),但這可不代表我是個簡陋的協議:我處理的數據包由header(頭部)和用戶數據組成,同時還帶有method(請求數據包)和狀態碼(響應數據包),複雜的很哪!

先來看看請求數據包吧:最常用的method有GET和POST這兩種,其他還有CONNECT,PUT,TRACE,DELETE,HEAD,OPTION這些相對比較少見的,我來說說他們的含義吧:

GET要求服務器向客戶端發送請求的網頁,通用格式為GET filename HTTP/1.1,其中 filename是要被封裝的網頁的名字,而HTTP/1.1則是協議版本號。順便說一句,我很快就要升級為2.0嘍!到時候我會擁有很多新特性呢,敬請期待(笑)!

POST用來向服務器端提交數據從而擴展當前頁面,例如提交一份調查表格或者向購物網站提交選擇的商品,服務器端收到之後再根據提交的數據響應出相應的頁面來……

GGI&PHP&JavaScript&Java applet:(異口同聲)喂,HTTP,該給我們出場機會了!說起和用戶的交互還有動態頁面,怎麼可以沒有我們呢!

我:(汗)你們幾位又是哪路神仙?什麼動態頁面靜態頁面?

HTML:(大喊)你們幾個還嫌這裡不夠熱鬧是嗎?這會兒跳出來,幽靈能明白你們是干嘛的嗎?(轉過頭來)幽靈啊,我本該在一開始就跟你解釋下這動態頁面和靜態頁面的事的……

我:這動態頁面應該就是指頁面上有變化元素的那種,靜態頁面就是指單純的文本圖像頁面吧?

HTML:錯了!靜態頁面(static page)是指沒有程序運行的頁面,只要是沒有程序運行,播放視頻和音頻的頁面也是靜態頁面;而動態頁面(dynamic page)則是指上面嵌有程序或者直接由程序生成的頁面,那些擁有高度交互性的頁面(例如G+頁面)基本上都是動態頁面。我就是負責生成靜態頁面的,而剛剛跳出來的那幾位,都是負責動態頁面的,特別是PHP和JavaScript,一個是論壇搭建老手,另一個是用戶交互專家,平時你上網時見到最多的,除了我就是他們倆了……

CSS:喂喂,HTML,還有我好不好?沒有我,大部分網頁的排版都會不正常的!

XML:還有我呢!我可比你HTML這個僵化的老頭子要強太多了,我可以自定義任何標籤!而且你這傢伙到現在為止都還要在插件(plug-in)的幫助之下才能播放視頻和運行在線遊戲,丟不丟人啊?

HTML:XML,你太過分了!已經投入使用的HTML5.0標準就完美實現了在沒有任何程序輔助的情況下,瀏覽器單獨運行在線遊戲和播放視頻,你裝瞎子看不見是嗎?

我:……這麼多人看都看昏了,還是讓HTTP繼續吧,OK?

待續……

科普文鏈接集合:
https://plus.google.com/+GhostAssassin/posts/a8aKzvZLsuV

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *