HTTP響應報文與工作原理詳解

HTTP 是一種請求/響應式的協議,即一個客戶端與服務器建立連接后,向服務器發送一個請求;服務器接到請求后,給予相應的響應信息。

超文本傳輸協議(Hypertext Transfer Protocol,簡稱HTTP)是應用層協議。HTTP 是一種請求/響應式的協議,即一個客戶端與服務器建立連接后,向服務器發送一個請求;服務器接到請求后,給予相應的響應信息。

HTTP 請求報文

HTTP 請求報文由請求行、請求頭部、空行 和 請求包體 4 個部分組成,如下圖所示:

http://img.mukewang.com/54d9ba8600011d1505940232.jpg?

下面對請求報文格式進行簡單的分析:

請求行:請求行由方法字段、URL 字段 和HTTP 協議版本字段 3 個部分組成,他們之間使用空格隔開。常用的 HTTP 請求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;

?

● GET:當客戶端要從服務器中讀取某個資源時,使用GET 方法。GET 方法要求服務器將URL 定位的資源放在響應報文的數據部分,回送給客戶端,即向服務器請求某個資源。使用GET 方法時,請求參數和對應的值附加在 URL 后面,利用一個問號(“?”)代表URL 的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind。

?

● POST:當客戶端給服務器提供信息較多時可以使用POST 方法,POST 方法向服務器提交數據,比如完成表單數據的提交,將數據提交給服務器處理。GET 一般用于獲取/查詢資源信息,POST 會附帶用戶數據,一般用于更新資源信息。POST 方法將請求參數封裝在HTTP 請求數據中,以名稱/值的形式出現,可以傳輸大量數據;

?

請求頭部:請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關于客戶端請求的信息,典型的請求頭有:

http://img.mukewang.com/54d9bad400010ba306310345.jpg

空行:最后一個請求頭之后是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭;

請求包體:請求包體不在 GET 方法中使用,而是在POST 方法中使用。POST 方法適用于需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型 Content-Type 和包體長度 Content-Length;

?

?

?

HTTP 響應報文

HTTP 響應報文由狀態行、響應頭部、空行 和 響應包體 4 個部分組成,如下圖所示:

http://img.mukewang.com/54d9bafc0001c8bc05920231.jpg

下面對響應報文格式進行簡單的分析:

狀態行:狀態行由 HTTP 協議版本字段、狀態碼和狀態碼的描述文本 3 個部分組成,他們之間使用空格隔開;

http://img.mukewang.com/54d9bb360001d07806370410.jpg

http://img.mukewang.com/54d9bb500001127e06360246.jpg

響應頭部:響應頭可能包括:

????Location:Location響應報頭域用于重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置,為了讓客戶端重定向到這個頁面新的位置,服務器端可以發回Location響應報頭后使用重定向語句,讓客戶端去訪問新的域名所對應的服務器上的資源;

?

????Server:Server 響應報頭域包含了服務器用來處理請求的軟件信息及其版本。它和 User-Agent 請求報頭域是相對應的,前者發送服務器端軟件的信息,后者發送客戶端軟件(瀏覽器)和操作系統的信息。

Vary:指示不可緩存的請求頭列表;

????Connection:連接方式;

????對于請求來說:close(告訴 WEB 服務器或者代理服務器,在完成本次請求的響應后,斷開連接,不等待本次連接的后續請求了)。keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應后,保持連接,等待本次連接的后續請求);

????對于響應來說:close(連接已經關閉); keepalive(連接保持著,在等待本次連接的后續請求); Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望WEB 服務器保持連接多長時間(秒);例如:Keep-Alive:300;

????WWW-Authenticate:WWW-Authenticate響應報頭域必須被包含在401 (未授權的)響應消息中,這個報頭域和前面講到的Authorization 請求報頭域是相關的,當客戶端收到 401 響應消息,就要決定是否請求服務器對其進行驗證。如果要求服務器對其進行驗證,就可以發送一個包含了Authorization 報頭域的請求;

?

