超文字傳輸協定(HTTP)
/ aitch-tee-tee-PEE /
HTTP 是網頁瀏覽器與網頁伺服器之間用來交談的語言。每當你載入一個頁面、點一個連結、送出一張表單或看到一張圖片時,你的瀏覽器都和某處的某台伺服器交換了 HTTP 訊息。名字已經說明了一切:它最初是為了傳輸超文字(hypertext,內含連結的文件)而發明,但如今它承載的東西,從 JSON 資料、影片到 App 更新無所不包。
HTTP 以一種簡單的「請求/回應」交換來運作。用戶端送出一則請求——一行請求行,指明一個方法與一項資源(「GET /index.html」),接著是若干標頭行,再來是可有可無的主體(body)——伺服器則回傳一則回應——一行狀態行帶著狀態碼(「200 OK」)、若干標頭,再來是主體,通常就是你所要的那個檔案或資料。關鍵是,純 HTTP 是你肉眼就能讀的文字:訊息是一行行人類可讀的字元。HTTP 跑在一個可靠的傳輸之上,傳統上是 TCP,所以它不必擔心位元組遺失或順序錯亂——那由 TCP 處理,HTTP 只負責讀寫一則則完整的訊息。
HTTP 還是無狀態(stateless)的:依設計,伺服器在多次請求之間並不記得關於你的任何事。每則請求都自成一體,必須自行攜帶伺服器所需的一切脈絡。這聽起來有限制,但正是它讓伺服器能處理龐大流量的原因——伺服器不必為每位使用者保留一份開著的記憶。狀態性(知道你已登入、你的購物車裡有什麼)是另外疊加上去的,靠的是 Cookie 與權杖(token)。HTTP 是網頁的基礎,但要注意它並不等於網頁本身:網頁是那些頁面、連結與 App;HTTP 只不過是去把它們取回來的協定。
一次最精簡的 HTTP 交換長這樣。請求:「GET /cat.jpg HTTP/1.1」接著「Host: example.com」。回應:「HTTP/1.1 200 OK」接著「Content-Type: image/jpeg」接著「Content-Length: 50831」,一個空行,然後是這張影像的 50831 個位元組。取回一張圖片的整段對話就是這樣。
一個請求、一個回應:把一個方法與一項資源送上去,一個狀態碼與那些位元組就回來。
HTTP 本身不加密——路徑上任何人都讀得到。HTTPS 是把 HTTP 包在 TLS 裡傳送,由 TLS 加上加密與伺服器身分驗證;HTTP 訊息本身完全一樣,只是被包起來了(TLS 屬於安全領域的主題)。