面试官问你对http/0.9/1.0/1.1/2/3的了解,浅入浅出就对了

HTTP是互联网上最重要的应用层协议之一,它承载了现代互联网中绝大部分的数据传输和信息交换,支持了数据传输、网页浏览、状态管理、API通信和数据交换等关键功能,为用户和应用程序提供了无数的互联网体验和服务。今天我们要追本溯源,温故知新,巩固这方面的知识~

追本溯源

随着Web的发展,HTTP经历了几个重要的演进阶段,以下是HTTP发展的主要过程:

版本 发布年份 主要特点和突破 解决的问题 缺点和限制
HTTP/0.9 1991年 - 只支持GET方法 - 无请求头和响应头部 - 获取HTML文档 - 功能有限:仅支持获取HTML文档,缺乏灵活性和功能扩展性
HTTP/1.0 1995年 - 简单的请求-响应模型 - 每个请求都需要建立新的TCP连接 - 网络效率低下 - 无法处理多个请求和大量并发连接 - 队头阻塞:每个请求必须按顺序等待前一个请求的响应,无法并行处理
HTTP/1.1 1997年 - 引入持久连接(Keep-Alive)机制 - 请求管道化 - 分块传输编码 - 提高连接的复用性和性能 - 解决并发连接和请求序列化的问题 - 队头阻塞:仍然存在队头阻塞问题,一个请求的延迟会影响后续请求的处理
HTTPS - - 引入了加密和身份验证机制,基于HTTP添加了SSL/TLS协议 - 数据传输的安全性和隐私保护 - 防止数据被窃听和篡改 - 加密计算开销:加密和解密过程会增加服务器和客户端的计算开销
HTTP/2 2015年 - 引入二进制协议 - 多路复用 - 首部压缩 - 服务器推送 - 提高性能和效率 - 解决了HTTP/1.x中的队头阻塞问题 - 需要升级:HTTP/2需要服务器和客户端支持,老版本的应用程序不兼容
HTTP/3 2019年 - 引入了QUIC传输协议 - 使用UDP协议替代TCP - 提高连接建立速度和传输效率 - 解决TCP的队头阻塞和握手延迟问题 - 需要升级:HTTP/3需要服务器和客户端支持,老版本的应用程序不兼容

学以致用

1. HTTP/0.9:

  • HTTP/0.9非常简单,仅支持使用GET方法从服务器获取HTML文档。

  • 示例:使用Node.js的http模块发送HTTP/0.9请求的示例代码如下:

    javascript 复制代码
    const http = require('http');
    
    const options = {
      hostname: 'example.com',
      port: 80,
      path: '/index.html',
      method: 'GET'
    };
    
    const req = http.request(options, (res) => {
      res.on('data', (chunk) => {
        console.log(chunk.toString());
      });
    });
    
    req.end();
  • 由于HTTP/0.9没有请求头和响应头部,因此无需特殊的服务器或浏览器配置。

2. HTTP/1.0:

  • HTTP/1.0引入了请求头和响应头的概念,可以发送不同类型的请求和接收更丰富的响应。

  • 示例:使用Node.js的http模块发送HTTP/1.0请求的示例代码如下:

    javascript 复制代码
    const http = require('http');
    
    const options = {
      hostname: 'example.com',
      port: 80,
      path: '/index.html',
      method: 'GET',
      headers: {
        'User-Agent': 'Node.js HTTP Client'
      }
    };
    
    const req = http.request(options, (res) => {
      res.on('data', (chunk) => {
        console.log(chunk.toString());
      });
    });
    
    req.end();
  • 配置服务器以支持HTTP/1.0可以通过服务器软件的配置文件进行设置,如Node.js中使用Express框架的示例代码如下:

    javascript 复制代码
    const express = require('express');
    const app = express();
    
    // 其他路由和中间件配置
    
    app.listen(80, () => {
      console.log('Server is running on port 80');
    });

3. HTTP/1.1:

  • HTTP/1.1引入了持久连接(Keep-Alive)机制和其他改进,可以复用连接并发送多个请求。

  • 示例:使用Node.js的http模块发送HTTP/1.1请求的示例代码如下:

    javascript 复制代码
    const http = require('http');
    
    const options = {
      hostname: 'example.com',
      port: 80,
      path: '/index.html',
      method: 'GET',
      headers: {
        'User-Agent': 'Node.js HTTP Client',
        'Connection': 'keep-alive'
      }
    };
    
    const req = http.request(options, (res) => {
      res.on('data', (chunk) => {
        console.log(chunk.toString());
      });
    });
    
    req.end();
  • 配置服务器以支持HTTP/1.1可以通过服务器软件的配置文件进行设置,如Node.js中使用Express框架的示例代码如下:

    javascript 复制代码
    const express = require('express');
    const app = express();
    
    app.disable('etag'); // 禁用ETag,以便发送多个请求
    
    // 其他路由和中间件配置
    
    app.listen(80, () => {
      console.log('Server is running on port 80');
    });