????`空行:最后一個響應頭部之后是一個空行,發送回車符和換行符,通知服務器以下不再有響應頭部。

響應包體:服務器返回給客戶端的文本信息;

?

?

HTTP 工作原理

HTTP 協議采用請求/響應模型。客戶端向服務器發送一個請求報文,服務器以一個狀態作為響應。

以下是 HTTP 請求/響應的步驟:

http://img.mukewang.com/54d9bbee0001153d06430295.jpg

http://img.mukewang.com/54d9bc060001e24206210295.jpg

HTTP 無狀態性

????HTTP 協議是無狀態的(stateless)。也就是說,同一個客戶端第二次訪問同一個服務器上的頁面時,服務器無法知道這個客戶端曾經訪問過,服務器也無法分辨不同的客戶端。HTTP 的無狀態特性簡化了服務器的設計,使服務器更容易支持大量并發的HTTP 請求。

?

HTTP 持久連接

????HTTP1.0 使用的是非持久連接,主要缺點是客戶端必須為每一個待請求的對象建立并維護一個新的連接,即每請求一個文檔就要有兩倍RTT 的開銷。因為同一個頁面可能存在多個對象,所以非持久連接可能使一個頁面的下載變得十分緩慢,而且這種短連接增加了網絡傳輸的負擔。HTTP1.1 使用持久連接keepalive,所謂持久連接,就是服務器在發送響應后仍然在一段時間內保持這條連接,允許在同一個連接中存在多次數據請求和響應,即在持久連接情況下,服務器在發送完響應后并不關閉TCP 連接,而客戶端可以通過這個連接繼續請求其他對象。

HTTP/1.1 協議的持久連接有兩種方式:

● ????非流水線方式:客戶在收到前一個響應后才能發出下一個請求;

● ????流水線方式:客戶在收到 HTTP 的響應報文之前就能接著發送新的請求報文;

?

最后給出一個具體例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Remote?Address:116.57.254.104:80???
Request?URL:http://hr.tencent.com/???
Request?Method:GET???
Status?Code:200?OK???
????
Request?Headers???
GET?/?HTTP/1.1???
Host:?hr.tencent.com???
Connection:?keep-alive???
Accept:?text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8???
User-Agent:?Mozilla/5.0?(X11;?Linux?i686)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/35.0.1916.114?Safari/537.36???
Accept-Encoding:?gzip,deflate,sdch???
Accept-Language:?en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4???
Cookie:?pgv_pvi=2098703360;?PHPSESSID=bc7onl0dojbsatscsfv79pds77;?pgv_info=ssid=s1454606128;????
????????pgv_pvid=926725350;?ts_uid=4084753309???
????
Response?Header???
HTTP/1.1?200?OK???
Server:?nginx???
Date:?Mon,?26?Jan?2015?01:09:10?GMT???
Content-Type:?text/html;charset=utf-8???
Content-Length:?3631???
Connection:?keep-alive???
X-Powered-By:?PHP/5.3.10???
Expires:?Thu,?19?Nov?1981?08:52:00?GMT???
Cache-Control:?no-store,?no-cache,?must-revalidate,?post-check=0,?pre-check=0???
Pragma:?no-cache???
Vary:?Accept-Encoding???
Content-Encoding:?gzip

從請求報文可以知道:

1
GET?/?HTTP/1.1

??

請求方法 GET 表示一個讀取請求,將從服務器獲得網頁數據,/表示URL 的路徑,URL 總是以/開頭,/就表示首頁,最后的HTTP/1.1 指示采用的 HTTP 協議版本是 1.1;請求域名如下所示:

1
Host:?hr.tencent.com

?

響應報文如下:

1
HTTP/1.1?200?OK???Server:?nginx

??

原文來自:http://network.51cto.com/art/201501/464513_1.htm

轉載于:https://www.cnblogs.com/othen/p/4284258.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259381.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

優先隊列priority_queue 用法詳解

轉載: 1.優先隊列priority_queue 用法詳解 2.STL系列之五 priority_queue 優先級隊列 優先隊列是隊列的一種,不過它可以按照自定義的一種方式(數據的優先級)來對隊列中的數據進行動態的排序 每次的push和pop操作,隊…

android自定義畫板,android 自定義控件 -- 畫板

如圖:package com.example.myview;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Paint.Style;import android.util.Attrib…

postgreSQl pathman 用法語句總結

2019獨角獸企業重金招聘Python工程師標準>>> --新建主表 create table part_test(id int, info text, crt_time timestamp not null); --插入測試數據 insert into part_test select id,md5(random()::text),clock_timestamp() (id|| hour)::interval from generat…

Oracle查詢筆記

-- tanslate(str,from_str,to_str) -- 將str中的from_str替換成to_str select translate(hello,e,o) t from dual;-- instr(str,des_str) -- 可以實現like功能 select instr(hello,g),instr(hello,h),instr(hello,l) from dual; -- decode(value,s1,r1,s2,r2,default) -- 類似于…

全排列算法及實現

轉載: 1.http://blog.csdn.net/hackbuteer1/article/details/6657435 2.http://blog.sina.com.cn/s/blog_9f7ea4390101101u.html 3.http://www.slyar.com/blog/stl_next_permutation.html 4.http://www.cplusplus.com/reference/algorithm/next_permutation/ 5…

ssh配置文件詳解

配置“/etc/ssh/sshd_config”文件 “/etc/ssh/sshd_config”是OpenSSH的配置文件,允許設置選項改變這個daemon的運行。這個文件的每一行包含“關鍵詞-值”的匹配,其中“關鍵詞”是忽略大小寫的。下面列出來的是最重要的關鍵詞&#xff0…

EC+VO+SCOPE for ES3

詞法環境 詞法作用域 詞法作用域(lexcical scope)。即JavaScript變量的作用域是在定義時決定而不是執行時決定,也就是說詞法作用域取決于源碼。 詞法環境 用于定義特定變量和函數標識符在ECMAScript代碼的詞法嵌套結構上的關聯關系&#xff0…

你真的會寫二分檢索嗎?

轉載:http://blog.chinaunix.net/uid-1844931-id-3337784.html 前幾天在論壇上看到有統計說有80%的程序員不能夠寫對簡單的二分法。二分法不是很簡單的嗎? 這難道不是聳人聽聞? 其實,二分法真的不那么簡單,尤其是二…

android listview動態加載網絡圖片不顯示,Android Listview異步動態加載網絡圖片

Android Listview異步動態加載網絡圖片詳見: http://blog.sina.com.cn/s/blog_62186b460100zsvb.html標簽: Android SDK代碼片段(5)[代碼] (1)定義類MapListImageAndText管理ListViewItem中控件的內容01 package com.google.zxing.client.android.AsyncL…

C#-面向對象的多態思想 ---ShinePans

總結: 多態是面向對象的核心.---------能夠理解為一個方法,多種實現, 在這里能夠用虛方法,抽象類,接口能夠實現多態 1.首先利用接口來實現多態: 接口相當于"功能,"接口能夠實現多繼承,分為 顯式實現接口和隱式實現接口 keyword為interface格式: interface 接口名 { …

wxpy 0.1.2微信機器人 / 優雅的微信個人號API

微信機器人 / 優雅的微信個人號API,基于 itchat,全面優化接口,更有 Python 范兒。用來干啥一些常見的場景控制路由器、智能家居等具有開放接口的玩意兒跑腳本時自動把日志發送到你的微信加群主為好友,自動拉進群中跨號或跨群轉發消…

c++中try catch的用法

在c中,可以直接拋出異常之后自己進行捕捉處理,如:(這樣就可以在任何自己得到不想要的結果的時候進行中斷,比如在進行數據庫事務操作的時候,如果某一個語句返回SQL_ERROR則直接拋出異常,在catch塊…

const in c and cpp

http://c-faq.com/ansi/constasconst.html 轉載于:https://www.cnblogs.com/invisible/p/3333575.html

android ndk調用出錯,由于Android-NDK應用程序的權限問題,為什么fopen在本地方法中失敗?...

errno 0;FILE *fp;fp fopen("jigar.txt","wb");if(fp NULL)__android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN FAIL with %d",errno);else__android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN pass ");它得到失敗&…

循環隊列

什么是隊列? 隊列(Queue)也是一種運算受限的線性表。它僅僅同意在表的一端進行插入,而在還有一端進行刪除。同意刪除的一端稱為隊頭(front),同意插入的一端稱為隊尾(rear)。 FIFO原則 隊列具有先進先出原則,與棧的先進后出形成對照…

T(n) = 25T(n/5)+n^2的時間復雜度 計算方法

對于T(n) a*T(n/b)c*n^k;T(1) c 這樣的遞歸關系&#xff0c;有這樣的結論&#xff1a; if (a > b^k) T(n) O(n^(logb(a)));logb(a)b為底a的對數 if (a b^k) T(n) O(n^k*logn); if (a < b^k) T(n) O(n^k); a25; b 5 ; k2 ab^k 故T(n)O(n^k*logn)O(n^2*logn)…

android jar導出,Android項目導出jar包的小技巧

我們知道&#xff0c;可以通過如下設置將一個普通的Android工程轉換成Android Library工程設置前后工程變化如下使用Ant編譯時(通過android.bat update project 命令生成 build.xml)&#xff0c;普通的Android工程會生成apk文件&#xff0c;而Android Library工程只生成jar文件…

(五十九)iOS網絡基礎之UIWebView簡易瀏覽器實現

【UIWebView網絡瀏覽器】 通過webView的loadRequest方法可以發送請求顯示相應的網站&#xff0c;例如&#xff1a; NSURL *url [NSURL URLWithString:"http://m.baidu.com"];// 創建請求數據NSURLRequest *request [NSURLRequest requestWithURL:url];// 向服務器發…

無心插柳OR志在必得?阿里推“來往”的意圖

近年來&#xff0c;阿里巴巴在外圍的動作確實不少&#xff0c;投資新浪微博、投資陌陌&#xff0c;配合阿里自身的一些戰略調整&#xff0c;讓人覺得這家公司似乎正在經歷一場前所未有的“蛻變”。其實這也不難理解&#xff0c;在BAT三國演義中&#xff0c;任何一方都不能對其他…

wampserver的mysql啟動與環境變量設置

安裝好wampserver以后&#xff0c;mysql服務默認已經啟動了。但是直接在命令行里輸入"mysql"&#xff0c;系統會提示說 mysql 不是內部或外部命令&#xff0c;也不是可運行的程序或批處理文件。 這是因為沒有增加“mysql”環境變量,請跳到第3步閱讀。 如果之前已經安…