1.概念
1.1 協議
協議是指在計算機通信和網絡通信中,為了實現數據交換而建立的一套規則、約定或者標準。它定義了通信雙方之間的通信格式、傳輸方式、數據的含義、錯誤處理等細節,從而確保通信的可靠性、有效性和安全性。
>1在計算機網絡中,協議通常分為兩種主要類型:
1. **通信協議(Communication Protocol):** 這類協議定義了計算機之間或計算機與設備之間的通信規則,以確保數據的可靠傳輸。例如,TCP(傳輸控制協議)和UDP(用戶數據報協議)是兩種常見的網絡層協議,用于在互聯網上進行數據傳輸。
2. **應用層協議(Application Layer Protocol):** 這類協議建立在通信協議之上,用于定義應用程序之間的通信規則。應用層協議通常針對特定的應用領域或服務,例如HTTP(超文本傳輸協議)用于在Web瀏覽器和服務器之間傳輸超文本文檔,SMTP(簡單郵件傳輸協議)用于電子郵件的傳輸等。
協議在計算機通信中起著至關重要的作用,它們使得不同系統和設備能夠相互通信并交換數據,從而構建了整個互聯網和各種網絡服務。
1.2 HTTP
HTTP(超文本傳輸協議)是一種用于傳輸超文本文檔(例如HTML文件)的應用層協議,是互聯網上最常用的協議之一。它建立在TCP/IP協議之上,用于客戶端和服務器之間的通信。
HTTP的工作原理如下:
1. **客戶端發送請求:** 客戶端(例如Web瀏覽器)向服務器發送HTTP請求,請求獲取或傳輸特定資源,例如網頁、圖像、視頻等。
2. **服務器處理請求:** 服務器接收到客戶端的請求后,根據請求的內容和類型進行處理。服務器可能會讀取文件、運行腳本、查詢數據庫等操作。
3. **服務器發送響應:** 服務器處理完請求后,將所請求的資源以及相關的響應信息發送回客戶端。
4. **客戶端接收響應:** 客戶端接收到服務器發送的響應后,根據響應的內容進行相應的處理,例如渲染網頁、顯示圖像、播放視頻等。
HTTP通信的特點包括:
- **簡單性:** HTTP的基本功能和操作相對簡單,易于實現和理解。
- **靈活性:** HTTP允許傳輸各種類型的數據,包括文本、圖像、音頻、視頻等。
- **無狀態性:** HTTP是一種無狀態協議,每個請求都是獨立的,服務器不會在多次請求之間保持任何狀態信息。
- **連接性:** HTTP默認使用短連接,即每個請求/響應周期都會建立一個新的TCP連接,但也可以通過HTTP持久連接來重用連接以提高性能。
HTTP協議的版本有多個,其中最常見的是HTTP/1.1和HTTP/2,而HTTP/3則是基于UDP的新一代HTTP協議。
HTTP傳輸的弊端:
1. **不安全性**:HTTP 傳輸的數據并沒有加密,容易被網絡中的攻擊者截獲、篡改或者竊取,導致數據泄露和安全問題。
2. **性能瓶頸**:HTTP 協議中每次請求和響應都需要建立 TCP 連接,這會增加額外的網絡延遲和資源開銷。而且 HTTP 的請求和響應頭部信息較多,還會占用帶寬。
3. **可擴展性差**:HTTP 協議本身的設計比較簡單,只支持基本的請求和響應方式,難以滿足復雜的應用需求。此外,HTTP 協議在傳輸二進制數據等其他格式的數據時,需要對這些數據進行 Base64 編碼,這會增加額外的傳輸開銷。
4. **無法支持實時性交互**:HTTP 是一種請求-響應模式,客戶端需要不斷地發送請求來獲取最新的數據,這會導致實時性較差,難以支持實時性交互。
為了解決 HTTP 協議的這些弊端,人們已經提出了許多新的協議和技術,如 HTTPS、SPDY、HTTP/2、WebSocket 等,這些協議和技術可以提供更好的安全性、性能和可擴展性,從而滿足不同應用場景的需求。
1.3 HTPS
HTTPS的工作原理

