开发过程中有些细节容易被忽略,今天挑几个重点聊一聊。
这篇目录
一、应用层
规定 请求/响应消息 长什么样
协议
HTTP
HTTP请求 = 请求行 + 请求头 + 请求体
1.请求行
1.1直接访问源站时:
methoud /path ?query scheme/version
请求行用path+query 告诉服务器 询问内部资源的参数
1.2代理时:
methoud URL scheme/version ↓ scheme: //目的ip :目的port /path ?query
请求行用完整URL 告诉服务器:
1. 外出要去的目标ip+端口 进行打通隧道 建立新连接
2. 要访问外面服务器的内部资源参数
1.2.1URL编码
URL编码处理字符串 怎样合法地放进URL里
1.2.1.1原因
(1)URL语法里本来就有意义的保留字符 想作为普通数据内容出现时
保留字符
: / # [ ] @ ! $ & ' ( ) * + , ; = ?路径和query的分隔符&query参数之间的分隔符=query中 键和值的分隔符/路径分段符#fragment开始符:scheme:与host:port中 有特殊意义
(2)URL的标准字符集外的 不合法或不安全的字符 不允许直接原样出现在URL中:
- 空格
- 非ASCII字符(中文)
- 换行
- 制表符
- 控制字符
- 特殊符号
1.2.1.2方式
百分号编码:
1. 按UTF-8字符编码 把字符对应数字
2. 数字用十六进制表示
3. 在数字的每个字节前加%
编码位置
位置部分方式URLpath、query、fragment百分号编码HTML文本、属性值实体转义JOSNbody反斜杠转义
2.请求头header
2.1Host
Host: host(目的IP:目的端口)
请求到达目标服务器的目标通信端点 往上的应用程序后,解密应用层的HTTP请求里的Host 区分在服务器内部要去的 目标IP+端口的站点
2.2Content-Type
Content-Type: application/json
表示请求的请求体body里的数据格式,提示接收方 如何解析body中的数据
HTML页面内容text/html浏览器解析其中的标签 转换成界面显示CSS样式文件内容text/css浏览器解析其中的选择器和属性 应用到页面的样式上JS脚本文件内容application/javascript浏览器通过JS引擎 执行js中的逻辑JSON数据application/json浏览器不做处理图片image.png 或 image.jpg浏览器按照图片的二进制格式 解析并显示
2.2.1JSON
JSON(JavaScript Object Notation)是一种文本格式的数据表示方法
能表示数据类型:
- 对象object
- 数组array
- 字符串string
- 数字number
- 布尔值true/false
- null
- 前后端传数据
- 接口返回结果
- 配置文件
- 持久化结构化信息
2.3Content-Length
Content-Length: 35
2.4User-Agent
用户用设备的 浏览器和操作系统信息
2.5Refer
当前页面的 跳转来源页的URL
2.6Cookie
2.6.1受控的JS
浏览器里的JS 在安全沙箱下 受控地访问本地硬盘:
1. 读取 用户手动选择的文件
2. 下载文件
3. 存储数据到 浏览器本地代存的站点
2.6.2站点
浏览器提供站点 代存数据在本地
2.6.2.1Cookie数据
Cookie是浏览器代网站 保存在本地站点的键值对数据,响应里发来保存 并在后续请求中自动带回去
2.6.2.1.1格式
Cookie的格式 由浏览器遵守标准 规定的
2.6.2.1.2内容
Cookie的内容 是网站自定义的
2.6.2.1.3创建
1. 服务器在响应头 通过Set-Cookie设置
2. 前端JS通过document.cookie设置
2.6.2.1.4位置
1. 传输时 Cookie在消息的header里
2. 存储时 Cookie在浏览器本地的站点里
2.6.2.1.5过期
服务器指定Cookie的过期时间到后,浏览器会把它视为过期 删除或不再发送
2.6.3登录
Cookie/Session 规定登录状态 怎么保存和识别
客户端
1.用户提交用户名和密码
服务器
2.验证通过
3.创建一个session会话
4.生成一个随机的sessionId
5.把sessionId->session保存在服务器端
6.把sessionId 通过Set-Cookie发给浏览器
7.浏览器站点代存Cookie 后续请求自动带回sessionId
8.服务器查询sessionId 使用对应存储的session数据
3.空行
表示头收尾
4.请求体body
{"username" : "alice" , "password" : "123"}
位置数据
请求行、请求头字符文本请求体字符文本、二进制字节流再往下TCP、IP头协议字段
HTML/CSS/JS/JSON/图片 是内容格式,作为主要载荷时 通常放在请求体body里;也可作为普通字符串 出现在别处:
- query里可放JSON字符串
- header里可放文本片段
- HTML响应body里可嵌CSS、JS
消息边界
1.应用层
应用层HTTP协议有规定消息边界:
1. HTTP消息 header的收尾边界是一个空行
2. HTTP消息的body 用Content-Length判断收尾
2.传输层
传输层TCP是字节流 没有规定消息边界:
1. 一个HTTP请求可以被拆解到多个TCP包 发送
2. 多个HTTP请求可以被合并到较少的TCP包里 发送
二、安全层
规定HTTP消息 怎样加密传输
协议TLS/SSL
把HTTP消息整体加密
1.传输加密
数据在一条TLS连接的两端之间路线上传输时 受保护加密;到达连接终止的端点上后 就能解密看到HTTP明文
代理时:
1. 浏览器信任抓包代理安装的根证书 主动授权代理工具成可信TLS端点
2. 浏览器和代理建立TLS连接 往这段加密传输HTTP消息
3. 消息到达代理TLS端点后 能解密HTTP明文
4. 中间代理再建立TLS连接 把消息往剩段重新加密发给真正服务器
三、传输层+网络层
规定数据包 怎么从这台机器送到那台机器
传输层网络层协议
TCP/UDP
IP通信标识源端口、目的端口源IP、目的IP
1.目的IP+目的端口
网络层IP头的目的IP和传输层TCP/UDP头的目的端口 在互联网里找路 把包送到目标服务器的目标通信端点
2.IP管多端口
一台服务器一个IP里 可以托管很多网站的端口
## 四、链路层
协议以太网/Wi-Fi通信标识这一跳的MAC地址
暂时整理到这里。以上都是个人理解,可能有疏漏,欢迎指正。
评论 (0)
暂无评论