2023年9月3日 星期日

[Protocol] HTTP header

  • Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」,用来改变报文格式,它不但不会减少实体内容传输大小,甚至还会使传输变大。
    • 使用分塊傳輸編碼(Transfer-Encoding),數據分解成一系列數據塊,並以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。
    • 在消息頭中指定 Transfer-Encoding: chunked 就表示整個response將使用分塊傳輸編碼來傳輸內容,一個完整的消息體由n個塊組成,並以最後一個大小為0的塊為結束。每個非空的塊包括兩部分,分別為:塊的長度(用十六進制表示)後面跟一個CRLF (回車及換行),長度並不包括結尾的回車換行符。第二部分就是數據本身,同樣以CRLF (回車及換行)結束。最後一塊是單行,只由塊大小(0)以及CRLF組成,不包含任何數據。
  • Content-Encoding(内容编码)通常用于对实体内容进行压缩编码,目的是优化传输,例如用 gzip 压缩文本文件,能大幅减小体积。内容编码通常是选择性的,例如 jpg / png 这类文件一般不开启,因为图片格式已经是高度压缩过的,再压一遍没什么效果不说还浪费 CPU。

  • Persistent Connection(持久连接,通俗说法长连接)。HTTP 运行在 TCP 连接之上,自然也有着跟 TCP 一样的三次握手、慢启动等特性,为了尽可能的提高 HTTP 性能,使用持久连接就显得尤为重要。

    • HTTP/1.0 的持久连接机制是后来才引入的,通过 Connection: keep-alive 这个头部来实现,服务端和客户端都可以使用它告诉对方在发送完数据之后不需要断开 TCP 连接,以备后用。
    • HTTP/1.1 则规定所有连接都必须是持久的,除非显式地在头部加上 Connection: close。所以实际上,HTTP/1.1 中 Connection 这个头部字段已经没有 keep-alive 这个取值了,但由于历史原因,很多 Web Server 和浏览器,还是保留着给 HTTP/1.1 长连接发送 Connection: keep-alive 的习惯。
    • 浏览器重用已经打开的空闲持久连接,可以避开缓慢的三次握手,还可以避免遇上 TCP 慢启动的拥塞适应阶段。

HTTP 抓包神器 fiddler

沒有留言:

張貼留言