Go语言工程实践入门(四)HTTP框架和网络 | 青训营

37 阅读6分钟

HTTP协议

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在网络上传输超文本(HTML、XML、图片等)的应用层协议。它是一种无状态、无连接的协议,由客户端发起请求,服务器返回响应。

在网络传输的数据流中,需要明确地知道协议的边界(协议开始和协议结束)、协议元数据和传输的内容

image.png

常见方法名:GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH

状态码:

  • 1xx:信息类
  • 2xx:成功
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务端错误

不同版本之间的对比

image.png

HTTP/1.1HTTP/2QUIC 都是用于在 Web 上进行通信的协议,它们之间有以下区别:

  1. 版本差异
    • HTTP/1.1 是最早的版本,它采用了基于文本的格式,每个请求都需要建立一个新的 TCP 连接,并且只能顺序发送和接收数据
    • HTTP/2 是 HTTP 协议的第二个主要版本,它引入了二进制格式,并支持多路复用(Multiplexing),可以在同一个连接上同时发送和接收多个请求和响应
    • QUIC(Quick UDP Internet Connections)是一个基于 UDP 的传输协议,它比 TCP 更快速、安全,并且提供了连接复用和减少延迟的功能
  2. 传输机制
    • HTTP/1.1 使用明文文本格式进行通信,每个请求和响应都包含头部信息和正文内容。它使用 TCP 作为传输层协议,建立多个连接来处理并发请求
    • HTTP/2 使用二进制格式对请求和响应进行编码,通过帧(Frame)的方式在相同的连接上同时处理多个请求和响应,实现了更高效的多路复用
    • QUIC 建立在 UDP 上,使用自定义的加密协议和错误恢复机制,提供了更好的性能和安全性
  3. 性能和效率
    • HTTP/1.1 在处理多个请求时存在队头阻塞(Head-of-line blocking)问题,因为每个请求都需要在前一个请求的响应返回后才能发送。同时,由于需要建立多个连接,会带来额外的开销
    • HTTP/2 通过多路复用将多个请求和响应复用到同一个连接中,减少了网络延迟和连接建立开销,并且支持服务器主动推送(Server Push)功能,提高了性能
    • QUIC 提供了更快速的连接建立和错误恢复机制,同时支持多路复用和头部压缩,降低了延迟和带宽占用

总的来说,HTTP/1.1 是传统的基于文本的协议,HTTP/2 引入了二进制格式和多路复用机制,提高了性能,而 QUIC 则是基于 UDP 的新一代传输协议,具有更好的性能、安全性和实时性。

网络传输

ARP协议

ARP(Address Resolution Protocol,地址解析协议)是一种用于将网络层的IP地址解析为物理层(以太网或其他局域网技术)的MAC地址的协议。

在一个以太网(Ethernet)局域网中,每个网络设备都有唯一的物理地址,即MAC地址。而在进行数据通信时,通常使用IP地址作为目标地址。ARP协议就是用来解决IP地址和MAC地址之间的映射关系。

ARP 协议的具体工作过程如下:

  1. 主机A需要向主机B发送数据,只知道目标IP地址,不知道对应的MAC地址
  2. 主机A首先在自身ARP缓存中查找目标IP地址对应的MAC地址记录。若有,则直接获取对应的MAC地址,并进行下一步处理
  3. 若主机A的ARP缓存中没有目标IP地址的对应记录,主机A会发送一个ARP请求广播包(ARP Request broadcast),其中包含自己的MAC地址、IP地址以及目标IP地址
  4. 局域网中的所有主机都会收到该ARP请求广播包,但只有与目标IP地址匹配的主机会响应
  5. 目标主机B接收到ARP请求后,会向主机A发送一个ARP响应单播包(ARP Reply unicast),其中包含自己的MAC地址、IP地址以及请求主机A的IP地址
  6. 主机A接收到ARP响应后,将目标IP地址和MAC地址的对应关系存储在自己的ARP缓存中,并将数据发送给目标主机B

此时,主机A成功获取到了目标主机B的MAC地址,并能够进行数据通信。

ARP协议是在同一个局域网内有效的,它依赖于广播和单播传输。

TCP的三次握手和四次挥手

三次握手

  • 第一次握手 客户端设标志位SYN为1,随机生成序号值seq=M,保存在TCP报文的序列号字段里,并将数据包发给服务端请求连接

  • 第二次握手 服务端收到数据包后,设标志位SYNACK为1,ack=M+1,随机生成序号值seq=N,并将数据包发给客户端确认连接请求

  • 第三次握手 客户端收到确认报文后,检查ack是否为M+1ACK是否为1,如果正确则设标志位ACK为1,ack=N+1,并将数据包发送给服务端,服务端检查ack是否为N+1ACK是否为1,如果正确则连接建立成功,三次握手结束

四次挥手

  • 第一次挥手 客户端发起挥手请求,设置标志位FIN为1,设置序列号seq=M,将报文发送给服务端,表示客户端没有数据要发送给服务端了

  • 第二次挥手 服务端收到了客户端发送的FIN=1的报文段,设置ACK为1,ack=M+1,将报文发送给客户端,表示服务端告诉客户端,确认并同意关闭请求

  • 第三次挥手 服务端设置标志位FIN为1,设置序列号seq=N,将报文发送给客户端,请求关闭连接

  • 第四次挥手 客户端收到了服务端发送的FIN=1的报文段,设置ACK为1,ack=N+1,将报文发送给服务端,服务端收到ACK之后就关闭连接,此时客户端需要等待2MSL的时间,这期间没有收到回复证明服务端正常关闭,此时客户端关闭连接