帶新手走進神秘的HTTP協議

来源:http://www.cnblogs.com/jycboy/archive/2017/02/15/http1.html
-Advertisement-
Play Games

在開發的時候經常需要訪問網路,比如Android就有好多這方面的框架:Volley、OkHttp、Retrofit等,當你看這些框架源碼時,可能會很好奇關於http的部分,它的首部欄位是什麼意思,http是如何工作的??等等,希望這篇文章會為你解惑。 一、概念 協議是指電腦通信網路中兩台電腦之間 ...


在開發的時候經常需要訪問網路,比如Android就有好多這方面的框架:Volley、OkHttp、Retrofit等,當你看這些框架源碼時,可能會很好奇關於http的部分,它的首部欄位是什麼意思,http是如何工作的??等等,希望這篇文章會為你解惑。

一、概念

協議是指電腦通信網路中兩台電腦之間進行通信所必須共同遵守的規定或規則,超文本傳輸協議(HTTP)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web伺服器傳送到客戶端的瀏覽器。

HTTP協議,即超文本傳輸協議(Hypertext transfer protocol)。是一種詳細規定了瀏覽器和萬維網(WWW = World Wide Web)伺服器之間互相通信的規則,通過網際網路傳送萬維網文檔的數據傳送協議。

HTTP協議是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳送協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證電腦正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。

HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。

在Internet中所有的傳輸都是通過TCP/IP進行的。HTTP協議作為TCP/IP模型中應用層的協議也不例外。HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖所示:

HTTP預設的埠號為80,HTTPS的埠號為443。

瀏覽網頁是HTTP的主要應用,但是這並不代表HTTP就只能應用於網頁的瀏覽。HTTP是一種協議,只要通信的雙方都遵守這個協議,HTTP就能有用武之地。比如咱們常用的QQ,迅雷這些軟體,都會使用HTTP協議(還包括其他的協議)。

二、簡史

HTTP/0.9
HTTP 於 1990 年問世。那時的 HTTP 並沒有作為正式的標準被建立。現在的 HTTP 其實含有 HTTP1.0 之前 版本的意思,因此被稱為 HTTP/0.9。

HTTP/1.0

HTTP 正式作為標準被公佈是在 1996 年的 5 月,版本被命名為 HTTP/1.0,並記載於 RFC1945。雖說是初 期標準,但該協議標準至今仍被廣泛使用在伺服器端。
RFC1945 - Hypertext Transfer Protocol -- HTTP/1.0
http://www.ietf.org/rfc/rfc1945.txt 

HTTP/1.1

1997 年 1 月公佈的 HTTP/1.1 是目前主流的 HTTP 協議版本。當初的標準是 RFC2068,之後發佈的修訂版 RFC2616 就是當前的最新版本。
RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1
http://www.ietf.org/rfc/rfc2616.txt 
可見,作為 Web 文檔傳輸協議的 HTTP,它的版本幾乎沒有更新。新一代 HTTP/2.0 正在制訂中,但要達到 較高的使用覆蓋率,仍需假以時日。

三、統一資源定位符

URL 的一般形式是:

<URL的訪問方式>://<主機>:<埠>/<路徑>

四、HTTP 的操作過程 

  1. 每個Web站點都運行一個伺服器進程,它不斷地監聽TCP的埠80,以便發現是否有向它發來連接請求;
  2. 一旦收到請求並建立了TCP連接之後,瀏覽器就向伺服器發出某個頁面的請求,伺服器接著就返回請求的頁面作響應;
  3. 最後連接被釋放。這之間一系列信息的傳輸都遵循HTTP。 

五、Web工作過程

上圖用戶點擊滑鼠後所發生的事件:

(1) 瀏覽器分析超鏈指向頁面的 URL;

(2) 瀏覽器向 DNS 請求解析 www.tsinghua.edu.cn 的 IP 地址;

(3) 功能變數名稱系統 DNS 解析出清華大學伺服器的 IP 地址;

(4) 瀏覽器與伺服器建立 TCP 連接;

(5) 瀏覽器遵循HTTP協議發出取文件命令:

      GET /chn/yxsz/index.htm;

(6) 伺服器給出響應,把文件 index.htm 發給瀏覽器;

(7) TCP 連接釋放;

(8) 瀏覽器顯示“清華大學院系設置”文件 index.htm 中的所有文本。

六、HTTP 的報文種類 

