技術觀念 | 淺談分散式系統 - Web 與 Web Service
關於 web 開發,需要理解這麼幾個概念,以及它們之間的關係:
- Web
- HTTP
- Web Server
- Web Client
- Web Application Server
- Web Service
Web 是什麼?
Web就是全球資訊網,亦作WWW、Web,是一個透過網際網路存取的,由許多互相連結的超文字組成的系統。英國科學家提姆·柏內茲-李於1989年發明了全球資訊網。1990年他在瑞士CERN的工作期間編寫了第一個網頁瀏覽器。不是網際網路(Internet),不能混淆!
網際網路是指所有通過 ip 協議連接起來的網路節點所構成的全局網路,包括 Web 全球資訊網(HTTP)、電子郵件網路(SMTP)、文件共享網路(FTP)、IP電話網⋯等等。電信網,蜂窩網有自己的傳輸協議,不屬於網際網路,但可以通過閘道器(協議轉換器)接入網際網路。
HTTP 是什麼?
簡單來說,HTTP 就 Web 傳輸協議,更精確的說是一個基於請求-響應模式進行訊息傳輸的無狀態協議!
超文本傳輸協定(英語:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分散式、協作式和超媒體訊息系統的應用層協定。HTTP是全球資訊網的資料通信的基礎。
設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。透過HTTP或者HTTPS協定請求的資源由統一資源識別碼(Uniform Resource Identifiers,URI)來標識。
HTTP的發展是由提姆·柏內茲-李於1989年在歐洲核子研究組織(CERN)所發起。HTTP的標準制定由全球資訊網協會(World Wide Web Consortium,W3C)和網際網路工程任務組(Internet Engineering Task Force,IETF)進行協調,最終發布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定義了HTTP協定中現今廣泛使用的一個版本——HTTP 1.1。
2014年12月,網際網路工程任務組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組將HTTP/2標準提議遞交至IESG進行討論,於2015年2月17日被批准。HTTP/2標準於2015年5月以RFC 7540正式發表,取代HTTP 1.1成為HTTP的實作標準。
協定概述
HTTP是一個客戶端(用戶)和伺服器端(網站)之間請求和應答的標準,通常使用TCP協定。透過使用網頁瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個HTTP請求到伺服器上指定埠(預設埠為80)。我們稱這個客戶端為用戶代理程式(user agent)。應答的伺服器上儲存著一些資源,比如HTML檔案和圖像。我們稱這個應答伺服器為源伺服器(origin server)。在用戶代理和源伺服器中間可能存在多個「中間層」,比如代理伺服器、閘道器或者隧道(tunnel)。
儘管TCP/IP協定是網際網路上最流行的應用,但是在HTTP協定中並沒有規定它必須使用或它支援的層。事實上HTTP可以在任何網際網路協定或其他網路上實作。HTTP假定其下層協定提供可靠的傳輸。因此,任何能夠提供這種保證的協定都可以被其使用,所以其在TCP/IP協定族使用TCP作為其傳輸層。
通常,由HTTP客戶端發起一個請求,建立一個到伺服器指定埠(預設是80埠)的TCP連接。HTTP伺服器則在那個埠監聽客戶端的請求。一旦收到請求,伺服器會向客戶端返回一個狀態,比如”HTTP/1.1 200 OK”,以及返回的內容,如請求的檔案、錯誤訊息、或者其它訊息。
請求方法
HTTP/1.1協定中共定義了八種方法(也叫「動作」)來以不同方式操作指定的資源:
GET:向指定的資源發出「顯示」請求。使用GET方法應該只用在讀取資料,而不應當被用於產生「副作用」的操作中,例如在網路應用程式中。其中一個原因是GET可能會被網路爬蟲等隨意存取。參見安全方法。瀏覽器直接發出的GET只能由一個url觸發。GET上要在url之外帶一些參數就只能依靠url上附帶querystring。
HEAD:與GET方法一樣,都是向伺服器發出指定資源的請求。只不過伺服器將不傳回資源的本文部份。它的好處在於,使用這個方法可以在不必傳輸全部內容的情況下,就可以取得其中「關於該資源的訊息」(元訊息或稱元資料)。
POST:向指定資源提交資料,請求伺服器進行處理(例如提交表單或者上傳檔案)。資料被包含在請求本文中。這個請求可能會建立新的資源或修改現有資源,或二者皆有。每次提交,表單的資料被瀏覽器用編碼到HTTP請求的body里。瀏覽器發出的POST請求的body主要有有兩種格式,一種是application/x-www-form-urlencoded用來傳輸簡單的資料,大概就是”key1=value1&key2=value2”這樣的格式。另外一種是傳檔案,會採用multipart/form-data格式。採用後者是因為application/x-www-form-urlencoded的編碼方式對於檔案這種二進位的資料非常低效。
PUT:向指定資源位置上傳其最新內容。
DELETE:請求伺服器刪除Request-URI所標識的資源。
TRACE:回顯伺服器收到的請求,主要用於測試或診斷。
OPTIONS:這個方法可使伺服器傳回該資源所支援的所有HTTP請求方法。用’*’來代替資源名稱,向Web伺服器傳送OPTIONS請求,可以測試伺服器功能是否正常運作。
CONNECT:HTTP/1.1協定中預留給能夠將連接改為管道方式的代理伺服器。通常用於SSL加密伺服器的連結(經由非加密的HTTP代理伺服器)。
方法名稱是區分大小寫的。當某個請求所針對的資源不支援對應的請求方法的時候,伺服器應當返回狀態碼405(Method Not Allowed),當伺服器不認識或者不支援對應的請求方法的時候,應當返回狀態碼501(Not Implemented)。
HTTP伺服器至少應該實作GET和HEAD方法,其他方法都是可選的。當然,所有的方法支援的實作都應當符合下述的方法各自的語意定義。此外,除了上述方法,特定的HTTP伺服器還能夠擴充自訂的方法。
Web Server & Web Application 是什麼?
Web Server 是負責存儲、處理和發布 web 資源的軟件系統;
Web Application 則是提供 Web 服務。在具體應用中,其實並不會那麼清晰,比如 Tomcat,jetty 本身就是 HTTP Server,但又是 Servlet Container,能提供 application service。 Nginx 也不單單是 Web Server,還提供各種複雜強大的功能,比如反向代理,緩存,負載平衡等等。
Web Client 是什麼?
Web Client 一般指瀏覽器,但廣義上所有能發送 HTTP 請求的軟件都可以稱為 Web Client,如 curl, wget。在基於 Web Service 的分散式系統中,請求 Web Service 的子系統都可以看做是 Web Client。
階段 | Web Client | Web Server |
---|---|---|
靜態頁面 | 瀏覽器、HTML | Apache、Nginx |
CGI | Perl、PHP | |
Java/.NET | Servlet + JSP vs .NET + ASP | |
Ajax + MVC | Ajax + jQuery | Struts、Ruby on Rails、SpringMVC |
MVVM + REST | Angular/vue |
Web Service 是什麼?
更詳細的Web Service 可以參考技術觀念 | Web Service(Web服務)這篇文章。
Web Service 通常泛指所有基於 HTTP 的服務,比如 Ajax,REST,是實現 SOA 的一種實現方案!
Web Service 是 machine-to-machine 的服務,其消費者是軟件,不是面向用戶的。
常見 Web Service 框架:
註:以上參考了
漫谈分布式系统中的技术 —— 从 IPC/RPC,SOA,Web Service/REST 到 micro services(微服务)
維基百科-網際網路
維基百科-全球資訊網
維基百科-蜂巢式網路
維基百科-超文本傳輸協定