梳理了http相关的知识,在青训营的基础上详细了了解了更多http 1协议的细节
参考资料:青训营课件,以及两个阅读材料
HTTP (HyperText Transfer Protocol / 超文本传输协议) :=
- web是建立在HTTP协议上通信的
- 完成从客户端到服务器端等一系列运作流程
计算机与网络设备要相互通信,双方就必须要基于相同的方法
不同协议的区别
HTTP/1.0:
- 特点:最早的HTTP版本,每个请求都需要新建一个连接,每个连接只能处理一个请求和响应
- 优点:简单,易于实现
- 缺点:性能较差,因为每个请求都需要新建连接,导致延迟较高,效率低下;请求排队阻塞,头部信息冗余多次发送
HTTP/1.1:
- 特点:引入了持久连接(Keep-Alive),复用单个连接来处理多个请求和响应,减少了连接建立的开销
- 优点:相较于HTTP/1.0,性能有所提升,能够在一个连接上处理多个请求,减少了延迟
- 缺点:头部信息冗余问题仍然存在,阻塞问题(队头阻塞)仍然存在
HTTP/2:
- 特点:引入了二进制帧、头部压缩、多路复用、优先级等特性;请求和响应被分成二进制帧,可以在单个连接上同时进行多个请求和响应
- 优点:多路复用解决了队头阻塞问题,头部压缩减少了冗余数据的传输,提高了性能;同时,HTTP/2 的优化能够更好地适应现代网页的复杂性
- 缺点:实现复杂性较高,需要服务器和客户端的支持
QUIC:
- 特点:QUIC 是基于UDP协议的快速传输协议,它结合了多路复用、连接建立和安全性。QUIC 在应用层实现了类似TCP的可靠性和流控制
- 优点:QUIC 能够降低延迟,减少连接建立的时间,减少队头阻塞,同时还内建了安全性,允许连接迁移(移动设备切换网络时保持连接)
- 缺点:由于相对较新,与传统基于TCP的协议不兼容,需要服务器和客户端支持。在网络环境不稳定时,UDP可能会导致数据包丢失
TCP/IP协议族的分层
- 应用层:预存了各类通用的应用服务,比如FTP(文件传输协议), DNS(域名系统), HTTP协议
- 传输层:对上层应用层提供处于网络连接中的两台计算机之间的数据传输, 包括TCP (Transmission Control Protocol/传输控制协议)和UDP (User Data Protocol/用户数据报协议); TCP把从应用层处接收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层
- 网络层:处理在网络上流动的数据包(网络传输的最小数据单位); 规定了到达对方计算机的路径,在众多的选项内选择一条传输路线,并把数据包传过去
- 链路层:处理网络连接的硬件,包括控制操作系统、硬件的设备驱动、NIC (网络适配器俗称网卡)及光纤等物理可见部分
传输流程
发送端(客户端)从应用层往下走->接收端从链路层往上走:
(客户端)dns获取IP地址 -> http生成报文 -> tcp分割报文并传输 -> (路由器)ip寻找对方地址,中转传输 -> (接受端) tcp接收分割后的报文并重组 -> http根据请求处理 -> (如果对方需要返回数据就再通过tcp/ip通信协议传回去)
各个协议整理
- DNS(Domain Name System): 域名到IP地址之间的解析服务
- HTTP: 生成针对目标服务器的http请求报文
- TCP: 分割http报文以方便安全地传输
- IP: 搜索对方的ip地址
HTTP
ex报文请求:GET /index.html HTTP/1.1
- arg[0]: 请求服务器的类型<-方法
- arg[1]: 请求对象(url)
- arg[2]: http协议版本
报文分为首部和主体(optional),由空行(Carriage Return 和 Line Feed) 来划分
报文请求由 请求服务器的类型<-方法、请求对象(url)、http协议版本和(optional)请求首部字段和内容实体组成
响应报文由 协议版本、状态码和原因短语和 (optional)响应首部字段和实体主体构成
HTTP是无状态的协议,不保存通信状态(类似于不记得自己发送过什么)
请求方法
| 请求方法 | 功能 |
|---|---|
GET | 请求访问已被URI识别的资源; 指定的资源经过服务器端解析后返回响应内容 |
POST | 传输实体的主体,不获取响应的主题内容 |
PUT | 传输文件 |
DELETE | 请求删除文件 |
HEAD | 和get一样但只获取报文首部,不获取主体; 多用于确认uri有效性/资源更新的日期等 |
OPTIONS | 查询针对请求URI指定的资源支持的方法 |
TRACE | 查询发送出去的请求是怎样被加工修改的 |
CONNECT | 要求用隧道协议 (SSL安全套接字, TLS传输层安全)加密后传输 |
Cookie
根据之前请求和响应的的状态进行本次的请求处理,控制客户端的状态
还未增加cookie时: 根据从服务器端发送的响应报文内的 Set-Cookie 的首部字段信息,通知客户端保存 Cookie
增加cookie后:当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去
http状态码(响应报文)
负责展示http请求的返回结果:服务器端的处理是否正常,有无错误等
| 状态码类别 | 出现原因 | |
|---|---|---|
1XX | Info | 正在处理 |
2XX | Success | 正常处理完毕 |
3XX | Redirection | 需要附加操作来完成请求 |
4XX | Client Error | 服务器无法处理请求 |
5XX | Server Error | 处理请求出错 |
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变 ex. get返回全部实体,head只返回首部
2XX | |
|---|---|
200 OK | 正常处理 |
204 No Content | 处理成功但没有资源可以返回 |
206 Partial Content | 客户端需要的范围请求被正常处理了; 报文中包含content-range指定范围 |
3XX | |
|---|---|
301 Moved Permanently现是308 Permanent Redirect | 请求的资源已经被分配了新的URI,需要换新的url,继续用GET; 308强调永久性,明确应该继续使用原始的请求方法 |
302 Found现是307 Temporary Redirect | 也是有新的URI但是是临时性质的; 307明确要求服务器要求客户端继续使用原始的请求方法来请求新的url |
303 See Other | 请求的资源存在另一个url,应使用GET从新的URI获取资源; 响应报文的'Location'中提供新的url |
304 Not Modified | 服务器端允许访问资源,但未找到满足请求条件的信息 |
举个例子,假设你在一个网站上填写了一个注册表单,包含用户名、密码等信息,然后点击了 "注册" 按钮。服务器在收到这个POST请求后,会验证并保存你的用户信息,然后可能会要求你跳转到一个欢迎页面,告诉你注册已成功。
如果服务器返回 302 Found 状态码作为响应,浏览器会遵循这个重定向,但会继续使用POST方法请求新的URL。这可能会导致一个问题:如果用户刷新这个欢迎页面,浏览器会重新发送之前的POST请求,这可能会导致用户看到一个浏览器警告,询问是否要重新提交表单数据。
而如果服务器返回 303 See Other 状态码,浏览器会在重定向时使用GET方法请求新的URL。这意味着用户刷新页面时,浏览器会重新请求欢迎页面,但这次是用GET请求,不会再次提交之前的表单数据。这样可以避免浏览器警告用户重新提交POST数据,同时也符合HTTP的语义,因为重定向后应该使用GET请求来获取资源。
4XX | |
|---|---|
400 Bad Request | 请求报文出现语法错误 |
401 Unauthorized | 请求需要通过http认证/认证失败 |
403 Forbidden | 请求的访问被服务器拒绝了 |
404 Not Found | 无法找到请求的资源 |
5XX | |
|---|---|
500 Internal Server Error | 服务器在执行请求是发生了错误/web有bug/临时故障 |
503 Service Unavailable | 服务器暂时处于超负载/停机维护,无法处理请求 |
http首部
客户端和服务器沟通中的重要一环,可以提供报文主题大小,语言,认证信息etc
首部结构:
首部字段名: 字段值, ex Content-Type: text/html
| 常见首部字段类型 | 用途 |
|---|---|
| 通用首部字段(General Header Fields) | 请求报文和响应报文都会使用 |
| 请求首部字段(Request Header Fields) | 从客户端向服务器端发送请求报文时使用的首部:补充请求的附加内容、客户端信信息、响应内容相关优先级等信息 |
| 响应首部字段(Response Header Fields) | 从服务器端向客户端返回响应报文时使用的首部:补充了响应的附加内容,也会要求客户端附加额外的内容信息 |
| 实体首部字段(Entity Header Fields) | 请求报文和响应报文的实体部分使用的首部:补充了资源内容更新时间等与实体有关的信息 |
| 通用首部字段名 | 用途 |
|---|---|
| Cache-Control | 控制缓存 |
| Connection | 指定持久连接的属性,是否保持连接等连接的管理 |
| Date | 创建报文的日期时间 |
| Pragma | 报文指令 |
| Trailer | 报文末段的首部一览 |
| Transfer-Encoding | 指定报文主题的传输编码方式 |
| Upgrade | 升级为其他协议 |
| Via | 代理服务器的信息 |
| Warning | 警告 |