HTTPS(HyperText Transfer Protocol Secure)是一種通過計算機網絡進行安全通信的協議。它是基于HTTP協議的加密版本,通過使用TLS/SSL協議進行數據加密,確保通信的安全性和隱私性。以下是HTTPS的工作原理:
1. **建立連接:** 客戶端(例如瀏覽器)向服務器發送連接請求,請求建立安全連接。
2. **握手階段:** 在這個階段,TLS/SSL協議用于進行握手操作,以確保通信的安全性。這包括以下步驟:
? ?- 客戶端發送支持的加密算法列表和其他必要的信息給服務器。
? ?- 服務器選擇一個加密算法并發送其證書(包含公鑰)給客戶端。
? ?- 客戶端驗證服務器證書的有效性,并生成一個用于對稱加密的隨機密鑰,然后使用服務器的公鑰加密該密鑰,并發送給服務器。
? ?- 服務器使用自己的私鑰解密客戶端發送的隨機密鑰。
3. **加密通信:** 一旦握手成功,客戶端和服務器之間的通信將使用雙方協商好的對稱加密密鑰進行加密和解密。這確保了數據在傳輸過程中的機密性。
4. **數據傳輸:** 在建立安全連接后,客戶端和服務器可以安全地傳輸數據,所有傳輸的數據都會被加密。
5. **連接關閉:** 當通信結束時,客戶端或服務器可以選擇關閉連接。
總的來說,HTTPS通過使用加密技術確保了數據在傳輸過程中的安全性,防止了數據被竊取或篡改的風險。這使得用戶可以放心地在互聯網上進行敏感數據的傳輸,例如登錄憑證、支付信息等。
HTTPS通信特點
HTTPS通信的特點包括:
1. **安全性:** HTTPS使用TLS/SSL協議對數據進行加密,因此可以有效防止數據在傳輸過程中被竊取或篡改。這種加密技術保護了用戶的隱私和敏感信息,使其在互聯網上傳輸時更加安全。
2. **驗證身份:** 在握手階段,服務器會向客戶端發送其證書,證書包含了服務器的公鑰和相關信息。客戶端可以驗證證書的有效性,確保其連接的是預期的服務器,而不是中間人攻擊或偽裝的服務器。
3. **完整性保護:** HTTPS不僅對數據進行加密,還使用消息認證碼(MAC)來保護數據的完整性。這意味著即使數據被竊取,攻擊者也無法篡改數據,因為篡改后的數據在解密時會被檢測到。
4. **信任度:** HTTPS通常使用由權威機構頒發的數字證書,這些證書通過了嚴格的身份驗證,客戶端可以信任這些證書。這增加了用戶對連接的信任度,減少了受到釣魚攻擊等威脅的風險。
5. **SEO優化:** 谷歌等搜索引擎對采用HTTPS協議的網站給予更高的排名,這也促使更多網站采用HTTPS,提升了整個網絡環境的安全性。
綜上所述,HTTPS通信的特點使得其成為互聯網上安全傳輸敏感信息的首選協議,保護用戶隱私,防止數據泄露和篡改。
HTTPS傳輸的弊端
HTTPS作為一種安全通信協議,在保護用戶數據方面有著明顯的優勢,但也存在一些弊端:
1. **性能開銷:** HTTPS通信涉及加密和解密操作,這會增加服務器和客戶端的計算負擔,導致一定程度的性能損失。尤其是在服務器端,加密操作可能對服務器的響應時間產生影響。
2. **證書管理成本:** 為了使用HTTPS,網站需要獲取和維護數字證書。證書的獲取和管理可能需要費用,尤其是對于企業級網站來說,還需要定期更新證書,這增加了運維成本。
3. **部署復雜性:** 配置和部署HTTPS通常比HTTP更為復雜,特別是對于較大規模的網站或復雜的網絡架構。需要對服務器、負載均衡器等進行適當的配置和調整。
4. **可能存在中間人攻擊:** 盡管HTTPS可以防止數據被竊取或篡改,但仍然存在中間人攻擊的可能性。如果攻擊者能夠獲取有效的數字證書或以其他方式介入通信,他們可能會中斷或篡改通信。
5. **不可緩存性:** HTTPS通信的內容通常不能被中間節點(例如代理服務器或內容分發網絡)緩存,這可能影響到內容分發和加速,增加了網絡傳輸的負擔。
雖然HTTPS有一些弊端,但綜合考慮其安全性和保護用戶隱私的重要性,大多數網站仍然選擇采用HTTPS來保護數據傳輸的安全。隨著技術的發展和優化,一些弊端可能會逐漸減少。
2.HTTPS和HTTP的區別

