http-04-http报文是什么样子

news/2024/5/18 15:13:59 标签: http, udp, tcp/ip
http://www.w3.org/2000/svg" style="display: none;">

HTTP 协议也是与 TCP/UDP 类似,同样也需要在实际传输的数据前附加一些头数据,不过与 TCP/UDP 不同的是,它是一个“纯文本”的协议,所以头数据都是 ASCII 码的文本,可以很容易地用肉眼阅读,不用借助程序解析也能够看懂。

HTTP 协议的请求报文和响应报文的结构基本相同,由三大部分组成:
1.起始行(start line):描述请求或响应的基本信息;
2.头部字段集合(header):使用 key-value 形式更详细地说明报文;
3.消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

这其中前两部分起始行和头部字段经常又合称为“请求头”或“响应头”,消息正文又称为“实体”,但与“header”对应,很多时候就直接称为“body”。

HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”,也就是“CRLF”,十六进制的“0D0A”。所以,一个完整的 HTTP 报文就像是下图的这个样子,注意在 header 和 body 之间有一个“空行”。

https://img-blog.csdnimg.cn/926fbc7ef3e2494d8a76cc7c1040e706.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y-R5aaC6ZuqLXR5,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />
例如:
https://img-blog.csdnimg.cn/ecf17e91b5c245989e10f4a28af3b262.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Y-R5aaC6ZuqLXR5,size_18,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述" />
在这个浏览器发出的请求报文里,第一行“GET / HTTP/1.1”就是请求行,而后面的“Host”“Connection”等等都属于 header,报文的最后是一个空白行结束,没有 body。

请求行
请求行由三部分构成:
1.请求方法:是一个动词,如 GET/POST,表示对资源的操作;
2.请求目标:通常是一个 URI,标记了请求方法要操作的资源;
3.版本号:表示报文使用的 HTTP 协议版本。
https://img-blog.csdnimg.cn/04a5f8eefa4b4413ae6dd836ed99b829.png" alt="在这里插入图片描述" />

如:
GET / HTTP/1.1
在这个请求行里,“GET”是请求方法,“/”是请求目标,“HTTP/1.1”是版本号

状态行

看完了请求行,我们再看响应报文里的起始行,在这里它不叫“响应行”,而是叫“状态行”(status line),意思是服务器响应的状态。比起请求行来说,状态行要简单一些,同样也是由三部分构成:
1.版本号:表示报文使用的 HTTP 协议版本;
2.状态码:一个三位数,用代码的形式表示处理的结果,比如 200 是成功,500 是服务器错误;
3.原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
https://img-blog.csdnimg.cn/84053d24bc7441bda92dcd319e43ffaf.png" alt="在这里插入图片描述" />
例如:
HTTP/1.1 200 OK
意思就是:“浏览器你好,我已经处理完了你的请求,这个报文使用的协议版本号是 1.1,状态码是 200,一切 OK。”

头部字段

请求行或状态行再加上头部字段集合就构成了 HTTP 报文里完整的请求头或响应头

不过使用头字段需要注意下面几点:
1.字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
2.字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正确的字段名;
3.字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
4.字段的顺序是没有意义的,可以任意排列不影响语义;
5.字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。

常用头字段
HTTP 协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:
1.通用字段:在请求头和响应头里都可以出现;
2.请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件;
3.响应字段:仅能出现在响应头里,补充说明响应报文的信息;
4.实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。

首先要说的是 Host 字段,它属于请求字段,只能出现在请求头里,它同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段,也就是说,如果请求头里没有 Host,那这就是一个错误的报文。

User-Agent 是请求字段,只出现在请求头里。它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。

不过有的比较“诚实”的爬虫会在 User-Agent 里用“spider”标明自己是爬虫,所以可以利用这个字段实现简单的反爬虫策略。

实体字段里要说的一个是 Content-Length,它表示报文里 body 的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么 body 就是不定长的,需要使用 chunked 方式分段传输。小结


http://www.niftyadmin.cn/n/1426930.html

相关文章

Unknown column ‘gender‘ in ‘field list‘

解决Unknown column ‘gender’ in ‘field list’ 一般遇见这种类似问题,首先先检查字段名是否写错,然后检查类型有没有写错,再检查sql语句有没有错。经过检查发现,我的表名写错了,修改表名即可。

http-05-如何理解请求方法

请求方法”。它的实际含义就是客户端发出了一个“动作指令”,要求服务器端对 URI 定位的资源执行这个动作。 目前 HTTP/1.1 规定了八种方法,单词都必须是大写的形式 这些动作操作的目标不是本地资源,而是远程服务器上的资源,所以…

源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示

解决源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示 原因是路径错误,如下所示: response.sendRedirect("/student/list?grade_id"student.getGrade_id());改成下面所示即可: response.sendRedirect(request.getContextPath()"/studen…

leetcode递归与回溯

递归 算法思想 要懂得如何将一个问题的规模变小再利用从小规模问题只的结果结合当前的值或者情况,的出最终的结果 ​ 通俗理解 把要实现的递归函数,看成已经实现好的,直接利用解决一些子问题思考:如何根据子问题的解以及当前面对…

htttp-06-网址解析

URI URI 本质上是一个字符串,这个字符串的作用是唯一地标记资源的位置或者名字。 URI 的基本组成URI 第一个组成部分叫 scheme,翻译成中文叫“方案名”或者“协议名”,表示资源应该使用哪种协议来访问。 在 scheme 之后,必须是三…

深度优先搜索算法与广度优先搜索算法

(BFS) DFS(深度优先算法) 题目 DFS的递归实现 利用递归去实现DFS可以让代码看上去很简洁递归的时候需要将当前的程序中的变量以及状态压入到系统的栈里面压入和弹出栈都需要较多的时间,如果需要压入很深的栈,会造成效率低下 DFS非递归实现 栈…

http-07-状态码

状态行如下 状态码 1:提示信息,表示目前是协议处理的中间状态,还需要后续的操作; 2:成功,报文已经收到并被正确处理; 3:重定向,资源位置发生变动,需要客户端…

http-08-http的实体数据

数据类型与编码 在 TCP/IP 协议栈里,传输数据基本上都是“headerbody”的格式。但 TCP、UDP 因为是传输层的协议,它们不会关心 body 数据是什么,只要把数据发送到对方就算是完成了任务。 假如 HTTP 没有告知数据类型的功能,服务…