非常抱歉,以下是对剩余版本的HTTP协议的说明以及使用Node.js的代码示例:

4. HTTPS:

  • HTTPS基于HTTP协议添加了SSL/TLS协议的加密和身份验证机制,用于保证数据传输的安全性和隐私保护。

  • 示例:使用Node.js的https模块发送HTTPS请求的示例代码如下:

    javascript 复制代码
    const https = require('https');
    
    const options = {
      hostname: 'example.com',
      port: 443,
      path: '/index.html',
      method: 'GET'
    };
    
    const req = https.request(options, (res) => {
      res.on('data', (chunk) => {
        console.log(chunk.toString());
      });
    });
    
    req.end();
  • 需要使用有效的SSL证书来启用HTTPS连接,可以通过在Node.js服务器中配置证书文件的路径和密钥进行设置。

5. HTTP/2:

  • HTTP/2引入了二进制协议、多路复用、首部压缩和服务器推送等特性,以提高性能和效率。

  • 示例:使用Node.js的http2模块发送HTTP/2请求的示例代码如下:

    javascript 复制代码
    const http2 = require('http2');
    
    const client = http2.connect('https://example.com');
    
    const req = client.request({
      ':path': '/index.html'
    });
    
    req.on('response', (headers) => {
      for (const name in headers) {
        console.log(`${name}: ${headers[name]}`);
      }
    });
    
    req.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    
    req.end();
  • 需要在服务器端和客户端均启用HTTP/2协议才能进行HTTP/2通信,可以通过在Node.js服务器中配置http2模块进行设置。

6. HTTP/3:

  • HTTP/3基于QUIC传输协议,使用UDP协议替代了TCP,旨在提高连接建立速度和传输效率,并解决TCP的队头阻塞和握手延迟问题。
  • 示例:由于目前为止,Node.js的内置模块尚不支持直接使用HTTP/3协议,这里使用其他库来实现HTTP/3通信。以下是使用quinn库和axios-quic库的示例代码:

示例一:使用quinn库实现HTTP/3通信

javascript 复制代码
const { connect } = require('quinn');

async function main() {
  const connection = await connect('https://example.com', {
    alpn: 'h3-29',
  });

  const client = connection.request({
    method: 'GET',
    path: '/index.html',
    headers: {
      'user-agent': 'quinn-client',
    },
  });

  const response = await client;
  console.log(response.body.toString());

  await connection.close();
}

main().catch(console.error);

示例二:使用axios-quic库实现HTTP/3通信

javascript 复制代码
const axios = require('axios').default;
const axiosQuic = require('axios-quic');

async function main() {
  const instance = axios.create({
    transport: axiosQuic,
    quic: {
      version: 'h3-29',
    },
  });

  const response = await instance.get('https://example.com/index.html');
  console.log(response.data);
}

main().catch(console.error);
  • 配置服务器以支持HTTP/3需要特定的服务器软件和配置。目前,常用的HTTP/3服务器实现包括Cloudflare的quiche和NGINX的quiche-nginx模块等。

总结

上面主要示例是针对Node.js中使用不同版本的HTTP协议的方式,具体的实现方式可能会因应用程序的需求和使用的框架而有所不同。同样,服务器的配置方式也取决于所使用的服务器软件。目前,在实际应用中,HTTP/1.1是目前最广泛使用的HTTP协议版本,HTTP/2的普及率正在逐渐增加。

百度

掘金

淘宝

相关推荐
汪子熙1 分钟前
浏览器里出现 .angular/cache/19.2.6/abap_test/vite/deps 路径究竟说明了什么
前端·javascript·面试
Benzenene!3 分钟前
让Chrome信任自签名证书
前端·chrome
yangholmes88883 分钟前
如何在 web 应用中使用 GDAL (二)
前端·webassembly
jacy5 分钟前
图片大图预览就该这样做
前端
林太白7 分钟前
Nuxt3 功能篇
前端·javascript·后端
YuJie8 分钟前
webSocket Manager
前端·javascript
Mapmost24 分钟前
Mapmost SDK for UE5 内核升级,三维场景渲染效果飙升!
前端
Mapmost26 分钟前
重磅升级丨Mapmost全面兼容3DTiles 1.1,3DGS量测精度跃升至亚米级!
前端·vue.js·three.js
wycode33 分钟前
Promise(一)极简版demo
前端·javascript