跳到主要内容

Golang HTTP 面试题集 - HTTP协议历代发展

1. HTTP协议基础问题

Q1: 请描述 HTTP 1.0、1.1 和 2.0 在连接管理上的主要区别?

参考答案:

主要区别:

  • HTTP 1.0: 每个请求需要建立新的TCP连接,请求完成后关闭连接
  • HTTP 1.1: 引入Keep-Alive,允许在同一TCP连接上发送多个请求,但请求必须串行处理
  • HTTP 2.0: 多路复用,单个连接可并行处理多个请求

Q2: 什么是队头阻塞(Head-of-line blocking)?HTTP/2 如何解决这个问题?

参考答案:

HTTP/2 解决方案:

  • 二进制分帧:将请求分解为更小的帧
  • 多路复用:帧可以乱序发送,通过Stream ID重新组装
  • 流独立性:一个流的阻塞不影响其他流

2. HTTP/2 核心特性问题

Q3: HTTP/2 的四大核心改进是什么?请详细说明每个特性的作用。

参考答案:

  1. 多路复用(Multiplexing)
  2. 二进制分帧(Binary Framing)
  3. 头部压缩(Header Compression)
  4. 服务器推送(Server Push)

Q4: 请解释 HTTP/2 中的 HPACK 头部压缩算法原理?

参考答案:

HPACK 使用三种机制:

工作原理:

  1. 静态表: 预定义常见HTTP头部
  2. 动态表: 存储最近使用的头部字段
  3. 索引机制: 用数字索引代替完整头部
  4. 哈夫曼编码: 对字符串进行进一步压缩

3. 实际应用问题

Q5: 在 Golang 中如何创建一个支持 HTTP/2 的服务器?请提供两种方式的代码实现。

参考答案:

方式一:HTTPS + HTTP/2 (h2)

package main

import (
"fmt"
"log"
"net/http"
)

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "协议版本: %s\n", r.Proto)
fmt.Fprintf(w, "Hello HTTP/2!")
})

// 启动HTTPS服务器,自动支持HTTP/2
log.Fatal(http.ListenAndServeTLS(":8443", "cert.pem", "key.pem", nil))
}

方式二:HTTP/2 Clear Text (h2c)

package main

import (
"fmt"
"log"
"net/http"

"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
)

func main() {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "协议版本: %s\n", r.Proto)
fmt.Fprintf(w, "Hello HTTP/2 Clear Text!")
})

// 创建h2c处理器
h2cHandler := h2c.NewHandler(handler, &http2.Server{})

server := &http.Server{
Addr: ":8080",
Handler: h2cHandler,
}

log.Fatal(server.ListenAndServe())
}

Q6: HTTP/2 协议协商过程是怎样的?为什么浏览器只支持HTTPS下的HTTP/2?

参考答案:

浏览器限制原因:

  1. 安全考虑: HTTPS提供加密传输
  2. 中间代理兼容性: 避免不支持HTTP/2的代理服务器问题
  3. 标准推荐: HTTP/2标准强烈建议使用加密连接

Q7: 请比较HTTP/1.1的管道化和HTTP/2的多路复用有什么区别?

参考答案:

主要区别:

特性HTTP/1.1 PipelineHTTP/2 Multiplexing
响应顺序必须按请求顺序返回可以乱序返回
队头阻塞存在不存在
浏览器支持大多数禁用完全支持
连接数需要多个连接单个连接

4. 性能优化问题

Q8: 在什么情况下HTTP/2可能比HTTP/1.1性能更差?

参考答案:

  1. 单个大文件传输: HTTP/2的分帧开销可能大于收益
  2. TCP层队头阻塞: 丢包时影响整个连接上的所有流
  3. 服务器推送误用: 推送不需要的资源浪费带宽
  4. 连接数限制: 单连接在某些网络条件下不如多连接

Q9: 如何在Nginx中配置HTTP/2?需要注意哪些版本要求?

参考答案:

server {
listen 443 ssl http2;
server_name example.com;

ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;

# HTTP/2推送示例
location / {
http2_push /css/style.css;
http2_push /js/app.js;
root /var/www/html;
}
}

版本要求:

  • Nginx 1.9.5+ (HTTP/2支持)
  • OpenSSL 1.0.2+ (ALPN支持)
  • 必须配置SSL/TLS

5. 深度理解问题

Q10: HTTP/3 相比 HTTP/2 解决了什么问题?简述QUIC协议的特点。

参考答案:

HTTP/3主要改进:

  1. 消除TCP队头阻塞: 基于UDP的QUIC协议
  2. 更快的连接建立: 0-RTT连接恢复
  3. 连接迁移: 网络切换时保持连接
  4. 流级别的流量控制: 更细粒度的控制

这些面试题涵盖了HTTP协议发展的核心概念,既有理论基础又有实践应用,适合Golang开发岗位的技术面试准备。

Reference