3.資源的使用情況

HTTP使用TCP三次握手建立連接,客戶端和服務器需要交換3個包(具體可查看馬海祥博客《HTTP服務的七層架構技術解析及運用》的相關介紹);HTTPS除了TCP的三個包,還要加上ssl握手需要的9個包,所以一共是12個包。
HTTP建立連接,按照下面鏈接中針對Computer Science House的測試,是114毫秒;HTTPS建立連接,耗費436毫秒,ssl部分花費322毫秒,包括網絡延時和ssl本身加解密的開銷(服務器根據客戶端的信息確定是否需要生成新的主密鑰;服務器回復該主密鑰,并返回給客戶端一個用主密鑰認證的信息;服務器向客戶端請求數字簽名和公開密鑰)。
當SSL連接建立后,之后的加密方式就變成了3DES等對于CPU負荷較輕的對稱加密方式,相對前面SSL建立連接時的非對稱加密方式,對稱加密方式對CPU的負荷基本可以忽略不記,所以問題就來了,如果頻繁的重建ssl的session,對于服務器性能的影響將會是致命的,盡管打開HTTPS保活可以緩解單個連接的性能問題,但是對于并發訪問用戶數極多的大型網站,基于負荷分擔的獨立的SSL termination proxy就顯得必不可少了,Web服務放在SSL termination proxy之后,SSL termination proxy既可以是基于硬件的,譬如F5;也可以是基于軟件的,譬如維基百科用到的就是Nginx。
那采用HTTPS后,到底會多用多少服務器資源,2010年1月Gmail切換到完全使用HTTPS, 前端處理SSL機器的CPU負荷增加不超過1%,每個連接的內存消耗少于20KB,網絡流量增加少于2%,由于Gmail應該是使用N臺服務器分布式處理,所以CPU負荷的數據并不具有太多的參考意義,每個連接內存消耗和網絡流量數據有參考意義,這篇文章中還列出了單核每秒大概處理1500次握手(針對1024-bit 的 RSA),這個數據很有參考意義。
Heartbleed這個被稱作史上最大的網絡安全漏洞,想必很多人都有所耳聞,Heartbleed之所以能夠出現,其實和我們這個問題關系還不小,前面我們談到了頻繁重建SSL/TLS的session對于服務器影響是致命的,所以,聰明的RFC在2012年提出了RFC6520 TLS的心跳擴展,這個協議本身是簡單和完美的,通過在客戶端和服務器之間來回發送心跳的請求和應答,保活TLS session,減少重建TLS的session的性能開銷,令人遺憾的是,openssl在實現這個心跳擴展時,犯了一個低級的錯誤,沒有對收到的心跳請求進行長度檢查,直接根據心跳請求長度拷貝數據區,導致簡單的心跳應答中可能包含了服務器端的核心數據區內容,用戶名,密碼,信用卡信息,甚至服務器的私有密鑰都有可能泄露。
4.網站的搭建需不需使用HTTPS
從難易程度來講,HTTP的搭建肯定比HTTPS簡單的多,但是如果你的網站涉及交易支付、在線購物等建議網站應該使用 HTTPS 來保護數據傳輸的安全性。HTTPS 是基于 HTTP 協議之上的一種安全協議,通過使用 SSL/TLS 協議來加密數據傳輸,從而保證了數據傳輸的機密性、完整性和可信性。
在您的網站涉及到用戶信息的收集、交易支付、在線購物等,那么使用 HTTPS 協議將更為重要。因為在 HTTP 協議下,所有數據都是明文傳輸的,如果被黑客截獲,可能會導致用戶賬號密碼、銀行卡信息等敏感數據泄露,給用戶造成不必要的損失。
此外,現在許多搜索引擎和瀏覽器都更加重視網站的安全性,推薦使用 HTTPS。例如,Google 在其搜索引擎結果中標注了非 HTTPS 網站為“不安全”,使用 HTTPS 的網站則會獲得優先顯示和更高的排名。
雖然使用 HTTPS 要比 HTTP 更加復雜,需要配置證書、升級服務器等,但是它可以有效地保護用戶數據傳輸的安全性,有助于提高網站的信譽度和用戶體驗。
5.搭建HTTPS
搭建 HTTPS,您需要完成以下步驟:
1. **獲取 SSL 證書**:您需要從數字證書認證機構(CA)或者自簽名方式獲得 SSL 證書。CA 是一個可信的第三方機構,可以對您的身份和網站進行驗證,并頒發 SSL 證書。自簽名證書是自己制作的證書,不需要經過 CA 的認證,但是它不能被大多數瀏覽器所信任。在選擇證書時,您需要考慮到其安全性、價格和可信度等因素。
2. **配置服務器**:您需要在 Web 服務器上進行相應的配置,以便支持 HTTPS 協議。對于 Apache 和 Nginx 等常見的 Web 服務器,您需要修改配置文件,以啟用 HTTPS 支持,并指定 SSL 證書的位置。
3. **安裝 SSL 證書**:您需要將 SSL 證書安裝到 Web 服務器中,并配置好相應的密鑰和證書鏈。SSL 證書一般包括公鑰和私鑰兩部分,私鑰需要妥善保管,不要泄露給他人。
4. **測試 HTTPS 連接**:在完成上述步驟之后,您需要測試 HTTPS 連接是否正常工作。您可以使用瀏覽器來訪問網站,并檢查瀏覽器地址欄中是否顯示了 HTTPS 協議和 SSL 證書相關信息。
需要注意的是,在搭建 HTTPS 時,您需要考慮到服務器的硬件性能、帶寬、證書有效期、證書更新等因素。同時,您也需要及時升級 Web 服務器軟件和 SSL/TLS 協議,以保證數據傳輸的安全性。
6.免費的證書推薦
推薦幾個免費的 SSL 證書頒發機構:
1. **Let's Encrypt**:Let's Encrypt 提供了免費的 SSL/TLS 證書,其證書受到大多數現代瀏覽器的信任。您可以使用 Certbot 工具來自動化證書的獲取和配置過程,極大地簡化了搭建 HTTPS 的流程。
2. **Cloudflare**:Cloudflare 提供了免費的基本 SSL 證書,可以通過 Cloudflare 的 CDN 服務來實現 HTTPS 加速和安全性增強。其免費證書支持 SNI 技術,適用于大多數網站。
3. **ZeroSSL**:ZeroSSL 提供了簡單易用的免費 SSL 證書生成工具,您可以通過其在線工具來生成免費的 SSL 證書。它也提供了 API 和 ACME 協議的支持,方便自動化證書的獲取和更新。
4. **SSL For Free**:SSL For Free 提供了免費的 SSL 證書,支持通配符證書和多域名證書。您可以通過其在線工具來獲取證書,并提供了相應的安裝說明。
這些免費的 SSL 證書頒發機構都提供了簡單易用的方式來獲取和配置 SSL 證書,可以幫助您快速實現網站的 HTTPS 加密,提升網站的安全性和用戶信任度。
7.每期一問
上期答案
struct ListNode* reverseList(struct ListNode* head) {//判斷傳入的值為空或者只有一個節點直接返回if(head == NULL || head->next == NULL){return head;}struct ListNode* p1;//定義三個指針struct ListNode* p2;struct ListNode* p3;p1 = NULL;p2 = head;p3 = head->next;while(p2){//翻轉指針p2->next = p1;p1 = p2;p2 = p3;if(p3 != NULL){p3 = p3->next;}}return p1;
}
本期問題:. - 力扣(LeetCode)
本期內容就這些,我們下期再見!