摘要
介绍
规律 学习每一个知识点都离不开实践,对于网络学习来说,抓包是必不可少的,如TCP三次握手、HTTP报文、ICMP报文抓包等;学习Nginx、Redis源码需要实践调试和写测试代码验证单元功能
问题 如何解析HTTP报文?
一串二进制数据转成文本之后,会通过\r\n来解析,那么报文体中含有\r\n怎么处理
HTTP报文连续传输过来,如何区分上一报文和当前报文头——请求头中的Content-Length?好像请求可以不用Content-Length?
一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据
- 一种基于文本的传输协议,它位于 OSI 网络模型中的应用层
- 通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC 2616 拆分成立六个单独的协议说明(RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235)
特性
报文都是以明文的方式进行传输,不做任何加密,被中间人进行攻击
报文格式
规律 报文首部都是为了给整个业务服务的,不需要去强行记忆
规律 随着时间而在不断改进优化,所以其中的字段都不是固定的,都是与功能特性相挂钩的
思路:http是为了获取或上传资源,需要资源地址即目录path-目录
- http有版本区别:http1.0 http1.1 http2
- 指明资源的请求方式:get、post
- http报文是文本协议,需要特定字符”换行符\r\n”进行切分
- http头部key-value,则指明一些属性
- 区分头部和body是换行符
思考🤔 如何区分连续不同的HTTP报文
??每行解析,若格式跟请求行相符则为新的HTTP报文————缺陷:假设body里就含有请求行格式数据呢??
请求报文
请求行(request line)、请求头部(header)、空行和请求数据
状态行、响应头部、空行和响应数据
- 首部
请求方法
| 类型 | 功能 | 支持版本 | | —- | —- | —- | | GET | 请求获取资源 | | | POST | 上传资源(常用提交表单) | | | HEAD | 请求获取标识的资源的响应消息报头 | | | PUT | 请求服务器存储资源 | | | DELETE | 请求服务器删除资源 | | | TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 | | | CONNECT | 保留 | | | OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 | |
GET🆚POST
场景 | GET | POST |
---|---|---|
浏览器回退时 | 无影响 | 重新提交 |
浏览器缓存 | 主动缓存 | 手动设置 |
URL可被收藏 | 是 | 否 |
编码方式 | URL编码 | 多种编码方式 |
是否保存历史记录 | 是 | 否(参数不保留) |
请求参数位置 | URL | 包体 |
请求参数长度 | 有,即URL长度被浏览器/服务器限制 | 无 |
参数数据类型 | 只接受ASCII字符 | 无 |
安全性 | 参数暴露在URL上 | 相对GET安全,但HTTP是明文依旧不安全 |
版本历史
版本线 | 特点 | 问题 |
---|---|---|
HTTP/1.0 | 1.无连接即短连接,一请求一响应;2.无状态;3.简单快速 | |
HTTP/1.1 | 1.默认长连接;2.管线化;3.断点续传 | |
HTTP/2 | 1.二进制格式而非文本格式;2.完全多路复用而非有序却阻塞;3.报头压缩;4.支持服务器主动推送 | |
HTTP/3 | 1.增加头部缓存; |
响应码
分类 | 描述 | 常见类型 |
---|---|---|
1XX | 请求未完成 | |
2XX | 请求成功 | 200、204、206 |
3XX | 重定向 | 301、302 |
4XX | 客户端错误 | 400、403、404 |
5XX | 服务端错误 | 500、503 |
常见类型
返回码 | 描述 |
---|---|
200 | 请求成功 |
301 | 永久重定向 |
302 | 临时重定向 |
400 | 请求报文语法有误,服务器无法识别(通用,可自定义错误描述) |
403 | 请求的对应资源禁止被访问 |
404 | 服务器无法找到对应资源 |
500 | 服务器内部错误(通用,可自定义错误描述) |
503 | 服务器正忙 |
首部字段
分类 | 常见类型 |
---|---|
请求首部字段 | |
响应首部字段 | |
通用首部字段 |
- Content-Length如果存在且生效, 必须是正确的, 否则会发生异常.(大于实际值会超时, 小于实际值会截断并可能导致后续的数据解析混乱)
- Transfer-Encoding: chunked存在会屏蔽Content-Length
常用字段
| 首部字段 | | | | —- | —- | —- | | Accept-Content | | | | Content-Type | | | | Content-Length | | | | Connection | | | | Connection | | |
HTTPS
Wireshark抓包
报文格式
请求地址
URL
统一资源定位符,是一种资源位置的抽象唯一识别方法
组成:<协议>://<主机>:<端口>/<路径>(端口和路径有时可以省略,HTTP默认端口号是80)
URI
统一资源标识符
协议版本
格式:HTTP/主版本号.次版本号,如HTTP/1.0、HTTP/1.1
版本的发展历史
为什么是HTTP/2而不是HTTP/2.0
因为不再发展HTTP/2后版本,直接开始HTTP/3.0
发展历程图示
HTTPS从哪位置开始的?
http1.0、http1.1都支持实现为HTTPS,https与版本无明显关系
思路 分析HTTP报文的可能问题,每个版本的改进就是为了解决其中的问题
HTTP/1.0 —— HTTP/1.1
改进
- 支持长连接即在一个TCP连接中可以多次发送HTTP请求,不再是一对一的请求-应答模式——减少性能开销
- 支持管道pipeline传输,不用必须等收到上一响应报文后再发送,但仍需按请求报文的顺序接收响应报文,即发送ABC报文后必须按序接收ABC而不能BAC——对头阻塞——减少响应时间
- 缺陷:对头阻塞——底层原因是什么?
瓶颈
- 只压缩body,未压缩头部——首部信息越多延迟越大
- 请求首部冗余——好多请求的首部是相同的
- 服务器按请求顺序响应——对头阻塞
- 无请求优先级控制 疑问
- 服务器只能被动响应
HTTP/1.1 —— HTTP/2
http/2基于HTTPS
todo
- 头部压缩——HPACK算法,提升速度
- 二进制帧(头信息帧+数据帧)——增加数据传输效率
- 数据流——唯一编号标记(客户端奇数、服务端偶数)、优先级
- 多路复用——并发请求或响应,解决对头阻塞,降低延迟、提高连接利用率
- 服务器推送(Cache Push)——主动发送,提前主动发送CSS、JS等静态文件,减少延迟等待——
HPACK算法
客户端和服务器同时维护一张头信息表,将所有字段存入该表,生成索引号,并用索引号来代替key-value
HTTP/2 —— HTTP/3.0
todo
- 增加头部缓存
请求头部
由“名/值”对组成,每行一对,名和值之间使用冒号分隔
是否有哪些字段是必需要填的?哪些字段仅出现请求,哪些字段仅出现在响应
字段都是和具体功能挂钩的。不用孤立记忆
字段的值若是与实际不符会出现什么样的后果,如Content-Length
Content-Type
Content-Length: 服务器必填,客户端选填
Connection: “Keep-Alive” // client长连接
Connection: “close” // 实际在于server是否同意
状态行
组成:协议版本,状态码,状态码描述
状态码
3位数字以及常见状态码
1xx:指示信息–表示请求已接收,继续处理。 基本看不到
2xx:成功–表示请求已被成功接收、理解、接受。 200 201 203
3xx:重定向–要完成请求必须进行更进一步的操作。 301 永久和临时302
4xx:客户端错误–请求有语法错误或请求无法实现。 400 通用 404找不到资源
5xx:服务器端错误–服务器未能实现合法的请求。 500 通用 501
HTTPS
处于HTTP哪些版本
HTTP与HTTPS的区别
- 端口号:HTTP:80;HTTPS:443
- 传输数据:HTTP明文,HTTPS密文
背景
规律 为了解决某个问题(增加或优化)
解决HTTP不安全问题:
- 数据透明————加密
- 数据篡改————摘要算法
- 冒充————数字证书
方案
在TCP与HTTP层之间加了SSL/TLS协议
数字证书、数字签名
#思考 以下是方案,具体实施也是可以继续优化的。如非对称加密算法从RSA变?
混合加密
- 通信建立前,采用
非对称加密
交换会话密钥 —— 使用两密钥,公钥公开,私钥保密,但运算速度慢 - 通信过程中,采用
对称加密
加密明文 —— 使用一个密钥,运算速度快,但无法保证安全交换
- 通信建立前,采用
摘要算法
- 客户端通过摘要算法算出明文的指纹,并将指纹和明文一同加密后发送
- 服务端解密后,通过相同摘要算法算出明文的指纹,并与接收的指纹比对
- 相同则数据完整,未被篡改
数字证书——保证公钥的公正性(正确可信)
借助第三方权威机构CA(数字证书认证机构),相当于中国人民银行查征信。 将服务器公钥存在数字证书(CA颁发)中——相当于CA做担保。只要证书可信则公钥可信
数字证书的创建过程
命令解析
SSL/TLS协议建立过程
TCP的三次握手,再 TLS的四次握手
- Client Hello:随机数C、TLS版本号、密码套件列表
- Server Hello:随机数S、确认TLS版本号、使用密码套件、数字证书
- 客户端回应:随机数pre-master(服务器公钥加密)
图示
过程描述
- 客户端发送随机数给服务器
面试 从在浏览器上输入URL到展示页面经历了哪些过程
- URL编码
- DNS域名解析
- TCP三次握手
- HTTP请求响应