HTTP 有兩類報文:

    請求報文——從客戶向伺服器發送請求報文。

    響應報文——從伺服器到客戶的回答。 

6.1 HTTP 的報文結構

 6.1 請求報文

報文由三個部分組成,即開始行、首部行和實體主體

在請求報文中,開始行就是請求行。

1.  方法:

方法”是面向對象技術中使用的專門名詞。所謂“方法”就是對所請求的對象進行的操作,因此這些方法實際上也就是一些命令。因此,請求報文的類型是由它所採用的方法決定的。

HTTP 請求報文的一些方法 

 

2.URL

“URL”是所請求的資源的 URL。

3.版本

“版本”是 HTTP 的版本。

4.一個請求報文的例子:

 

6.2 響應報文

響應報文的開始行是狀態行。

狀態行包括三項內容,即 HTTP 的版本狀態碼,以及解釋狀態碼的簡單短語

狀態碼都是三位數字 :

  • 1xx 表示通知信息的,如請求收到了或正在進行處理。
  • 2xx 表示成功,如接受或知道了。
  • 3xx 表示重定向,表示要完成請求還必須採取進一步的行動。
  • 4xx 表示客戶的差錯,如請求中有錯誤的語法或不能完成。
  • 5xx 表示伺服器的差錯,如伺服器失效無法完成請求。 

一個響應報文的例子:

6.3 使用WireShark實例分析

下麵是一個用wireShark獲取的http協議包:

可以看到這是post方法、url:/pcsuiteprofile/api/updateinfo?u=38e37ccd&len=24

版本:HTTP/1.1  \r\n:回車換行

首部欄位:Host、Accept、Content-Type、Content-Length等等。

展開Post,具體分析,如圖:

 

選中post,下邊的16進位中顯示的是:50 4f 53 54正好是POST四個字母對應的16進位ASCII,可以自行去對比ASCII。

如果你不會用wireShark,可以看下這篇文章:https://community.emc.com/message/818739#818739,只看一就夠用了。

 七、使用 Cookie 的狀態管理

 HTTP 是無狀態協議,它不對之前發生過的請求和響應的狀態進行管理。也就是說,無法根據之前的狀態進行本次的請求處理。
Cookie 技術通過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。
Cookie 會根據從伺服器端發送的響應報文內的一個叫做 Set-Cookie 的首部欄位信息,通知客戶端保存 Cookie。當下次客戶端再往該伺服器發送請求時,客戶端會自動在請求報文中加入 Cookie 值後發送出去。
伺服器端發現客戶端發送過來的 Cookie 後,會去檢查究竟是從哪一個客戶端發來的連接請求,然後對比服務 器上的記錄,最後得到之前的狀態信息。
  1. 沒有 Cookie 信信息狀態下的請求 

上圖展示了發生 Cookie 交互的情景,HTTP 請求報文和響應報文的內容如下。

1. 請求報文(沒有 Cookie 信息的狀態)

GET/reader/HTTP/1.1
Host:hackr.jp
*首部欄位內沒有Cookie的相關信息

2. 響應報文(伺服器端生成 Cookie 信息) 

HTTP/1.1200OK
Date:Thu,12Jul201207:12:20GMT
Server:Apache
<Set-Cookie:sid=1342077140226724;path=/;expires=Wed,10-Oct-1207:12:20GMT>
Content-Type:text/plain;charset=UTF-8

3. 請求報文(自動發送保存著的 Cookie 信息)

GET/image/HTTP/1.1
Host:hackr.jp
Cookie:sid=1342077140226724

有關請求報文和響應報文內Cookie 對應的首部欄位,請參考之後的章節。

八、特點

HTTP協議永遠都是客戶端發起請求,伺服器回送響應。這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,伺服器將消息推送給客戶端。

HTTP協議的主要特點可概括如下:
1、支持客戶/伺服器模式。支持基本認證和安全認證。
2、簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯繫的類型不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通信速度很快。
3、靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4、HTTP 0.9和1.0使用非持續連接:限制每次連接只處理一個請求,伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連接。HTTP 1.1使用持續連接:不必為每個web對象創建一個新的連接,一個連接可以傳送多個對象,採用這種方式可以節省傳輸時間。
5、無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。

