01-输入网址按下回车发生了什么?
1、浏览器从地址栏的输入中获得服务器的IP地址和端口号;(如果使用的是域名,会先使用域名解析功能解析出对呀的IP地址)
2、浏览器用TCP的三次握手与服务器建立连接;
3、浏览器向服务器发送拼好的报文;
4、服务器收到报文后处理请求,同样拼好报文再发给浏览器;
5、浏览器解析报文,渲染输出页面。
02-HTTP报文结构
HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:
- 起始行(start line):描述请求或响应的基本信息;
- 头部字段集合(header):使用key-value形式更详细的说明报文;
- 消息正文(entity):实际传输的数据,它不一定是文本,可以是图片、视频等二进制数据。
这其中前两部分起始行和头部字段经常又合称为“请求头”或“响应头”,消息正文又称为“实体”,但与“header”对应,很多时候就直接称为“body”。
HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个“空行”,也就是“CRLF”,十六进制的“0D0A”。
所以,一个完整的 HTTP 报文就像是下图的这个样子,注意在 header 和 body 之间有一个“空行”。
请求行
请求报文里的起始行也就是请求行,它简要的描述了客户端想要如何操作服务器端的资源:
请求行由三部分构成:
- 请求方法:是一个动词,如GET/POST,表示对资源的操作;
- 请求目标:通常是一个URI,标记了请求方法要操作的资源;
- 版本号:表示报文使用的HTTP协议版本。
状态行
响应报文里的起始行也就是状态行,意思是服务器响应的状态:
状态行也是由三部分构成:
- 版本号:表示报文使用的HTTP协议版本;
- 状态码:一个三位数,用代码的形式表示处理的结果;
- 原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
头部字段
请求行或状态行再加上头部字段集合就构成了HTTP报文里完整的请求头或响应头。
头部字段是key-value的形式,key和value之间用”:“分隔,最后用CRLF换行表示字段结束。HTTP头字段非常灵活,不仅可以使用标准里Host、Connection等已有头,也可以任意添加自定义头,这就是HTTP协议带来了无限的扩展可能。
不过使用头字段需要注意下面几点:
1、字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
2、字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正确的字段名;
3、字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
4、字段的顺序是没有意义的,可以任意排列不影响语义;
5、字段原则上不能重复,除非这个字段本身的语义允许,例如 Set-Cookie。
常用头字段
HTTP 协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:
1、通用字段:在请求头和响应头里都可以出现;
2、请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件;
3、响应字段:仅能出现在响应头里,补充说明响应报文的信息;
4、实体字段:它实际上属于通用字段,但专门描述 body 的额外信息
字段名 | 字段说明 |
---|---|
Host | 请求字段,只能出现在请求头里,且是唯一一个HTTP1.1规范里要求必须出现的字段。 |
User-Agent | 请求字段,只出现请求头里。它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。 |
Date | 通用字段,但通常出现在响应头里,表示HTTP报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略。 |
Server | 响应字段,只能出现在响应头里,她告诉客户端当前正在提供Web服务的软件名称和版本号。 |
Content-Length | 实体字段,表示报文里body的长度,也就是请求头或响应头空行后面数据的长度。 |
Q&A
Q:试着解释下浏览器在点击页面链接后发生了哪些事情?
Q:如果是一个不存在的域名,那么浏览器的工作流程会是怎么样的呢?
Q:如果拼HTTP报文的时候,在头字段后多加了一个CRLF,导致出现了一个空行,会发生什么?
Q:讲头字段时说”:“后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?
本文整理自
仅做个人学习总结所用,遵循CC 4.0 BY-SA版权协议,如有侵权请联系删除!