HTTP 協議中你必須知道的三種數據格式

2021-02-21 程序源

來源:songjz

連結:segmentfault.com/a/1190000007434122

實習中的一個主要工作就是分析 HTTP 中的協議,自己也用 Python 寫過正則表達式對 HTTP 請求和響應的內容進行匹配,然後把關鍵欄位抽離出來放到一個字典中以備使用(可以稍微改造一下就是一個爬蟲工具)。

HTTP 協議中的很多坑,自己都遇到過,我就針對自己遇到的幾種 HTTP 常見的數據格式,來做一個總結。

Zlib 壓縮數據

對於 Zlib,一點也不陌生,我們平時用它來壓縮文件,常見類型有 zip、rar 和 7z 等。Zlib 是一種流行的文件壓縮算法,應用十分廣泛,尤其是在 Linux 平臺。當應用 Zlib 壓縮到一個純文本文件時,效果是非常明顯的,大約可以減少70%以上的文件大小,這取決於文件中的內容。

Zlib 也適用於 Web 數據傳輸,比如利用 Apache 中的 Gzip (後面會提到,一種壓縮算法) 模塊,我們可以使用 Gzip 壓縮算法來對 Apache 伺服器發布的網頁內容進行壓縮後再傳輸到客戶端瀏覽器。這樣經過壓縮後實際上降低了網絡傳輸的字節數,最明顯的好處就是可以加快網頁加載的速度。

網頁加載速度加快的好處不言而喻,節省流量,改善用戶的瀏覽體驗。而這些好處並不僅僅限於靜態內容,PHP 動態頁面和其他動態生成的內容均可以通過使用 Apache 壓縮模塊壓縮,加上其他的性能調整機制和相應的伺服器端 緩存規則,這可以大大提高網站的性能。因此,對於部署在 Linux 伺服器上的 PHP 程序,在伺服器支持的情況下,建議你開啟使用 Gzip Web 壓縮。

Gzip 壓縮兩種類型

壓縮算法不同,可以產生不同的壓縮數據(目的都是為了減小文件大小)。目前 Web 端流行的壓縮格式有兩種,分別是 Gzip 和 Defalte。

Apache 中的就是 Gzip 模塊,Deflate 是同時使用了 LZ77 算法與哈夫曼編碼(Huffman Coding)的一個無損數據壓縮算法。Deflate 壓縮與解壓的原始碼可以在自由、通用的壓縮庫 zlib 上找到。

更高壓縮率的 Deflate 是 7-zip 所實現的。AdvanceCOMP 也使用這種實現,它可以對 gzip、PNG、MNG 以及 ZIP 文件進行壓縮從而得到比 zlib 更小的文件大小。在 Ken Silverman的 KZIP 與 PNGOUT 中使用了一種更加高效同時要求更多用戶輸入的 Deflate 程序。

deflate 使用 inflateInit(),而 gzip 使用 inflateInit2() 進行初始化,比 inflateInit() 多一個參數: -MAX_WBITS,表示處理 raw deflate 數據。因為 gzip 數據中的 zlib 壓縮數據塊沒有 zlib header 的兩個字節。使用 inflateInit2 時要求 zlib 庫忽略 zlib header。在 zlib 手冊中要求 windowBits 為 8..15,但是實際上其它範圍的數據有特殊作用,如負數表示 raw deflate。

其實說這麼多,總結一句話,Deflate 是一種壓縮算法,是 huffman 編碼的一種加強。 deflate 與 gzip 解壓的代碼幾乎相同,可以合成一塊代碼。

