## 概述和歷史回顧
當你在瀏覽器地址欄輸入 URL 的時候,你希望看到在你的瀏覽器里顯示這個網站。當你點了一個鏈接,或者提交了一個表單,你的瀏覽器可能會顯示下一個頁面,或者在你的表單中顯示一些錯誤提示,以便你能糾正它們并再次提交。你的瀏覽器就是一個接口,或者說一扇窗,通過她你就可以與萬維網進行互動與交互。
在你的瀏覽器的背后,有一堆文件 -- CSS,HTML,Javascript,視頻文件,圖片文件等等 -- 這些文件構成了你所看到的頁面。所有這些東西都是通過一個叫做 HTTP 的傳輸協議從**服務器**傳輸到你的瀏覽器,也就是**客戶端**里(所以你現在知道為什么在瀏覽器地址欄輸地址的時候前面加的是?`http://`?了吧)。
HTTP,或者超文本傳輸協議,是上世紀80年代由蒂姆.伯納斯.李發明的。它是一個規則系統,是一種協議,把應用程序和超文本文檔之間的傳輸聯系起來。換句話說,HTTP 就是機器之間彼此溝通的一個協議,或者說一個消息格式。HTTP 遵循一個簡單的模型:從客戶端發出請求到服務器并等待響應。因此它也被認為是一種“請求--響應協議”。請求和響應都是文本信息,或者說是字符串,信息寫法遵循著一個規則,能保證其他機器能夠理解上面的內容。
HTTP 協議從創立之初已經經過了一些變化。最開始的時候這個協議僅僅返回 HTML 頁面。在 1991年,第一個文檔 HTTP/0.9 發布。1992年,HTTP/1.0 發布,并支持傳輸不同的文件類型,比如 CSS 文件,視頻,腳本和圖片。1995年,HTTP/1.1 介紹了連接復用和其他的一些特性。1999年又對 HTTP/1.1 做了一些改進,我們現在看到的就是這一版本。在撰寫本文時,HTTP/2 正處于開發初期。
## 互聯網是如何工作的
互聯網是由數以百萬計的互相連接的網絡構成,網絡中計算機和其他設備可以互相通信。按照慣例,網絡內的所有設備都提供獨特的標簽。這種標簽的總稱是互聯網協議地址或 IP 地址,是類似于在互聯網上的計算機的電話號碼。此外,IP 地址還有端口號,這會提供更多關于如何與其交流的細節 (類似于分機號碼)。IP 地址一般都長這樣:
~~~
192.168.0.1
~~~
當需要一個端口號的時候,這樣:
~~~
192.168.0.2:1234
~~~
IP 地址是`192.168.0.2`,端口號是`1234`。 IP 地址是設備或服務器的標識符,可以包含數以千計的端口,每個端口都用于不同的交互目標。
互聯網是比網絡更大的一個概念,互聯網上每個設備都有?[互聯網服務供應商 (ISP)](http://en.wikipedia.org/wiki/Internet_service_provider)?提供的公網 IP 地址,通過這些地址,它們可以進行通信。當我們想訪問 Google 的主頁的時候,我們并沒有在瀏覽器里輸入它的 IP 地址,我們只是輸入 Google 的 URL?[http://www.google.com](http://www.google.com/),但是像?[http://www.google.com](http://www.google.com/)?這樣一個地址,你的電腦是怎么知道它的 IP 地址的呢?
## DNS
URL 和 IP 地址之間的對應由域名解析系統也就是常說的 DNS 來控制。DNS 是一個分布式數據庫,把像[http://www.google.com](http://www.google.com/)?這樣的域名翻譯成 IP 地址,并將請求映射到遠程服務器。換句話說,DNS 在互聯網上記錄 URL 和它對應的 IP 地址。所以像?[http://www.google.com](http://www.google.com/)?這樣的域名會被解析成一個 IP 地址`197.251.230.45`。順便提一下,通過在瀏覽器地址欄里敲 IP 地址也能訪問網站。
不過,比起記一串數字來說,大多數人還是喜歡使用一個用戶友好的地址如?[http://www.google.com](http://www.google.com/)?這樣的。DNS 數據庫被安裝在叫做 DNS 服務器的設備上。重要的一點是,DNS 服務器集群是分層級的,沒有任何一個單一的 DNS 服務器中包含所有數據。如果一個 DNS 服務器里沒有一個請求需要的域名,這個 DNS 服務器就會把請求轉發給這個集群上更上一層節點的 DNS 服務器。最終,這個域名會在某個 DNS 服務器上的數據庫里被發現,然后它對應的 IP 地址所代表的設備就會來接受這個請求。
你通過瀏覽器與互聯網交互的一個典型實例是這樣的:
1. 在瀏覽器里輸入類似?[http://www.google.com](http://www.google.com/)?這樣的地址。
2. 你的請求被發送到你設備的網絡接口。
3. 這個請求的互聯網之旅從搜索?[http://www.google.com](http://www.google.com/)?的 IP 地址開始。在屏幕后面,[http://www.google.com](http://www.google.com/)?代表了一個與某個遠程服務器關聯的 IP 地址的人類友好的名稱。
4. 遠程服務器接受請求并將響應通過互聯網發送到你的網絡接口,并把它交給你的瀏覽器。
5. 最終,瀏覽器把這個響應作為一個網頁的形式呈現在你面前。
有一點你要明白,當你的瀏覽器發出請求的時候,它只是發送了一些文本到一個 IP 地址。因為客戶端 (瀏覽器) 和服務器 (請求接收者) 之間有一個 HTTP 形式的約定,或者叫協議,這樣服務器才可以分析請求,了解其組成并將響應發送回 web 瀏覽器。然后,web 瀏覽器將響應字符串處理成你能理解的內容。瀏覽像 Facebook,Google 和 Twitter 這樣的網站,就意味著你一直在使用 HTTP。這些細節都被隱藏了,你的瀏覽器會自動處理好請求和響應。互聯網的不同部分看起來像是這樣的:

## 客戶端和服務器
最常見的客戶端是你每天與之交互,被稱為 Web 瀏覽器的應用程序。Web 瀏覽器常見的有 Internet Explorer、 火狐、 Safari,包括移動版本。Web 瀏覽器的職責是發送 HTTP 請求,并將響應處理成人類友好的形式顯示在你的顯示器上。web 瀏覽器并不是唯一的客戶端,有很多工具或者應用都能發送 HTTP 請求。
你的請求的內容最終的接收者是被稱為服務器的遠程計算機。服務器也沒啥神秘的,就是處理請求的設備,它們的工作就是發送一個響應回去。通常情況下,服務器發送回去的響應里面都包含了請求中指定的一些數據。

## 資源 (Resources)
資源是一個通用術語,指的是互聯網上你通過 URL 與其交互的東西。包括了圖片,視頻,網頁和其他文件。資源并不限于文件或者網頁。資源也可能是一個軟件,一個炒股的軟件,一個游戲。互聯網上有無數的資源。

## 無狀態的 (statelessness)
當一個協議設計成每一個請求/響應周期與前一個都是互相獨立的話,我們就說這個協議是無狀態的。對于 HTTP 要知道的一點就是,無狀態協議對于服務器資源和易用性的影響。HTTP 協議下,服務器不需要在各次請求之間保留狀態信息。結果就是如果一次請求出了問題,系統不必做任何清理。以上兩個原因讓 HTTP 協議變的很靈活,但同時也變的很難構建有狀態的應用。因為 HTTP 本質上是個無狀態的互聯網協議,這就意味著 web 開發人員在構建有狀態應用的時候,不得不努力想辦法來模擬 web 應用中的有狀態體驗。 舉個例子,當你上 Facebook 的時候,你先登錄,然后你看到了一個 Facebook 的網頁。這就是一個完整的請求/響應周期。你點了一張照片 -- 另一個請求/響應周期 -- 但是在第二個動作之后你并沒有退出登錄。如果 HTTP 是無狀態的,它是怎么維持狀態并且知道你剛剛已經登錄過了呢?事實上,如果 HTTP 是無狀態的,Facebook 是怎么知道哪個請求是你發出的?它是怎么區分你和其他用戶的?這些都是 web 開發人員和 web 開發框架耍的小詭計,讓 web 應用看起來像是有狀態的,不過這些小詭計不在本書的討論范圍內。你所要記住的就是,盡管你覺得這個應用是有狀態的,但是在它背后,這個 web 應用是構建在 HTTP,一個無狀態協議之上的。以上,就是為什么 web 如此靈活和去中心化,同時又特別難控制,也是為什么 web 的安全性難以保證,為什么在 web 上構建應用不是易事。
## 小結
本章用一種簡單的描述解釋了互聯網如何工作和幾個術語。你也學到了無狀態對 web 應用的影響。在下一章,我們會深入探討?[http://www.google.com](http://www.google.com/)?這樣的地址到底是什么以及它各部分的作用。