做爲一個web開發者,天天都在使用者Http協議,卻老是隻知其一;不知其二。本文參看Http RFC7230規範,梳理了http報文部分。html
start-line: 起始行,描述請求或響應的基本信息web
*( header-field CRLF ): 頭瀏覽器
CRLF安全
[message-body]: 消息body,實際傳輸的數據服務器
起始行的格式就是 start-line = request-line(請求起始行)/(響應起始行)status-line編碼
這些格式就是規則,用來解析的3d
順序 理論上頭字段的key順序是無所謂的,可是最佳實踐是將控制字段放在前面,好比請求的時候Host,響應的Date,這樣能夠儘快發現是否須要處理。code
重複 除了Set-Cookie
這個key,其餘都不行,若是發送方發了重複的key,接收方會將它合併,值是以逗號分隔。cdn
字段限制 協議自己對每一個頭字段沒有限制,可是在工程實踐中的得出過一些實踐,沒有通用的限制,和字段具體的語義有關。總體的header大小限制沒有定義標準值,有些4K,有些8K。server端檢查到header頭超過了限制值,處於安全考慮,不會忽略掉。而是會拋出4XX錯誤。server
只有Host
字段是請求頭中必須帶的,其餘無所謂。
字段 | 請求頭 | 響應頭 | 解釋 |
---|---|---|---|
Host | 1 | 0 | 告訴服務器應該由哪一個主機處理 |
User-Agent | 1 | 0 | 標識瀏覽器類型,雖然已經被用爛了,不太可信,但有時候能夠用來自定義類型 |
Accept | 1 | 0 | 能夠接收的body類型 mime type,好比text/html |
Accept-Charset | 1 | 0 | 能夠接收的字符集 |
Accept-Encoding | 1 | 0 | 能夠接收的編碼格式 |
Accept-Language | 1 | 0 | 能夠接收的多語言 |
Content-Type | 1 | 1 | 發送的body類型mime type |
Content-Encoding | 1 | 1 | 發送的編碼 |
Content-Language | 1 | 1 | 發送的語言 |
這邊有完整的分類 developer.mozilla.org/en-US/docs/…
header是必須有要有的,可是body就不必定要用。
body就是傳輸的內容。由於Http是應用層協議,因此除了傳輸數據,還須要定義傳輸的數據格式。這些格式定義在header中指定。Content-Length
請求或者響應的body長度,必需要帶上這個字段,以便對方能夠方便的分辨出報文的邊界,也就是Body數據什麼時候結束。若是Body太大,須要邊計算邊傳輸,不到最後計算結束是沒法知道整個Body大小的,這個時候可使用chunk傳輸,經過Transfer-Encoding
指定,這兩個header key是互斥的,只能指定一個,若是指定了兩個,接收端優先處理Transfer-Encoding
字段。一般body的數據比較多時,都使用chunk來傳輸,效率比較高。沒有了length,怎麼知道數據傳輸結束了,經過一個長度爲 0的chunk,對應的分塊數據沒有內容,來表示body內容結束。
jetty 是web容器,須要解析Http Request,發送Http Response。具體幹了什麼下回分析
關注公衆號【方丈的寺院】,第一時間收到文章的更新,與方丈一塊兒開始技術修行之路
tools.ietf.org/pdf/rfc7230… developer.mozilla.org/en-US/docs/…