更多知識請見 維基百科 zlib(https://en.wikipedia.org/wiki/Zlib)。

Web 伺服器處理數據壓縮的過程

Web伺服器接收到瀏覽器的HTTP請求後,檢查瀏覽器是否支持HTTP壓縮(Accept-Encoding 信息);

如果瀏覽器支持HTTP壓縮,Web伺服器檢查請求文件的後綴名;

如果請求文件是HTML、CSS等靜態文件,Web伺服器到壓縮緩衝目錄中檢查是否已經存在請求文件的最新壓縮文件;

如果請求文件的壓縮文件不存在,Web伺服器向瀏覽器返回未壓縮的請求文件,並在壓縮緩衝目錄中存放請求文件的壓縮文件;

如果請求文件的最新壓縮文件已經存在,則直接返回請求文件的壓縮文件;

如果請求文件是動態文件,Web伺服器動態壓縮內容並返回瀏覽器,壓縮內容不存放到壓縮緩存目錄中。

舉個慄子

說了這麼多,下面舉一個例子,打開抓包軟體,訪問我們學校的官網( www.ecnu.edu.cn ),請求頭如下:

GET /_css/tpl2/system.css HTTP/1.1

Host: www.ecnu.edu.cn

Connection: keep-alive

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36

Accept: text/css,*/*;q=0.1

Referer: http://www.ecnu.edu.cn/

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.8

Cookie: a10-default-cookie-persist-20480-sg_bluecoat_a=AFFIHIMKFAAA

在第七行, Accept-Encoding 顯示的是 gzip, deflate,這句話的意思是,瀏覽器告訴伺服器支持 gzip 和 deflate 兩種數據格式,伺服器收到這種請求之後,會進行 gzip 或 deflate 壓縮(一般都是返回 gzip 格式的數據)。

Python 的 urllib2 就可以設置這個參數:

request = urllib2.Request(url)

request.add_header('Accept-encoding', 'gzip')

//或者設置成 deflate

request.add_header('Accept-encoding', 'deflate')

//或者兩者都設置

request.add_header('Accept-encoding', 'gzip, deflate')

伺服器給的響應一般如下:

HTTP/1.1 200 OK

Date: Sat, 22 Oct 2016 11:41:19 GMT

Content-Type: text/javascript;

Transfer-Encoding: chunked

Connection: close

Vary: Accept-Encoding

tracecode: 24798560510951725578102219

Server: Apache

Content-Encoding: gzip

 

400a

..ks#I. ...W...,....>..T..]..Z...Y..].MK..2..L..(略)

//響應體為壓縮數據

從響應頭來看,Content-Encoding: gzip 這段話說明響應體的壓縮方式是 gzip 壓縮,一般有幾種情況,欄位為空表示明文無壓縮,還有 Content-Encoding: gzip 和 Content-Encoding: deflate 兩種。

實際上 Gzip 網站要遠比 Deflate 多,之前寫過一個簡單爬蟲從 hao123的主頁開始爬,爬幾千個網頁(基本涵蓋所有常用的),專門分析響應體的壓縮類型,得到的結果是:

Accept-Encoding 不設置參數:會返回一個無壓縮的響應體(瀏覽器比較特別,他們會自動設置 Accept-Encoding: gzip: deflate 來提高傳輸速度);

Accept-Encoding: gzip,100% 的網站都會返回 gzip 壓縮,但不保證網際網路所有網站都支持 gzip(萬一沒開啟);

Accept-Encoding: deflate:只有不到 10% 的網站返回一個 deflate 壓縮的響應,其他的則返回一個沒有壓縮的響應體。

Accept-Encoding: gzip, deflate:返回的結果也都是 gzip 格式的數據,說明在優先級上 gzip 更受歡迎。

響應頭的 Encoding 欄位很有幫助,比如我們寫個正則表達式匹配響應頭是什麼壓縮:

(?<=Content-Encoding: ).+(?=\r\n)

匹配到內容為空說明沒有壓縮,為 gzip 說明響應體要經過 gzip 解壓,為 deflate 說明為 deflate 壓縮。

Python 中的 zlib 庫

在python中有zlib庫,它可以解決gzip、deflate和zlib壓縮。這三種對應的壓縮方式分別是:

RFC 1950 (zlib compressed format)

RFC 1951 (deflate compressed format)

RFC 1952 (gzip compressed format)

雖說是 Python 庫,但是底層還是 C(C++) 來實現的,這個 http-parser 也是 C 實現的源碼,Nodejs 的 http-parser 也是 C 實現的源碼,zlib 的 C 源碼在這裡(https://github.com/madler/zlib)。C 真的好牛逼呀!

在解壓縮的過程中,需要選擇 windowBits 參數:

to (de-)compress deflate format, use wbits = -zlib.MAX_WBITS

to (de-)compress zlib format, use wbits = zlib.MAX_WBITS

to (de-)compress gzip format, use wbits = zli

例如,解壓gzip數據,就可以使用zlib.decompress(data, zlib.MAX_WBITS | 16),解壓deflate數據可以使用zlib.decompress(data,- zlib.MAX_WBITS)。

當然,對於gzip文件,也可以使用python的gzip包來解決,可以參考下面的代碼:

>>> import gzip

>>> import StringIO

>>> fio = StringIO.StringIO(gzip_data)

>>> f = gzip.GzipFile(fileobj=fio)

>>> f.read()

'test'

>>> f.close()

也可以在解壓的時候自動加入頭檢測,把32加入頭中就可以觸發頭檢測,例如:

>>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32)

'test'

>>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32)

'test'

以上參考 stackoverflow How can I decompress a gzip stream with zlib?。

剛接觸這些東西的時候,每天都會稀奇古怪的報一些錯誤,基本上 Google 一下都能解決。

分塊傳輸編碼 chunked

分塊傳輸編碼(Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許 HTTP 由網頁伺服器發送給客戶端應用( 通常是網頁瀏覽器)的數據可以分成多個部分。分塊傳輸編碼只在 HTTP 協議 1.1 版本(HTTP/1.1)中提供。

通常,HTTP 應答消息中發送的數據是整個發送的,Content-Length 消息頭欄位表示數據的長度。數據的長度很重要,因為客戶端需要知道哪裡是應答消息的結束,以及後續應答消息的開始。然而,使用分塊傳輸編碼,數據分解成一系列數據塊,並以一個或多個塊發送,這樣伺服器可以發送數據而不需要預先知道發送內容的總大小。通常數據塊的大小是一致的,但也不總是這種情況。

分塊傳輸的優點

HTTP 1.1引入分塊傳輸編碼提供了以下幾點好處:

HTTP 分塊傳輸編碼允許伺服器為動態生成的內容維持 HTTP 持久連結。通常,持久連結需要伺服器在開始發送消息體前發送 Content-Length 消息頭欄位,但是對於動態生成的內容來說,在內容創建完之前是不可知的。

分塊傳輸編碼允許伺服器在最後發送消息頭欄位。對於那些頭欄位值在內容被生成之前無法知道的情形非常重要,例如消息的內容要使用散列進行籤名,散列的結果通過 HTTP 消息頭欄位進行傳輸。沒有分塊傳輸編碼時,伺服器必須緩衝內容直到完成後計算頭欄位的值並在發送內容前發送這些頭欄位的值。

HTTP 伺服器有時使用壓縮 (gzip 或 deflate)以縮短傳輸花費的時間。分塊傳輸編碼可以用來分隔壓縮對象的多個部分。在這種情況下,塊不是分別壓縮的,而是整個負載進行壓縮,壓縮的輸出使用本文描述的方案進行分塊傳輸。在壓縮的情形中,分塊編碼有利於一邊進行壓縮一邊發送數據,而不是先完成壓縮過程以得知壓縮後數據的大小。

註:以上內容來自於維基百科。

分塊傳輸的格式

如果一個 HTTP 消息(請求消息或應答消息)的 Transfer-Encoding 消息頭的值為 chunked,那麼,消息體由數量未定的塊組成,並以最後一個大小為 0 的塊為結束。

每一個非空的塊都以該塊包含數據的字節數(字節數以十六進位表示)開始,跟隨一個 CRLF(回車及換行),然後是數據本身,最後塊 CRLF 結束。在一些實現中,塊大小和 CRLF 之間填充有白空格(0x20)。

最後一塊是單行,由塊大小(0),一些可選的填充白空格,以及 CRLF。最後一塊不再包含任何數據,但是可以發送可選的尾部,包括消息頭欄位。

消息最後以 CRLF 結尾。例如下面就是一個 chunked 格式的響應體。

HTTP/1.1 200 OK

Date: Wed, 06 Jul 2016 06:59:55 GMT

Server: Apache

Accept-Ranges: bytes

Transfer-Encoding: chunked

Content-Type: text/html

Content-Encoding: gzip

Age: 35

X-Via: 1.1 daodianxinxiazai58:88 (Cdn Cache Server V2.0), 1.1 yzdx147:1 (Cdn

Cache Server V2.0)

Connection: keep-alive

 

a

....k.|W..

166

..OO.0...&~..;...]..(F=V.A3.X..~z...-.l8.y....).?....,....j..h .6

....s.~.>..mZ .8/..,.)B.G.`"Dq.P].f=0..Q..dh.8....F..y.q4

{F..M.A.*..a.rAra.... .n>.D

..o@.`^!@ $...p...%a\D..K.. .d{2...UnF,C[....Tc....V...."%.`U.?

D....#..K..<D.e....IFK0.<...)]K.V/eK.Qz...^....t...S6...m...^..CK.XRU?m..

....Z..#Uik.

0

Transfer-Encoding: chunked欄位可以看出響應體是否為 chunked 壓縮,chunked 數據很有意思,採用的格式是 長度rn內容\r\n長度\r\n..0\r\n,而且長度還是十六進位的,最後以 0\r\n 結尾(不保證都有)。因為上面的數據是 gzip 壓縮,看起來不夠直觀,下面舉個簡單的例子:

5\r\n

ababa\r\n

f\r\n

123451234512345\r\n

14\r\n

12345123451234512345\r\n

0\r\n

上述例子 chunked 解碼後的數據 ababa12345...,另外 \r\n 是不可見的,我手動加的。

和 gzip 一樣,一樣可以寫一個正則表達式來匹配:

(?<=Transfer-Encoding: ).+(?=\r\n)

處理 chunked 數據

從前面的介紹可以知道,response-body 部分其實由 length(1) \r\n data(1) \r\n length(2) \r\n data(2)…… 循環組成,通過下面的函數進行處理,再根據壓縮類型解壓出最終的數據。

Python 處理的過程如下:

unchunked = b''

pos = 0

while pos <= len(data):

    chunkNumLen = data.find(b'\r\n', pos)-pos

    //從第一個元素開始,發現第一個\r\n,計算length長度

    chunkLen=int(data[pos:pos+chunkNumLen], 16)

    //把length的長度轉換成int

    if chunkLen == 0:

        break

        //如果長度為0,則說明到結尾

    chunk = data[pos+chunkNumLen+len('\r\n'):pos+chunkNumLen+len('\r\n')+chunkLen]

    unchunked += chunk

    //將壓縮數據拼接

    pos += chunkNumLen+len('\r\n')+chunkLen+len('\r\n')

    //同時pos位置向後移動

 

return unchunked

//此時處理後unchunked就是普通的壓縮數據,可以用zlib解壓函數進行解壓

實際中,我們會同時遇到既時 chunked 又是壓縮數據的響應,這個時候處理的思路應該是:先處理 chunked,在處理壓縮數據,順序不能反。

MultiPart 數據

MultiPart 的本質就是 Post 請求,MultiPart出現在請求中,用來對一些文件(圖片或文檔)進行處理,在請求頭中出現 Content-Type: multipart/form-data; boundary=::287032381131322 則表示為 MultiPart 格式數據包,下面這個是 multipart 數據包格式:

POST /cgi-bin/qtest HTTP/1.1

Host: aram

User-Agent: Mozilla/5.0 Gecko/2009042316 Firefox/3.0.10

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-us,en;q=0.5

Accept-Encoding: gzip,deflate

Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7

Keep-Alive: 300

Connection: keep-alive

Referer: http://aram/~martind/banner.htm

Content-Type: multipart/form-data; boundary=::287032381131322

Content-Length: 514

 

--::287032381131322

Content-Disposition: form-data; name="datafile1"; filename="r.gif"

Content-Type: image/gif

 

GIF87a...,.D..;

--::287032381131322

Content-Disposition: form-data; name="datafile2"; filename="g.gif"

Content-Type: image/gif

 

GIF87a...,.D..;

--::287032381131322

Content-Disposition: form-data; name="datafile3"; filename="b.gif"

Content-Type: image/gif

 

GIF87a...,.D..;

--::287032381131322—

http 協議本身的原始方法不支持 multipart/form-data 請求,那這個請求自然就是由這些原始的方法演變而來的,具體如何演變且看下文:

multipart/form-data 的基礎方法是 post,也就是說是由 post 方法來組合實現的

multipart/form-data 與 post 方法的不同之處:請求頭,請求體。

multipart/form-data 的請求頭必須包含一個特殊的頭信息:Content-Type,且其值也必須規定為 multipart/form-data,同時還需要規定一個內容分割符用於分割請求體中的多個 post 內容,如文件內容和文本內容自然需要分割,不然接收方就無法正常解析和還原這個文件。具體的頭信息如:Content-Type: multipart/form-data; boundary=${bound},${bound} 代表分割符,可以任意規定,但為了避免和正常文本重複,儘量使用複雜一點的內容,如::287032381131322

multipart/form-data 的請求體也是一個字符串,不過和 post 的請求體不同的是它的構造方式,post 是簡單的 name=value 值連接,而 multipart/form-data 則是添加了分隔符等內容的構造體。

維基百科上關於 multipart 的介紹(https://en.wikipedia.org/wiki/MIME#Multipart_messages)。

multipart 的數據格式有一定的特點,首先是頭部規定了一個 ${bound},上面那個例子中的 ${bound} 為 ::287032381131322,由多個內容相同的塊組成,每個塊的格式以–加 ${bound} 開始的,然後是該部分內容的描述信息,然後一個\r\n,然後是描述信息的具體內容。如果傳送的內容是一個文件的話,那麼還會包含文件名信息,以及文件內容的類型。

小結,要發送一個 multipart/form-data 的請求,需要定義一個自己的 ${bound} ,按照格式來發請求就好,對於 multipart 的數據格式並沒有過多介紹,感覺和 chunked 很類似,不難理解。

總結

本文介紹的三種數據格式,都比較基礎,一些框架自動把它們處理,比如爬蟲。還有圖像上傳,對於 multipart/data 格式的請求頭,了解一些概念性的東西也非常有意思。共勉。

程式設計師專場相親活動報名入口:

http://form.mikecrm.com/Zx3qWu

小編微信:szweican(備註崗位)

相關焦點

  • PHP獲取HTTP POST中不同格式的數據
    源 / php中文網      源 / www.php.cnHTTP協議中的POST 方法有多中格式的數據協議,在HTTP的head中用不同的Content-type標識.常用的有application/x-www-form-urlencoded,這是最常見的,就是from表單的格式.在HTTP的head中是Content-Type: application
  • 前端基礎篇之HTTP協議
    看圖區分三種連結:如圖中(a):串行連接每次發起請求都必須建立新的tcp連接。如圖中(b):持久連接多個http請求可以復用同一個tcp連接,但是下次請求必須在上次響應返回之後進行。如圖中(c):管道化持久連接也可以復用同一個tcp連接,並且可以不用等待發出多個http請求,但是響應必須按順序返回。URIHTTP協議使用 URI 定位網際網路上的資源。
  • 物聯網應用層協議選擇和分析--MQTT、CoAP 、HTTP、XMPP、SoAP
    MQTT的傳輸格式非常精小,最小的數據包只有2個bit,且無應用消息頭。 下圖是MQTT為可靠傳遞消息的三種消息發布服務質量 從應用方向來分析,主要區別有以下幾點: 1、MQTT協議不支持帶有類型或者其它幫助Clients理解的標籤信息,也就是說所有MQTT Clients必須要知道消息格式。而CoAP協議則相反,因為CoAP內置發現支持和內容協商,這樣便能允許設備相互窺測以找到數據交換的方式。 2、MQTT是長連接而CoAP是無連接。
  • 理解HTTP協議
    ,對於技術崗位的同學們來說理解掌握HTTP協議是必須的。一、HTTP協議的演進HTTP(HyperText Transfer Protocol)協議是基於TCP的應用層協議,它不關心數據傳輸的細節,主要是用來規定客戶端和服務端的數據傳輸格式,最初是用來向客戶端傳輸HTML頁面的內容。默認埠是80。
  • 網盾極風雲BGP:HTTP網絡傳輸協議
    IP 協議的全稱是 Internet Protocol 的縮寫,它主要解決的是通信雙方尋址的問題。IP協議使用 IP 地址 來標識網際網路上的每一臺計算機,可以把 IP 地址想像成為你手機的電話號碼,你要與他人通話必須先要知道他人的手機號碼,計算機網絡中信息交換必須先要知道對方的 IP 地址。
  • 關於 HTTP2 和 HTTPS,這些你必須要知道
    在HTTP1.1中默認就使用持久化連接來解決:建立一次連接,多次請求均由這個連接完成!(如果阻塞了,還是會開新的TCP連接的)相對於持久化連接還有另外比較重要的改動:參考資料:1.1.2 HTTP2基礎在說HTTP2之前,不如先直觀比較一下HTTP2和HTTP1.1的區別:
  • 網際網路基礎知識講解:淺談http協議
    首先,我們來看一下,HTTP協議究竟是什麼東西呢?簡單的說,http協議就是一個超文本傳輸協議,該協議是用於從www(全球資訊網)伺服器傳輸超文本到本地瀏覽器用的,所以平時我們瀏覽網頁離不開這東西,該協議是基於TCP/IP通信協議來傳輸數據的,可以用來傳遞我們所需要的圖片、文件以及各方面的信息。
  • 詳解HTTP協議密切相關的幾個概念
    但是,作為前端的你,不能知道的如此泛泛。先擺出三個概念:URI,URL和URN。形象的理解就是URL就是你快遞單上你家的地址,URN就是你的手機號或者身份證。通過URL可以找到你家(唯一),通過URN可以找到你(唯一)。
  • HTTP協議之狀態碼詳解
    本文介紹HTTP協議中的HTTP狀態碼(HTTP Status Code), 會對大部分的狀態碼都進行了詳細的實例講解。要了解狀態碼,應該在實例中去理解狀態碼的意義,否則看了也會忘記的。隨著協議的發展,HTTP規範中會定義更多的狀態碼。小技巧: 假如你看到一個狀態碼518, 你並不知道具體518是什麼意思。 這時候你只要知道518是屬於(5XX,伺服器錯誤就可以了)
  • HTTP代理ip協議都有什麼特點和原理
    1.5 Cookie與Session的區別1、存取方式的不同Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進位數據,需求先進行編碼。Cookie中也不能直接存取Java對象。若要存儲略微複雜的信息,運用Cookie是比較艱難的。
  • 計算機基礎之HTTP協議
    http是網絡上最常見的協議之一,我們上網必用的協議,它是什麼,是如何工作的,今天我們就簡單梳理一下http協議的知識。HTTP協議是什麼?HTTP協議是超文本傳輸協議的縮寫,英文是Hyper Text Transfer Protocol。是從全球資訊網伺服器傳輸超文本到本地瀏覽器的傳送協議。
  • HART協議數據格式和消息結構的舉例分析
    HART協議數據格式和消息結構的舉例分析 下面我們對HART協議的數據格式以及消息結構的舉例進行了具體的講解。通過例子的分析,相信大家都能理解這部分的內容了。
  • 數據類型和Json格式
    前幾天,我才知道有一種簡化的數據交換格式,叫做yaml。我翻了一遍它的文檔,看懂的地方不多,但是有一句話令我茅塞頓開。
  • 一文徹底拿下HTTP/HTTPS協議
    URI格式協議名:HTTP協議,另外還有ftp等協議。告知訪問資源時使用什麼協議。image/png等但是帶寬一定,數據大了通常考慮使用壓縮算法進行壓縮,在HTTP中使用Encoding type表示,常用的壓縮方式有下面幾種<1>gzip:一種數據格式,默認且目前僅使用deflate算法壓縮data部分<2>deflate:deflate是一種壓縮算法,是huffman編碼的一種加強
  • ICMP協議消息的流程和格式
    我們對ICMP協議已經有了一個了解,在網絡協議中,這個協議有著至關重要的作用。那麼在系統中,是如何實現ICMP協議消息的傳輸呢?就此話題我們來細緻地分析一下。在被稱為Catenet的系統中,IP協議被用作主機到主機的數據報服務。網絡連接設備稱為網關。這些網關通過網關到網關協議(GGP)相互交換用於控制的信息。
  • 分享,HTTP協議錯誤代碼大全
    看 🌟收集了http協議所有錯誤代碼的返回值及相應報錯的原因,希望可以幫助到大家在做接口測試過程中查閱,建議收藏本文!101  (切換協議) 請求者已要求伺服器切換協議,伺服器已確認並準備切換。2xx (成功):表示成功處理了請求的狀態代碼。註:200代表請求成,但是這並不意味著,返回的數據也是正確的200  (成功)  伺服器已成功處理了請求。201  (已創建)  請求成功並且伺服器創建了新的資源。
  • RION——一種快速、緊湊、通用的數據格式
    稍後我會在本文中解釋清楚,但首先必須介紹一下RION的背景信息。用於高效數據交換和數據存儲的數據格式RION由Nanosai研發,Nanosai是一家分布式系統研發公司,持「開放標準」——這意味著歡迎所有人使用。設計RION的最初目的是用於高效數據交換。
  • USB的數據格式概述
    6、數據域(DATA):長度為0~1023位元組,在不同的傳輸類型中,數據域的長度各不相同,但必須為整數個字節的長度  7、校驗域(CRC):對令牌包和數據包(對於包的分類請看下面)中非PID域進行校驗的一種方法,CRC校驗在通訊中應用很泛,是一種很好的校驗方法,至於具體的校驗方法這裡就不多說,請查閱相關資料,只須注意CRC碼的除法是模2運算,不同於10
  • IP協議頭格式的詳細分析
    IP協議是我們學習網絡協議最開始,也是最基礎的協議。那麼今天我們主要介紹一下有關於IP協議頭格式的基本狀態。那麼就讓我們具體看以下有關於IP協議頭格式和Sniiffer Portable的IP頭的相關內容吧。
  • HTTP/2 協議給 REST API 的新增益
    一個打開這麼多連接的應用程式同時打破了TCP構建的許多假設; 由於每個連接都會在響應中啟動大量的數據,因此中間網絡中的緩衝區溢出會造成擁塞事件並重新傳輸。這是因為TCP的慢啟動機制 ,它基於已經確認了多少包來在新的連接上傳遞數據包 - 有效地限制了在前幾個往返行程中可以發送的數據包的數量。