详解http报文

摘要

做为一个web开发者,天天都在使用者Http协议,却老是只知其一;不知其二。本文参看Http RFC7230规范,梳理了http报文部分。html

http 报文构成

start-line: 起始行,描述请求或响应的基本信息web

*( header-field CRLF ): 头浏览器

CRLF安全

[message-body]: 消息body,实际传输的数据服务器

header

起始行

起始行的格式就是 start-line = request-line(请求起始行)/(响应起始行)status-line编码

在这里插入图片描述

header头
在这里插入图片描述

这些格式就是规则,用来解析的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/…

body

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 干了什么

jetty 是web容器,须要解析Http Request,发送Http Response。具体干了什么下回分析

关注公众号【方丈的寺院】,第一时间收到文章的更新,与方丈一块儿开始技术修行之路

在这里插入图片描述

参考

tools.ietf.org/pdf/rfc7230… developer.mozilla.org/en-US/docs/…

相关文章
相关标签/搜索