簡單、靈活、易於擴展
首先,HTTP 最重要也是最突出的優點是“簡單、靈活、易於擴展”。
應用廣泛、環境成熟
HTTP 協議的另一大優點是“應用廣泛”,軟硬件環境都非常成熟。
無狀態
看過了兩個優點,我們再來看看一把“雙刃劍”,也就是上一講中說到的“無狀態”,它對於 HTTP 來說既是優點也是缺點。
“無狀態”有什么好處呢?
因為服務器沒有“記憶能力”,所以就不需要額外的資源來記錄狀態信息,不僅實現上會簡單一些,而且還能減輕服務器的負擔,能夠把更多的 CPU 和內存用來對外提供服務。
而且,“無狀態”也表示服務器都是相同的,沒有“狀態”的差異,所以可以很容易地組成集群,讓負載均衡把請求轉發到任意一台服務器,不會因為狀態不一致導致處理出錯,使用“堆機器”的“笨辦法”輕松實現高並發高可用。
那么,“無狀態”又有什么壞處呢?
既然服務器沒有“記憶能力”,它就無法支持需要連續多個步驟的“事務”操作。例如電商購物,首先要登錄,然后添加購物車,再下單、結算、支付,這一系列操作都需要知道用戶的身份才行,但“無狀態”服務器是不知道這些請求是相互關聯的,每次都得問一遍身份信息,不僅麻煩,而且還增加了不必要的數據傳輸量。
所以,HTTP 協議最好是既“無狀態”又“有狀態”,不過還真有“魚和熊掌”兩者兼得這樣的好事,這就是“小甜餅”Cookie 技術(后面會學到)。
明文
HTTP 協議里還有一把優缺點一體的“雙刃劍”,就是明文傳輸。
“明文”意思就是協議里的報文(准確地說是 header 部分)不使用二進制數據,而是用簡單可閱讀的文本形式。
對比 TCP、UDP 這樣的二進制協議,它的優點顯而易見,不需要借助任何外部工具,用瀏覽器、Wireshark 或者 tcpdump 抓包后,直接用肉眼就可以很容易地查看或者修改,為我們的開發調試工作帶來極大的便利。
當然,明文的缺點也是一樣顯而易見,HTTP 報文的所有信息都會暴露在“光天化日之下”,在漫長的傳輸鏈路的每一個環節上都毫無隱私可言,不懷好意的人只要侵入了這個鏈路里的某個設備,簡單地“旁路”一下流量,就可以實現對通信的窺視。
不安全
與“明文”缺點相關但不完全等同的另一個缺點是“不安全”。
安全有很多的方面,明文只是“機密”方面的一個缺點,在“身份認證”和“完整性校驗”這兩方面 HTTP 也是欠缺的。
“身份認證”簡單來說就是“怎么證明你就是你”。在現實生活中比較好辦,你可以拿出身份證、駕照或者護照,上面有照片和權威機構的蓋章,能夠證明你的身份。
至此,結束。