后端Go笔记:HTTP | 青训营

89 阅读9分钟

梳理了http相关的知识,在青训营的基础上详细了了解了更多http 1协议的细节

参考资料:青训营课件,以及两个阅读材料

juejin.cn/post/690051…

juejin.cn/post/689900…

HTTP (HyperText Transfer Protocol / 超文本传输协议) :=

  1. web是建立在HTTP协议上通信的
  2. 完成从客户端到服务器端等一系列运作流程

计算机与网络设备要相互通信,双方就必须要基于相同的方法

不同协议的区别

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协议族的分层

  1. 应用层:预存了各类通用的应用服务,比如FTP(文件传输协议), DNS(域名系统), HTTP协议
  2. 传输层:对上层应用层提供处于网络连接中的两台计算机之间的数据传输, 包括TCP (Transmission Control Protocol/传输控制协议)和UDP (User Data Protocol/用户数据报协议); TCP把从应用层处接收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层
  3. 网络层:处理在网络上流动的数据包(网络传输的最小数据单位); 规定了到达对方计算机的路径,在众多的选项内选择一条传输路线,并把数据包传过去
  4. 链路层:处理网络连接的硬件,包括控制操作系统、硬件的设备驱动、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请求的返回结果:服务器端的处理是否正常,有无错误等

状态码类别出现原因
1XXInfo正在处理
2XXSuccess正常处理完毕
3XXRedirection需要附加操作来完成请求
4XXClient Error服务器无法处理请求
5XXServer 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警告