為什麼要發明 HTTP ?
HTTP 是全球資訊網 (WWW) 的資料通訊的基礎 !
「全球資訊網」就是 World Wide Web, 就是大家熟知的 WWW, 而 HTTP 就是為了能夠讓資料在這個網際網路流通所訂定的通訊協定。我還有印象, 大學教授曾說中國的狼煙就是最早的通訊協定; 透過煙的顏色, 數量, 來告知遠地的人信息, 把網際網路擴大解釋, 中國是鼻祖 (疑?)。
HTTP 是全球資訊網 (WWW) 的資料通訊的基礎
查詢到「UCLA 舉辦了網際網路的30歲慶生會」這個標題時間是 1999/09/12, 才知道網際網路已經發展將近 50 年了 (1969 ~ 2017 截稿)。
1969 年, 網際網路 (Internet) 之父, 美國 UCLA 教授 Leonard Kleinrock 將 UCLA 與 Stanford 兩個實驗室的電腦, 試連成功
1971 年, Internet 首度連到美國以外地區, 如英國、挪威
1973 年, TCP/IP 通訊協定被提出
1984 年, 美國國防部將 TCP/IP 作為所有電腦網路的標準
1990 年, 英國的 Berners Lee (瑞士粒子物理實驗室) 成功的提出與開發了全球資訊網 (World Wide Web),被稱為「WWW 之父」
1991 年, Berners Lee 在瑞士歐洲核子研究組織建立了 HTML、HTTP
1990 年 ~ 1999 年間, 網際網路風靡全球, 直到 2000 年網路泡破。
2016年, 有個有趣的事, 美聯社認為「網際網路」已和「電話」一樣成為一件一般的事物, 不具有專屬商標的意義, 於是開始在其格式手冊中規定「internet」和「web」一詞全部小寫, 紐約時報也隨後跟進。今年已經 2017 了, 記得 i 跟 w 都要小寫 !
HTTP 是 TCP/IP 的應用層協定
HTTP 不管從網路 OSI 模型 7 層, 或是 TCP/IP 4 層來看, 都是基於 TCP 層 (傳輸層) 與 IP 層 (網路層) 的應用層, 但事實上只要符合 HTTP 的 RFC 標準, 是可以基於其他傳輸方式來溝通的。參考 wiki 整理下表, 可看出 HTTP 與 TCP/IP 的相對層級。OSI 7 層 | ||
7
| 應用層 |
HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP
|
application layer | ||
6
| 表現層 |
XDR、ASN.1、SMB、AFP、NCP
|
presentation layer | ||
5
| 會議層 |
ASAP、SSH、RPC、NetBIOS、ASP、Winsock、BSD sockets
|
session layer | ||
4
| 傳輸層 |
TCP、UDP、TLS、RTP、SCTP、SPX、ATP、IL
|
transport layer | ||
3
| 網路層 |
IP、ICMP、IPX、BGP、OSPF、RIP、IGRP、EIGRP、ARP、RARP、X.25
|
network layer | ||
2
| 資料連結層 |
乙太網、令牌環、HDLC、訊框中繼、ISDN、ATM、IEEE 802.11、FDDI、PPP
|
data link layer | ||
1
| 實體層 |
線路、無線電、光纖
|
physical layer | ||
TCP/IP 4 層 | ||
4
| 應用層 |
HTTP、FTP、DNS
|
application layer | ||
3
| 傳輸層 |
TCP、UDP、RTP、SCTP
|
transport layer | ||
2
| 網路互連層 |
IP
|
internet layer | ||
1
| 網路介面層 |
乙太網、Wi-Fi、MPLS
|
link layer |
HTTP 通訊協定的版本
設計 HTTP 最初的目的是為了提供一種發布和接收 HTML 頁面的方法。但今日我們使用 HTTP 協定已經不僅傳輸 HTML 或圖檔, 任何客戶端與服務端透過 HTTP 連線, 發出 HEAD, GET, POST, PUT, DELETE 等請求, 交換文本內容 (text, html, xml, json, jpg, stream...), 都是在進行 HTTP 溝通。而且, 開發的焦點也都是應用行為, 如方法、狀態碼、快取, 已經很少注意底層是 TCP/IP 了。所以當遭遇到為何過多的 request 會造成緩慢 ? 除了網路、過大的資料交換內容、瀏覽器限制, 原來建立 TCP/IP 連線天生就是需要開銷的, 尤其 HTTP 1.1 版本以前不支持持久連線, 那不斷連線斷線, 流量大時可以預見服務器常常忙碌無法回應了。目前的 HTTP 版本有:
Ver | Release Date | RFC | Note |
HTTP/0.9 | 1991 | (已廢止), 只接受 GET 一種請求方法 ASCII 電文, 每次斷線重連 | |
HTTP/1.0 | 1996/05 | 1945 | 可發送多行命令 |
HTTP/1.1 | 1997/01 | 2068 | 持久連線被預設採用 |
1999/06 | 2616 | 補充狀態碼 | |
2014/06 | 7230
7231 7232 7233 7234 7235 | 將文件拆為多份: RFC7230: Message Syntax and Routing - low-level message parsing and connection management RFC7231: Semantics and Content - methods, status codes and headers RFC7232: Conditional Requests - e.g., If-Modified-Since RFC7233: Range Requests - getting partial content RFC7234: Caching - browser and intermediary caches RFC7235: Authentication - a framework for HTTP authentication | |
HTTP/2.0 | 2015/05 | 7540 | 相容 HTTP/1.1 加入多工 (Multiplexing), 允許瀏覽器在同時間內對多個伺服器發送請求 |
HTTP 通訊範例
打開 command 命令列, 來試試一個 Google 首頁的 HTTP 連線
(注意首頁的 URI 是 / )
> telnet www.google.com 80
> GET / HTTP/1.1
Host: www.google.com
Request
Response
這樣就是一個完整的請求, 而且並沒有馬上被斷線 (HTTP/1.1 特性)。再多試一下 HTTP/2.0 協定看是否有回應。從下圖看起來 Google 首頁也還沒支持 HTTP/2.0 就是了, 而且這個請求馬上被斷線 (Disconnected)。參考資料
- https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
- https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F
- https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91
- https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session https://www.facebook.com/will.fans/videos/1727290680633402/
- https://www.slideshare.net/WillHuangTW/hypertext-transfer-protocol-77109917
- https://simular.co/knowledge/site-build/68-about-http2-and-http11.html
- http://www.infoq.com/cn/news/2014/06/http-11-updated
- https://www.slideshare.net/LoadImpact/http11-vs-http2-a-performance-analysis
Comments
Post a Comment