1.TCP/IP
- 7层协议
1. 一个数据的传输过程类似于 7654321(机器A) 123->21(路由器1) 123->21(路由器2) 12->21(交换机1) 12->21(交换机2) 123->21(路由器3) 1234567(机器B)
2. ARP 属于2.5连接层 IP→MAC 根据IP地址查询当前链路/局域网中的MAC地址| 层级 | 层级名称 | 核心标识/地址 | 典型设备/协议 | 主要作用 |
|---|---|---|---|---|
| 765 | 会/表/应 | 应用程序数据 | HTTP、DNS(域名解析)、FTP(文件传输) 等 | 处理数据的业务逻辑 |
| 4 | 传输层 | Port 端口号 | TCP / UDP | 负责从A机器的端口到B机器的端口 |
| 3 | 网络层 | IP 地址 | 路由器、三层交换机 | 通过IP地址+路由表决定数据包的下一跳(每经过1次第3层转发记为1跳hop)(最大255跳) |
| 2 | 数据链路层 | MAC 地址 | 交换机、网卡 | 通过MAC地址完成当前局域网/链路上的一跳传输 (交换机把多个路由器组成了一个局域网) |
| 1 | 物理层 | 比特流 (Bit) | 网线、集线器 | 传输光/电信号 |
- url属于uri(资源定位标识符) 包括的内容:协议名(http/ftp/..)/[登录信息]/服务器ip+端口/带层次的路径/标识符
2.HTTP
- 一问一答的模式,服务器没收到请求之前不会主动发送响应
- 请求包括:方法(get/post/..) uri 协议版本 请求首部字段 内容实体
回包包括:协议版本 状态码 状态码的原因 响应首部字段 主体 - 属于无状态协议
- cookie:为了保存状态引入的技术。比如用户登录一家购物网站,在购物网站的其他页面也要保持登录状态
防cookie被盗
http.SetCookie(w, &http.Cookie{ Name: "session_id", Value: "abc123", //顺带加上 跨域问题:A网站的JS能不能读取B源(非同源)的响应 同源:协议/域名/端口 都相同 HttpOnly: true, //F12无法通过命令document.cookie读取cookie 防止当前网站JS直接读取 Secure: true, //cookie只通过https发送 防止传输过程中被窃取 SameSite: http.SameSiteLaxMode, //防止CSRF:限制浏览器向另外一个网站请求时携带这个网站的Cookie Expires: time.Now().Add(time.Duration(5*60) * time.Second) //过期时间5min MaxAge: 5*60, //过期时间5min 有2个过期设置是为了兼容浏览器的新旧版本 Path: "/", })Cookie/Session ID 被盗以后,如何尽量降低风险
有效期给redis的session设置过期时间
用户重新登录以后换一个新的Session
用户退出注销Session
异常登录检测 比如ip变了 设备变了 异常请求频率 综合判断是否需要重新登录验证
在进行敏感操作时 需要重新登录验证jwt+cookie 服务器不存储用户数据的状态(相对于4不用redis)
如果token被盗就只能依赖于旧的token过期,或者服务器牺牲部分无状态属性:记录token的版本号
JWT(客户端请求携带数据)
│
├── Header
│ {"alg":"HS256","typ":"JWT"} //签名算法(HS256对称密钥 RS256非对称密钥)
│
├── Payload
│ {"user_id":10001,"role":"user","exp":...} //用户信息(uid 权限 过期时间..)
│
└── Signature
用密钥对 Header+Payload 进行签名 //用于校验前面两个信息是否被篡改 (以上数据都可以被第三方拿到)- 方法
| 方法 | 典型用途 | 请求数据 |
|---|---|---|
| OPTIONS | 询问服务器/某个URL支持的方法 | 通常无body |
| TRACE | 回显请求,有风险所以基本没人用 | 通常无body |
| GET | 获取资源 | 通常放 URL/query |
| HEAD | 获取报文首部,用于检测资源是否存在/大小/是否更新 | 通常无body |
| POST | 提交数据、创建/触发处理 | 通常放 body |
| PUT | 完整替换资源 | 通常放 body |
| PATCH | 部分更新资源 | 通常放 body |
| DELETE | 删除资源 | 通常无body |
- 持久连接:http1.0之前每次请求都包括建立和断开tcp连接; http1.1之后单次请求后不再断开连接,只有在客户端/服务器有明确的断开指令,连接才会断开
(http1.0之前,每次请求只是tcp连接断开,但是cli和svr的进程还在跑。所以客户端可以通过php脚本获取到gateway在redis的状态,进而确认tcp连接哪个gateway)
管线化:上一个请求还没有收到回包就发下一个请求
3.HTTP报文
- 是否编码压缩 否:报文=实体 是:报文≠实体
- 回包错误码
| 错误码 | 类别 | 原因短语 | 常用 |
|---|---|---|---|
| 1XX | Informational(信息性) | 接收的请求正在处理 | |
| 2XX | Success(成功) | 请求正常处理完毕 | 200:ok 204:ok但没有返回实体内容 206:响应cli进行了的范围请求 |
| 3XX | Redirection (重定向) | 需要请求新的uri | 301:资源永久性重定向 302:资源临时重定向 303:限定用GET方法请求新资源 307:须保持POST/PUT等方法请求新资源 304:缓存数据没有变化用浏览器缓存 |
| 4XX | Client Error(客户端错误) | 服务器无法处理请求 | 400:报文有语法错误 401:访问资源需要认证 403:没有权限 404:没有该资源 或者拒绝请求且不想说明原因 429:请求频率限制 |
| 5XX | Server Error(服务器错误) | 服务器处理请求出错 | 500:服务器执行请求时发生错误 503:服务器超负荷或者在维护 |
首部分类
按是否跨代理传递首部分为: End-to-end(一直传递到最终接收者) Hop-by-hop(只对当前这一跳有效)
按报文角色/用途分为:通用、请求、响应、实体/内容首部字段
| 通用首部 | 含义 | 示例 |
|---|---|---|
| Cache-Control | 控制缓存:1.是否缓存 2.TTL 3.过期后如何处理 4.客户端对缓存的要求(从哪获取,剩余过期时间) | no-store:不能缓存 max-age:缓存过期时间 no-cache:可缓存使用前须验证 |
| Connection | 1.控制Hop-by-hop首部 2.管理当前TCP连接 | 1.标识发给下一代理时需要删掉的字段 2.Keep-Alive:保存连接 close:关闭连接 |
| Content-Type | 请求/响应正文的媒体类型 | application/json(大类:给程序处理的数据/小类:json) |
| 请求首部 | 含义 | 示例 |
|---|---|---|
| Accept | 客户端希望接收什么媒体类型 | application/json image/png video/mp4 q=0.3(优选权重) |
| Accept-Encoding | 客户端支持什么压缩格式 | gzip、br |
| Accept-Language | 客户端偏好的语言 | |
| Host | 请求哪个域名/虚拟主机 | |
| Referer | 当前uri请求从哪个web页面发起的 | |
| Cookie | 身份认证:浏览器自动携带 | 常用于登录 |
| Authorization | 身份认证:客户端手动携带 | 天然防止CSRF;常用于API |
| User-Agent | 客户端/浏览器/程序的信息 | |
| If-None-Match | 配合ETag做缓存验证 | If开头的为条件请求,服务器只有判断条件为真的时候才会执行请求 |
| If-Modified-Since | 配合Last-Modified做缓存验证 | |
| Range | 请求资源的一部分 | 适合场景:断点续传 返回码200:返回全部资源 206:返回部分资源 |
| 响应首部 | 含义 | 示例 |
|---|---|---|
| Accept-Ranges | 告诉客户端是否支持范围请求 | bytes:支持 none:不支持 |
| Age | 资源在代理缓存中存在的时间(s) | |
| ETag | 资源的唯一标识/版本标识 | 比如同一个uri资源 用于区分不同语言的版本 |
| Location | 告诉客户端应该重定向到哪个uri | 3xx 常见 |
| Proxy-Authenticate | 代理要求客户端进行身份认证 | 代理认证 |
| Retry-After | 告诉客户端多久后/什么时候再重试 | 503、429 等常见 |
| Server | 服务器软件信息 | 如 nginx、Apache |
| Vary | 告诉缓存:响应取决于哪些请求首部 | 缓存管理 todo: |
| WWW-Authenticate | 告诉客户端服务器要求什么认证方式 | 401 常见 |
| Set-Cookie | 服务器让客户端设置 Cookie |
| 实体首部 | 含义 | 重点 |
|---|---|---|
| Allow | 当前uri支持哪些HTTP方法 | GET、POST、HEAD |
| Content-Encoding | 正文使用的压缩格式 | gzip、br |
| Content-Language | 正文使用的自然语言 | zh-CN、en |
| Content-Length | 正文长度,单位字节 | body 大小 |
| Content-Range | 当前正文对应的字节范围 | 断点续传 |
| Expires | 响应内容的过期时间 | 缓存 |
| Last-Modified | 资源最后修改时间 | 缓存 |
4.web服务器
- 可以多个域名指向同一个ip+prot 然后通过nginx或者web服务器自己做分拣
www.a.com → 127.0.0.1:80 www.b.com → 127.0.0.1:80 www.c.com → 127.0.0.1:80 - web服务器的分类 代理:可以缓存、过滤、转发; 网关:可以把HTTP请求转换成其他协议后交给别的服务处理;
–140
文档更新时间: 2026-10-23 11:31 作者:morninglu
