面试官问你对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的普及率正在逐渐增加。

百度

掘金

淘宝

相关推荐
四喜花露水25 分钟前
Vue 自定义icon组件封装SVG图标
前端·javascript·vue.js
前端Hardy34 分钟前
HTML&CSS: 实现可爱的冰墩墩
前端·javascript·css·html·css3
web Rookie1 小时前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
Au_ust1 小时前
css:基础
前端·css
帅帅哥的兜兜1 小时前
css基础:底部固定,导航栏浮动在顶部
前端·css·css3
yi碗汤园1 小时前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
就是个名称1 小时前
购物车-多元素组合动画css
前端·css
编程一生2 小时前
回调数据丢了?
运维·服务器·前端
丶21362 小时前
【鉴权】深入了解 Cookie:Web 开发中的客户端存储小数据
前端·安全·web
Missmiaomiao3 小时前
npm install慢
前端·npm·node.js