帶新手走進神秘的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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...