09 | HTTP报文是什么样子的?
该思维导图由 AI 生成,仅供参考
报文结构
- 深入了解
- 翻译
- 解释
- 总结
HTTP报文是HTTP协议的核心部分,它在规范文档里详细定义了报文的格式,规定了组成部分、解析规则和处理策略。HTTP报文的结构包括起始行、头部字段集合和消息正文。请求报文的起始行包括请求方法、请求目标和版本号,而响应报文的起始行则包括版本号、状态码和原因。头部字段以key-value形式呈现,具有灵活的扩展性,但需要遵循一定的规范。报文必须有头部,但可以没有消息正文,且在头部之后必须有一个“空行”。 HTTP报文的解析和处理主要涉及头字段的处理,理解了头字段也就理解了HTTP报文。常用头字段包括Host字段、User-Agent字段、Date字段、Server字段和Content-Length字段等。这些字段在请求和响应中扮演不同的角色,用于指示请求的处理主机、描述客户端信息、标记报文创建时间、提供服务器软件信息以及表示报文body的长度。 总之,HTTP报文结构简单明了,但其中的细节却是非常讲究的,对请求方法和请求目标的组合变化多端。了解其结构和规范对于理解HTTP协议的工作原理至关重要。在实际应用中,对头字段的理解和使用至关重要,它们可以实现各种功能,如连接管理、缓存控制等。通过学习HTTP报文的结构和常用头字段,读者可以更好地理解和处理HTTP协议,为网络通信提供更有效的支持。 在课下作业中,读者可以思考HTTP报文中头字段的使用,如多加一个空行会导致什么问题,以及为什么大多数情况下头字段后只使用一个空格。这些问题有助于加深对HTTP报文结构和头字段的理解。 通过本文的总结,读者可以快速了解HTTP报文的重要性、结构和常用头字段的作用,为进一步深入学习和应用HTTP协议奠定基础。
《透视 HTTP 协议》,新⼈⾸单¥59
全部留言(110)
- 最新
- 精选
- 奕1:如果拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么? 在header 下面第一个空行以后都会被当作body 体 2:讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢? 头部多一个空格就会多一个传输的字节,去掉无用的信息,保证传输的头部字节数尽量小
作者回复: 回答的很好。
2019-06-175150 - 壹笙☞漂泊答题: 1、头字段后多了一个CRLF,会被当做body处理 2、节省资源 总结: HTTP协议的请求报文和相应报文的结构基本相同: 1、起始行(start line):描述请求或响应的基本信息 2、头部字段集合(header):使用key-value形式更详细的说明报文 3、消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据 HTTP协议必须有header,可以没有body。而且header之后必须要有一个空行,也就是 “CRLF”,十六进制的“0D0A” 请求行(请求报文里的起始行): 描述了客户端想要如何操作服务器端的资源 起始行由三部分构成: 1、请求方法:标识对资源的操作:GET/POST/PUT 2、请求目标:通常是一个URI,标记了请求方法要操作的资源 3、版本号:标识报文使用的HTTP协议版本 以上三部分,通常使用空格分隔,最后用CRLF换行 状态行:(响应报文里的起始行): 服务器响应的状态 状态行也是由三部分构成: 1、版本号:标识报文使用的HTTP协议版本 2、状态码:三位数,用代码形式标识处理的结果,比如200是成功,500是服务器错误 3、原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因 以上三部分,通常也使用空格分隔,最后用CRLF换行 头部字段: 请求行或状态行再加上头部字段集合就构成了HTTP报文里完整的请求头或响应头。 头部字段是key-value的形式,用“:”分隔,最后用CRLF换行标识字段结束 头字段,不仅可以使用标准的Host等已有开头,也可以任意添加自定义头 注意: 1.字段名不区分大小写,例如“Host"也可以写成“host”,但首字母大写的可读性更好; 2.字段名里不允许出现空格,可以使用连字符“一”,但不能使用下划线“”。例 如,“test-name”是合法的字段名,而“test name""test_ name' 是不正确的字段名; 3.字段名后面必须紧接着“:”,不能有空格,而“:” 后的字段值前可以有多个空格; 4.字段的顺序是没有意义的,可以任意排列不影响语义; 5.字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie。 常用头字段 基本分为四类: 1.通用字段:在请求头和响应头里都可以出现; 2.请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件; 3.响应字段:仅能出现在响应头里,补充说明响应报文的信息; 4.实体字段:它实际上属于通用字段,但专门描述body的额外信息。 Host:请求字段,只能出现在请求头。是必须出现的字段 User-Agent:是请求字段,只能出现在请求头里。 Date:是通用字段,通常出现在响应头,标识HTTP报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略 Server字段是响应字段,只能出现在响应头里。告诉客户端当前正在提供Web服务的软件名称和版本号。 Content-Length:标识报文里body的长度。
作者回复: 总结的非常好,赞!
2019-06-1747 - Mèow请问Host虽然是规定必须的,但是不加的话也没问题吗?我看掘金的主页就没有host,而是用的几个私有字段 :authority: juejin.cn :method: GET :path: / :scheme: https
作者回复: Host是必须要有的字段,你贴的这几个实际上是http/2的字段(前面有冒号,全小写),而:authority就相当于http/1里的host。
2021-02-0427 - xing.org1^老师,请问为什么请求头太大会占用服务器资源呢?
作者回复: 因为服务器必须分配内存存储请求头,然后才能处理,如果头很大,比如说16k,那么几万个请求就会占用非常多的内存。 Nginx里限制头不超过4k,就是为了节约内存资源。
2019-06-19525 - 隰有荷为啥老师懂的这么多!唉,何时能学成你的一半水平,我也就满意了😂
作者回复: 学业有先后,术业有专攻,一起努力。
2019-06-2114 - 10我也遇到了前面2个同学提到的遗失对主机的连接的问题,但老师您的回答貌似没解决问题,我再确认一下,在浏览器可以顺利访问www.chrono.com的情况下: 1. Win+R打开Telnet后,输入 “open www.chrono.com 80”,点击回车,然后界面显示“正在连接open www.chrono.com 80” 2. 上一步漫长的等待后,界面显示“按任意键继续” 3. 我按了空格,界面上新增一行“遗失对主机的连接” 另外老师您说的“按Ctrl+]键,然后回车”我在上面1步和第3步都试过 每次都显示“无效指令” 请问我是哪一步出的问题呢
作者回复: 不需要等待,在显示“正在连接”的时候按按Ctrl+]键,然后回车。 “正在连接”的意思是已经连上了。 可以再搜索一下Windows上Telnet的用法。
2019-06-19410 - qzmone我也不是很理解这个host字段,比如一个网站的域名解析后的IP是负载均衡的IP,负载均衡后面对应的是web主机集群,那么这个host是什么,浏览器怎么知道虚拟主机的真实IP呢
作者回复: host字段是给Web服务器(Apache,Nginx)用的。 解析出ip后,请求到达Nginx,因为上面运行了很多的虚拟主机,比如a.com/b.com/c.com,那么应该进那个呢? 这个时候就要用到host字段了。如果host=b.com,那么Nginx就会使用b.com的配置提供服务。 你最后的问题其实是反了,浏览器解析域名得到ip地址,它不知道域名对应的是不是虚拟主机,也可能是真实主机。
2019-06-17210 - 文華使用Telnet遇到问题的同学请注意,“Escape Character is 'Ctrl+]'"这提示的意思是已经连接到了服务器,按Ctrl+]就结束连接退出了,所以看到提示时直接将HTTP请求内容贴上去,再按回车加入空行,就能得到响应了。
作者回复: 欢迎同学们互相交流学习经验。
2019-10-238 - -W.LI-支持老师原声。赞一个
作者回复: 理解万岁。
2019-06-178 - 面罩说一下老师所说的 telnet 怎么用: 1. win + r,输入 telnet,确定后就打开了 2. 在界面中输入 open www.chrono.com 80,并回车 3. 接下来会显示 “正在连接 www.chrono.com....”,就已经表示连接上了 4. 接下来先 ctrl + ],然后再 enter,即可进入黑乎乎的编辑页面 5. 在编辑页面输入老师给的请求信息(我是手敲的,我复制过去貌似直接发请求了,应该是复制的格式不对,导致失败了) 6. 输入请求信息后,连续点击两次 enter,即可发送请求
作者回复: great
2021-09-0147