無狀態協議:
協議的狀態是指下一次傳輸可以“記住”這次傳輸信息的能力。
http是不會為了下一次連接而維護這次連接所傳輸的信息,為了保證伺服器記憶體。
比如客戶獲得一張網頁之後關閉瀏覽器,然後再一次啟動瀏覽器,再登陸該網站,但是伺服器並不知道客戶關閉了一次瀏覽器。
由於Web伺服器要面對很多瀏覽器的併發訪問,為了提高Web伺服器對併發訪問的處理能力,在設計HTTP協議時規定Web伺服器發送HTTP應答報文和文檔時,不保存發出請求的Web瀏覽器進程的任何狀態信息。這有可能出現一個瀏覽器在短短幾秒之內兩次訪問同一對象時,伺服器進程不會因為已經給它發過應答報文而不接受第二期服務請求。由於Web伺服器不保存發送請求的Web瀏覽器進程的任何信息,因此HTTP協議屬於無狀態協議(Stateless Protocol)。

HTTP協議是無狀態的和Connection: keep-alive的區別:
無狀態是指協議對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。從另一方面講,打開一個伺服器上的網頁和你之前打開這個伺服器上的網頁之間沒有任何聯繫。
HTTP是一個無狀態的面向連接的協議,無狀態不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協議(無連接)。
從HTTP/1.1起,預設都開啟了Keep-Alive,保持連接特性,簡單地說,當一個網頁打開完成後,客戶端和伺服器之間用於傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個伺服器上的網頁,會繼續使用這一條已經建立的連接。
Keep-Alive不會永久保持連接,它有一個保持時間,可以在不同的伺服器軟體(如Apache)中設定這個時間。

註:本篇文章只是對http進行了簡單的介紹,如果你想知道http的首部欄位是什麼意思,Accept、User-Agent、Connection等,https又是什麼,歡迎看之後的更新。

轉發請註明出處:http://www.cnblogs.com/jycboy/p/http1.html 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 二碼公益軟體開發,二碼公益app開發,二碼公益開發聯繫微電188-2624-7572. 隨著社會的發展、經濟的進步,人口老齡化問題不可避免地日益凸顯,“尊老、敬老、扶老”,成為了每個中國人越發不能忽視的社會責任。 在這樣的大環境下,“二碼公益”應運而生,它將取代傳統的商業模式,無論是作為商家還是消費 ...
  • android中一個對象已經不需要了,但是其他對象還持有他的引用,導致他不能回收,導致這個對象暫存在記憶體中,這樣記憶體泄漏就出現了。 記憶體泄漏出現多了,會是應用占用過多的沒存,當占用的記憶體超過了系統分配的記憶體容量,就會出現記憶體溢出了導致應用Crash. 瞭解了記憶體泄漏的原因及影響後,我們需要做的就是掌 ...
  • 基於 GCDAsyncSocket,簡單實現類似《你猜我畫》的 socket 數據傳輸 ...
  • 由於IOS系統存儲的數據都是在sandBox裡面,一旦刪除App,sandBox也不復存在。好在有一個例外,那就是keychain(鑰匙串)。 通常情況下,IOS系統用NSUserDefaults存儲數據信息,但是對於一些私密信息,比如密碼、證書等等,就需要使用更為安全的keychain了。 key ...
  • iOS OpenGL ES CAEAGLLayer 創建Framebuffer和Renderbuffer ...
  • 這段時間項目要求做一個類似的鬧鐘提醒功能,對通知不太熟悉的我,決定先用到xcode自帶的本地通知試試,最終成功的實現了功能,特整理分享下。 它的表現特點: app關閉的時候也能接收和顯示通知。 app處於後臺的時候能接收通知也能顯示。 app處於前臺的時候能接收,但不能顯示,但是會走應用程式dele ...
  • 今天剛從GitHub上找了一個不錯的項目,想要把它導入自己的項目中,過程中也遇到了一些小問題,總結一下,以便複習回顧!!!! 1.首先將從GitHub上下載的壓縮包進行解壓,找到其中的項目文件,直接複製粘貼在自己要導入的項目的文件夾中!!!然後Build>Rebuild Project,重新構建項目 ...
  • 經過一番思想掙扎和鬥爭之後,最終還是選擇採用Xamarin來開發跨平臺移動應用,好處和優點大家可以搜索其它博文,因為家裡面窮加上談了戀愛,就不買蘋果了,開發階段在Windows上面直接搞定哈,時候不早了,廢話不多說,咱們擼起袖子開搞吧。 安裝前的準備工具 1、蘋果鏡像文件:http://pan.ba ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...