走进HTTP协议|青训营

153 阅读2分钟

一.HTTP协议背景

​ HTTP是一种超文本传输协议(Hypertext Transfer Protocol),一个常见的POST请求在协议层究竟做了什么?例如我现在要传输一句话,Girlfriend, I love you!协议第一行表示HTTP协议版本的描述,协议的第二行到第五行是协议元数据的描述,然后是一段空行,之后接着我们想要传输的话。

POST /Girlfriend  HTTP/1.1
Who: Alex
Content-Type: text/plain
Host: 127.0.0.1:8888
Content-Length: 22

Girlfriend, I love you

下文代表女朋友对我们的一个回复,响应的一个完整的协议

HTTP/1.1 200 0K
Server: hertz
Date: Thu,21 Apr 2023 11:46:32 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 2
Upstream-Caught: 1650541592984580

OK

​ 协议里面包含了请求行/状态行,请求头/响应头,请求体/响应体。请求行中有方法名、URL、协议版本,常见的方法名有GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH。而状态行包括协议版本、状态码、状态码描述,状态码有1xx:信息类、2xx:成功、3xx:重定向、4xx:客户端错误、5xx:服务端错误。请求头和响应头都有协议约定和业务相关。

二.请求流程

要实现刚刚我要传输的一句话Girlfriend, I love you!,在go语言的代码如下所示。

package main

import (
"context'
    
"code.byted.org/middleware/hertz/pkg/app"
"code.byted.org/middleware/hertz/pkg/app/server!
    
func main() {
    h := server.New( )
    
    h.POST("/Girlfriend".funccontextConteytc+YxannRealuestContex
         ctx.Data( 200,"text/plain; charset=utf-8",[]byte("OK"))
    })
    h.spin( )
}

​ 协议的请求流程由下图展示:

xy1.png

三.总结

HTTP1基于TCP,会存在队头阻塞、传输效率低、明文传输不安全的问题,HTTP2存在多路复用、头部压缩、二进制协议的问题,QUIC基于UDP实现、解决队头阻塞、加密减少握手次数、支持快速启动。