用形象的比喻网络,分层模型是一栋大楼,URL 是门牌号,而应用协议则是你行进中的各种规则。
客户端、服务器都是应用程序
发出消息的一方称之为客户端 Client,发出消息的过程称之为请求 Request。
回复消息的一方称之为服务器 Server,回复消息的过程称之为响应 Response。
一次完整的交互,总是从请求开始,响应结束。
客户端和服务器的这种交互模式称之为经典C/S结构,若客户端是浏览器,则称之为B/S结构。
分层模型
网络通信是一个复杂问题,可利用分层的思想简单化。
例如网购的流程,从商家包装发货、卡车运输、快递站分拣、快递员配送、到顾客签收。商品层层传递,每层相对独立只解决自己的问题,仅需把自己的结果交给下层即可。
分层模型有四层、五层、七层不同模型,这里我们只讨论五层网络模型,且前端主要学习的是应用层。
而一次完整的网络通信,其数据基本上是经过:
- 服务器封装:应用层->传输层->网络层->数据链路层->物理层->>
- 客户端解封装:->>物理层->数据链路层->网络层->传输层->应用层
URL
URL(uniform resource locator,统一资源定位符)用于定位互联网中某个资源的位置。
例如网购时顾客填写的自家门牌号地址。
URL 是一个格式固定的字符串,不能出现非 ASCII 字符(允许英文、数字、基本的标点符号)。
它简要表达了:通过 https 的通信协议,在网络中从 juejin 主机中的 443 端口对应的程序中寻找 news 相关服务,并注明了服务的具体细节 id 参数。最后规定浏览器用哈希值 main 作为锚点定位页面显示内容。
应用协议
这是网络应用层的一种协议规范,而浏览器就是个网络应用。
一、http 协议
- http 是基于请求-响应完成通信的,相互独立,这种模式称之为
无状态协议。 - http 协议默认端口是 80,支持 ip 地址。
- https 协议默认端口是 443,不支持 ip 地址。增加了安全性。
- 每次请求-响应传递的都是字符串,而且文本格式必须按照 http 协议规定的格式书写,即报文格式。
二、报文格式 - 请求
报文格式中由客户端向服务器发送数据的格式,叫请求消息格式,有以下三部分组成:
- 请求行:高度概括了客户端想要干什么
- 请求头:描述了请求的额外信息
- 请求体:给服务器发送的正文数据,可省略
请求行
请求行是整个 http 报文的第一行字符串,它包含了【请求方法 路径+参数+hash 协议/版本】。
在 http 协议中,并没有规定只能用什么请求方法做什么事,但实际应用中约定俗成,而浏览器也遵循了此规范:
- 请求方法:GET(获取资源)、POST(提交消息)、PUT(修改数据)、DELETE(删除数据)。
其中 GET 和 DELETE 不能有请求体,传递的数据只能放到 URL 的参数中。
事实上,浏览器自动发出的请求基本都是 GET 请求,比如在地址栏输入地址并按下回车获取页面、点击了某个 a 元素、获取图片音视频、获取 css/js/字体等文件。
而 POST 请求需要开发者手动处理。
详见用户代理《浏览器组成部分、用户代理、AJAX》
请求头
请求头是一系列键值对,大多是和具体业务无关的信息。且浏览器会自动附带某些服务器不需要的请求头。
重点关注:
- Host:URL 中的主机。
- User-Agent:客户端的信息描述。
- Content-Type:请求体的
消息格式,若无请求体则此字段无意义。
消息格式 Content-Type 常用值:(即 MIME 类型)
| 类型 | 值 | 浏览器行为 |
|---|---|---|
| 文本类型 | text/plain | 普通纯文本,将响应体原封不动显示到页面上 |
| 文本类型 | text/html | html 文档,将响应体作为页面进行渲染 |
| 文本类型 | text/css | css 代码,将其视为样式 |
| 应用类型 | application/javascript | js 代码,使用 JS 引擎解析执行 |
| 应用类型 | application/json | json 数据 |
| 应用类型 | multipart/form-data | 附件,通常触发下载功能 |
| 图片类型 | image/png | png 图像,将其视为图片 |
| 视频类型 | video/mp4 | mp4 文件,将其视为视频 |
| 音频类型 | audio/mpeg | mp3 文件,将其视为音频 |
| 其他类型 | application/font-woff | woff 文件,将其视为字体 |
| 更多请参考《IANA 官方 MIME 类型列表》 |
请求体
请求体是包含具体业务数据的字符串。理论上可以是任意格式的字符串,但约定俗成,传递的是指定消息格式 Content-Type。
三、报文格式 - 响应
报文格式中由服务器接收到请求后,向客户端发送数据的格式,叫响应消息格式,也有以下三部分组成:
- 响应行:高度概括了服务器想要干什么
- 响应头:描述了响应的额外信息
- 响应体:向客户端发送的正文数据
响应行
响应行是整个响应的第一行字符串,它包含了【协议/版本 状态码 状态消息】。
通常状态码和状态消息是一一对应的,如 200 对应的就是 OK,具体由后端程序决定,共分为5类:
响应头
和请求头一样,响应头也是由很多个键值对组成的,具体有哪些键值对,完全取决于服务器程序。
重点关注 Content-Type,表示响应体的数据类型。
在 B/S 模式中,浏览器会自动根据响应头中Content-Type的取值,决定如何处理响应体,所以用户在浏览器视口内看到的内容被渲染成什么数据类型的样子,都是由此值决定的。
响应体
向客户端发送的正文数据,即响应的主体内容。