Golang中如何将HTTP2请求拆分成多个数据包

Golang中如何将HTTP2请求拆分成多个数据包 我们正在使用 HTTP/2 客户端发送请求,但发现即使数据包不大,一个请求也会被拆分成 1 个头部数据包和 2 个数据包。

image

由于我们正在进行非常高负载的测试,我们希望将头部和主体组装成一个数据包。

有什么方法可以实现这一点吗? 非常感谢。

测试代码如下:

//begin
tr := &http2.Transport{
AllowHTTP: true,
DialTLS: func(netw, addr string, cfg *tls.Config) (net.Conn, error) {
return net.Dial(netw, addr)
},
}

client := http.Client{
Transport: tr,
}

req, _ := http.NewRequest("POST", "http://127.0.0.1:8443", strings.NewReader("aaa"))
resp, _ := client.Do(req)
//ends

更多关于Golang中如何将HTTP2请求拆分成多个数据包的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

已经在 http2/transport.go 文件中找到了,Go 会将头部和主体分开发送。

更多关于Golang中如何将HTTP2请求拆分成多个数据包的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在HTTP/2中,数据包(帧)的拆分是由协议层和底层TCP实现控制的,通常无法直接强制将所有数据合并到单个数据包中。不过,可以通过调整相关参数来优化打包行为。

HTTP/2使用帧(Frame)来传输数据,主要有HEADERS帧和DATA帧。要减少帧的数量,可以尝试以下方法:

  1. 调整http2.Transport的写入缓冲区大小:增大写入缓冲区可能让更多数据在单个写入操作中发送。
  2. 调整TCP参数:如TCP_NODELAY和TCP_CORK,但Go的net包默认已优化。
  3. 合并请求数据:确保头部和主体数据在应用层尽可能紧凑。

以下是示例代码,展示如何调整HTTP/2传输配置:

package main

import (
    "crypto/tls"
    "net"
    "net/http"
    "strings"
    "golang.org/x/net/http2"
)

func main() {
    tr := &http2.Transport{
        AllowHTTP: true,
        DialTLS: func(netw, addr string, cfg *tls.Config) (net.Conn, error) {
            conn, err := net.Dial(netw, addr)
            if err != nil {
                return nil, err
            }
            // 调整TCP参数以优化打包
            if tcpConn, ok := conn.(*net.TCPConn); ok {
                tcpConn.SetNoDelay(false) // 禁用Nagle算法,允许数据缓冲
            }
            return conn, nil
        },
        // 增大写入缓冲区大小
        WriteBufferSize: 32 * 1024, // 32KB缓冲区
        ReadBufferSize:  32 * 1024,
    }

    client := http.Client{
        Transport: tr,
    }

    req, _ := http.NewRequest("POST", "http://127.0.0.1:8443", strings.NewReader("aaa"))
    // 设置紧凑的头部
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("User-Agent", "MyClient/1.0")

    resp, _ := client.Do(req)
    defer resp.Body.Close()
}

关键点:

  • WriteBufferSizeReadBufferSize 增加到32KB,允许更多数据缓冲。
  • SetNoDelay(false) 禁用Nagle算法,让TCP层等待更多数据再发送。
  • 保持头部紧凑,减少不必要的字段。

注意:HTTP/2协议本身会拆分帧以支持多路复用和流控制,因此完全避免拆分可能不现实。上述调整主要优化网络层打包,但实际帧拆分仍可能发生。在高负载测试中,这种优化可能减少数据包数量,但具体效果需实测验证。

回到顶部