[HTTP][會話與消息][三][學習筆記]

      網友投稿 866 2025-04-03

      1.典型HTTP會話

      在像HTTP這樣的CS協(xié)議中,會話分為三階段:

      客戶端建立一條TCP連接(如果傳輸層不是TCP,也可以是其他連接)。

      客戶端發(fā)送請求并等待應答。

      服務器處理請求并送回應答,回應包括一個狀態(tài)碼和對應的數據。

      從HTTP/1.1開始,連接在完成第三階段后不再關閉,客戶端可以再次發(fā)起新的請求。第二步和第三步可以連續(xù)進行數次。

      1.1.建立連接

      在CS協(xié)議中,連接是由客戶端建立的。在HTTP中打開連接意味著在底層傳輸層啟動連接,通常是TCP。

      使用TCP時HTTP服務器默認端口號為80。

      1.2.發(fā)送客戶端請求

      一旦連接建立,用戶代理可以發(fā)送請求。客戶端請求由一系列文本指令組成,并使用CRLF分割,被劃分為三個塊:

      第一行包括請求方法及請求參數:

      文檔路徑,不包括協(xié)議和域名的絕對路徑URL

      使用的HTTP協(xié)議版本

      接下來每行都表示一個HTTP首部,為服務器提供關于所需數據的信息(語言,MIME類型等)。

      最后一塊是可選數據,有更多數據,主要被POST方法所使用

      請求示例

      import java.net.HttpURLConnection; import java.net.URL; public class HttpGetTest { public static void main(String[] args) { HttpURLConnection httpURLConnection = null; try { //1,獲取要訪問的地址 URL url = new URL("http://example.org/"); //2,得到HttpURLConnection對象 httpURLConnection = (HttpURLConnection) url.openConnection(); //3,設置請求參數 //設置是否從httpurlconnection輸出 httpURLConnection.setDoOutput(false); //設置是否從httpurlconnection讀入 httpURLConnection.setDoInput(true); //設置請求方式,默認為get httpURLConnection.setRequestMethod("GET"); //設置是否使用緩存 httpURLConnection.setUseCaches(false); //設置httpurlconnection是否應該自動執(zhí)行http重定向 httpURLConnection.setInstanceFollowRedirects(false); //設置超時時間(毫秒) httpURLConnection.setConnectTimeout(3000); //連接 httpURLConnection.connect(); //4,獲取響應狀態(tài)碼返回值responseCode int responseCode = httpURLConnection.getResponseCode(); //5,設置響應顯示 if (responseCode == 200) { //響應正常 System.out.println("狀態(tài)碼為:" + responseCode + "。響應正常"); } } catch (Exception e) { e.printStackTrace(); }finally { //6,斷開連接釋放資源 if (null != httpURLConnection) { try { httpURLConnection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } } }

      請求方法

      HTTP定義一組請求方法用來指對目標資源的行為。一般是名詞,但有時會叫HTTP動詞。最常用的請求方法是GET和POST:

      GET方法請求指定的資源。GET請求應該只被用于獲取數據。

      POST方法向服務器發(fā)送數據,因此會改變服務器狀態(tài)。這個方法常在HTML表單中使用。

      1.3.服務器響應結構

      當收到用戶代理發(fā)送的請求后,Web服務器會處理并送回響應。服務器響應也是由一系列文本組成,并使用CRLF分割,它們被劃分為三個不同的塊:

      第一行是狀態(tài)行,包括使用的HTTP協(xié)議版本,狀態(tài)碼和一個狀態(tài)描述(可讀描述文本)。

      接下來每行表示一個HTTP首部,為客戶端提供關于所發(fā)送數據的一些信息(類型,數據大小,使用的壓縮算法,緩存指示等)。

      最后一塊是數據塊,包含了響應的數據(如果有的話)。

      響應示例

      一個成功的網頁響應:

      響應狀態(tài)碼

      HTTP響應狀態(tài)碼用來表示一個HTTP請求是否成功完成。響應分五種類型:信息型響應,成功響應,重定向,客戶端錯誤和服務端錯誤。其中最常見的是以下三個狀態(tài)碼:

      200:OK,請求成功。

      301:Moved Permanently。請求資源的URI已被改變。

      404:Not Found。服務器無法找到請求的資源。

      2.HTTP消息

      HTTP消息是服務器和客戶端之間交換數據的方式。有兩種類型的消息:請求(requests),由客戶端發(fā)送用來觸發(fā)一個服務器上的動作;響應(responses),來自服務器的應答。

      HTTP消息由采用ASCII編碼的多行文本構成。在HTTP/1.1及早期版本中,這些消息通過連接公開地發(fā)送。在HTTP/2中,為了優(yōu)化和性能方面的改進,曾經可人工閱讀的消息被分到多個HTTP幀中。

      HTTP/2二進制框架機制被設計為不需要改動任何API或配置文件即可應用:大體上對用戶是透明的。

      HTTP請求和響應具有相似的結構,由以下部分組成:

      一行起始行用于描述要執(zhí)行的請求,或者是對應的狀態(tài),成功或失敗。這個起始行總是單行的。

      一個可選的HTTP頭集合指明請求或描述消息正文。

      一個空行指示所有關于請求的元數據已經發(fā)送完畢。

      一個可選的包含請求相關數據的正文(比如HTML表單內容),或者響應相關的文檔。正文的大小有起始行的HTTP頭來指定。

      起始行和HTTP消息中的HTTP頭統(tǒng)稱為請求頭,而其有效負載被稱為消息正文。

      2.1.HTTP請求

      起始行

      HTTP請求是由客戶端發(fā)出的消息,用來使服務器執(zhí)行動作。start-line包含三個元素:

      HTTP方法,一個動詞(GET/PUT/POST)或者一個名詞(HEAD/OPTIONS),描述要執(zhí)行的動作。

      request target,通常是一個URL,或者是協(xié)議、端口和域名的絕對路徑,通常以請求的環(huán)境為特征。請求的格式因不同的HTTP方法而異。可以是:

      絕對路徑,末尾跟上一個?和查詢字符串。這是最常見的,稱為origin form,被GET/POST/HEAD/OPTIONS方法所使用。

      POST / HTTP/1.1

      GET /background.png HTTP/1.0

      HEAD /test.html?query=hello HTTP/1.1

      OPTIONS /test1.html HTTP/1.0

      一個完整的URL,稱為absolute form,主要在使用GET方法連接到代理時使用。

      GET https://www.huawei.com HTTP/1.1

      由域名和可選端口(以’:'為前綴)組成的URL的authority component,稱為authority form。僅在使用CONNECT建立HTTP隧道時才使用。

      CONNECT example.org:80 HTTP/1.1

      星號形式(asterisk form),一個簡單的*,配合OPTIONS方法使用,代表整個服務器。OPTIONS * HTTP/1.1

      HTTP版本(HTTP version),定義了剩余報文的結構,作為對期望的響應版本的指示符。

      Headers

      [HTTP][會話與消息][三][學習筆記]

      來自請求的HTTP headers遵循和HTTP header相同的基本結構:不區(qū)分大小寫的字符串,緊跟著的冒號:和一個結構取決于header的值。整個header(包括值)由一行組成。

      請求頭可以分為幾組:

      General headers,例如via,適用于整個報文

      Request headers,例如User-Agent,Accept-Type,通過進一步的定義(例如Accept-Language)或者給定上下文(例如Referer),或者進行有條件的限制(例如If-None)來修改請求。

      Entity headers,例如Content-Length,適用于請求的body。顯然,如果請求中沒有任何body,則不會發(fā)送這樣的頭文件。

      Body

      請求的最后一部分是它的body。不是所有的請求都有一個body:例如獲取資源的請求,GET,HEAD,DELETE和OPTIONS,通常它們不需要body。 有些請求將數據發(fā)送到服務器以便更新數據:常見的的情況是 POST 請求(包含 HTML 表單數據)。

      body可以分兩類:

      Single-resource bodies,由一個單文件組成。該類型 body 由兩個 header 定義: Content-Type 和 Content-Length.

      Multiple-resource bodies,由多部分 body 組成,每一部分包含不同的信息位。通常是和 HTML Forms 連系在一起。

      2.2.HTTP響應

      狀態(tài)行

      HTTP響應的起始行被稱為status line,包含以下信息:

      協(xié)議版本,通常為HTTP/1.1

      status code,表明請求是成功或失敗。常見狀態(tài)碼為200,404,302

      status text,一個簡短的,純粹的信息,通過狀態(tài)碼的文本描述,幫助人們理解該 HTTP 消息。

      一個典型的狀態(tài)行看起來像這樣:HTTP/1.1 404 Not Found。

      Headers

      響應的HTTP headers遵循和任何其它header相同的結構:不區(qū)分大小寫的字符串,緊跟著的冒號:和一個結構取決于header類型的值。整個header(包括其值)表現(xiàn)為單行形式。

      有許多響應頭可用,這些響應頭可以分為幾組:

      General headers,例如Via,適用于整個報文。

      Response headers,例如Vary和Accept-Ranges,提供其它不符合狀態(tài)行的關于服務器的信息。

      Entity headers,例如Content-Length,適用于請求的body。顯然,如果請求中沒有任何 body,則不會發(fā)送這樣的頭文件。

      Body

      響應的最后一部分是body。不是所有的響應都有body:具有狀態(tài)碼(如 201 或 204)的響應,通常不會有body。

      body大致可分為三類:

      Single-resource bodies,由已知長度的單個文件組成。該類型body由兩個header定義:Content-Type和Content-Length。

      Single-resource bodies,由未知長度的單個文件組成,通過將Transfer-Encoding設置為chunked來使用chunks編碼。

      Multiple-resource bodies,由多部分body組成,每部分包含不同的信息段。但這是比較少見的。

      2.3.HTTP/2幀

      HTTP/1.x報文有一些性能上的缺點:

      Header不像body,它不會被壓縮。

      兩個報文之間的header通常非常相似,但它們仍然在連接中重復傳輸。

      無法復用。當在同一個服務器打開幾個連接時:TCP熱連接比冷連接更加有效。

      HTTP/2引入了一個額外的步驟:它將HTTP/1.x消息分成幀并嵌入到流(stream)中。數據幀和報頭幀分離,這將允許報頭壓縮。將多個流組合,這是一個被稱為多路復用(multiplexing)的過程,它允許更有效的底層TCP連接。

      HTTP幀現(xiàn)在對Web開發(fā)人員是透明的。在HTTP/2中,這是一個在HTTP/1.1和底層傳輸協(xié)議之間附加的步驟。Web開發(fā)人員不需要在其使用的API中做任何更改來利用HTTP幀;當瀏覽器和服務器都可用時,HTTP/2將被打開并使用。

      2.4.結論

      HTTP報文是使用HTTP的關鍵;它們的結構簡單,并且具有高可擴展性。HTTP/2幀機制是在HTTP/1.x語法和底層傳輸協(xié)議之間增加了一個新的中間層,而沒有從根本上修改它,即它是建立在經過驗證的機制之上。

      HTTP TCP/IP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:插入批注
      下一篇:你的公司為什么要開展OKR(你的公司是做什么的)
      相關文章
      中文字幕亚洲码在线| 亚洲精品成人片在线播放| 亚洲一区二区三区四区视频| 国产亚洲精品国产| 亚洲国产一区二区视频网站| 亚洲人成电影网站免费| 亚洲AV无码专区国产乱码4SE| 亚洲视频在线不卡| 亚洲精品综合一二三区在线| 亚洲av无码专区国产乱码在线观看 | 亚洲码一区二区三区| 久久精品国产亚洲77777| 久久亚洲国产中v天仙www| 国产亚洲日韩一区二区三区| 久久久无码精品亚洲日韩软件 | 久久久久久久久无码精品亚洲日韩 | 亚洲精品乱码久久久久久| 久久精品国产精品亚洲| 亚洲国产成人影院播放| 国产精品观看在线亚洲人成网| 亚洲AⅤ视频一区二区三区| 亚洲成A人片77777国产| 亚洲A丁香五香天堂网| 亚洲精品国产高清不卡在线| 丁香五月亚洲综合深深爱| 亚洲精品美女久久777777| 西西人体44rt高清亚洲| 亚洲最新视频在线观看| 亚洲一区精品视频在线| 亚洲一本一道一区二区三区| 婷婷国产偷v国产偷v亚洲| 亚洲国产精品国产自在在线| 亚洲精品乱码久久久久久自慰 | 亚洲一区二区三区夜色| 亚洲精品在线网站| 亚洲乱码中文字幕小综合| 亚洲欧美熟妇综合久久久久| 亚洲 无码 在线 专区| 亚洲精品无码永久在线观看| 久久精品国产精品亚洲精品| 91情国产l精品国产亚洲区|