当前位置: 首页 > article >正文

计算机网络之HTTP协议

一、HTTP协议基本概念

HTTP(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,减少网络传输量。HTTP协议不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分内容首先显示(如文本先于图形)。HTTP协议是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户端需要通过HTTP协议传输所要访问的超文本信息。

二、HTTP协议工作原理

1. 请求-响应模式

HTTP协议基于请求-响应模式,即客户端发送请求,服务器返回响应。

2. 分层顺序通信

利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则从链路层往上走。首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。接着,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。

3. HTTP报文

用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文;响应端(服务器端)的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。HTTP报文大致可分为报文首部和报文主体两部分。两者由最初出现的空行(CR+LF)来划分。通常,并不一定有报文主体。

三、HTTP请求与响应

1. HTTP请求报文

  • 请求行:包含用于请求的方法、请求URI和HTTP版本。
  • 请求头部:包含表示请求的各种条件和属性的各类首部。
  • 请求体:在使用POST或PUT等方法时,携带发送给服务器的数据。

2. HTTP响应报文

  • 状态行:包含HTTP版本、状态码、状态描述。
  • 响应头部:包含服务器的相关数据及被请求的文档信息。
  • 响应体:服务器向客户端发送的实际数据。

四、HTTP方法

HTTP请求可以使用多种请求方法,每种方法定义了不同的操作:

  • GET:请求服务器发送某个资源。
  • POST:向指定资源提交数据,请求服务器进行处理(如提交表单或上传文件)。
  • HEAD:类似于GET请求,但返回的响应中没有具体的内容,用于获取报头。
  • PUT:从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE:请求服务器删除Request-URI所标识的资源。
  • OPTIONS:使服务器传回该资源所支持的所有HTTP请求方法。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • PATCH:是对PUT方法的补充,用来对已知资源进行局部更新。
  • CONNECT:HTTP/1.1中预留给能够将连接改为通道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

五、HTTP状态码

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。响应分为五类:

  • 1xx(信息响应):表示请求已被接收,继续处理。
  • 2xx(成功响应):表示请求已成功被服务器接收、理解、并接受。
  • 3xx(重定向):表示需要客户端采取进一步的操作才能完成请求。
  • 4xx(客户端错误):表示请求包含语法错误或无法完成请求。
  • 5xx(服务器错误):表示服务器在处理请求的过程中发生了错误。
六、HTTP协议的无状态性

HTTP协议是一种无状态协议,协议自身不对请求和响应之间的通信状态进行保存。也就是说,在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。然而,随着Web的不断发展,很多业务都需要对通信状态进行保存。因此,引入了Cookie技术,通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

七、HTTP/1.1与持久连接

HTTP/1.1版本引入了持久连接的方法,只要任意一端没有明确提出断开连接,则保持TCP连接状态。这样可以在一次TCP连接后进行多次请求和响应的交互,减少了建立和关闭连接的消耗和时间延迟。持久连接使得多数请求以管线化方式发送成为可能,即不用等待亦可发送下一个请求,从而提高了传输效率。

八、HTTPS协议

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS更加安全,它是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议的信息明文传输安全。HTTPS需要到CA申请证书,一般免费证书很少,需要交费。端口号不同:HTTP默认端口号80,HTTPS默认端口号443。状态不同:HTTP的连接很简单,是无状态的。而HTTPS协议是SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。

九、Java代码示例

以下是一个简单的Java程序,用于通过HTTP协议发送GET请求并接收服务器的响应:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpExample {
    public static void main(String[] args) {
        try {
            // 创建一个URL对象
            URL url = new URL("https://www.example.com");

            // 通过URL对象打开一个HttpURLConnection连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求方法为GET
            connection.setRequestMethod("GET");

            // 获取服务器的响应码
            int responseCode = connection.getResponseCode();

            // 打印响应码
            System.out.println("Response Code: " + responseCode);

            // 如果响应码为200(OK),则读取响应内容
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuilder response = new StringBuilder();

                // 读取响应内容并存储在StringBuilder对象中
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }

                // 关闭输入流
                in.close();

                // 打印响应内容
                System.out.println("Response Content: " + response.toString());
            } else {
                // 如果响应码不是200,则打印错误信息
                System.out.println("Error: " + responseCode);
            }
        } catch (IOException e) {
            // 捕获并处理IOException异常
            e.printStackTrace();
        }
    }
}

十、HTTP协议的未来发展

随着Web技术的不断发展,HTTP协议也在不断适应新的需求。HTTP/2.0引入了二进制格式、多路复用、头部压缩等特性,显著提高了传输效率。而基于QUIC协议的HTTP/3.0进一步提升了传输速度和安全性,尤其在高延迟和不稳定的网络环境中表现出色。

1、http/2

HTTP/2.0是基于SPDY协议发展而来的。SPDY是由Google开发的基于TCP的会话层协议,旨在最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。HTTP/2标准于2015年5月以RFC 7540正式发表。
二进制传输:HTTP/2.0采用二进制格式传输数据,而非HTTP/1.x的文本格式。这减少了解析数据的时间,提高了传输效率。
多路复用:HTTP/2.0支持在一个TCP连接上并发发送多个请求和响应,通过流(stream)和帧(frame)的概念实现。这解决了HTTP/1.x中的队首阻塞问题,显著提高了传输性能。
首部压缩:HTTP/2.0使用HPACK压缩算法对头部信息进行压缩,减少了传输的数据量。HPACK通过维护一个动态表和静态表来存储和引用常见的头部字段,进一步提高了压缩效率。
服务器推送:HTTP/2.0引入了服务器推送(Server Push)机制,允许服务器在客户端请求之前主动推送资源到客户端缓存,减少了客户端的等待时间,提高了应用的响应速度。
增强的安全性:虽然HTTP/2.0协议本身并没有声明必须使用TLS,但现代浏览器如Chrome等强制要求使用HTTP/2.0时必须通过TLS(即HTTPS),从而提高了传输过程的安全性。

2、http/3

HTTP/3.0是基于Google开发的QUIC协议构建的。QUIC(Quick UDP Internet Connections)是一个基于UDP的新型传输层协议,旨在解决TCP的一些固有问题,如连接建立的延迟和拥塞控制算法的不足。HTTP/3.0标准于2022年6月6日正式发布,并被IETF(互联网工程任务组)制定在RFC 9114中。
基于QUIC的传输层协议:HTTP/3.0不再依赖于TCP,而是使用QUIC进行数据传输。QUIC具有更快的连接建立时间和更好的拥塞控制,同时支持快速的连接迁移和零RTT(Round-Trip Time)握手。
多路复用:HTTP/3.0延续了HTTP/2.0的多路复用特性,允许在单个连接上并行发送多个请求和响应,提高了网络利用率和性能。
0-RTT连接建立:基于QUIC的特性,HTTP/3.0支持零RTT连接建立,使得客户端可以在不进行完整的握手过程的情况下发送数据,进一步减少了延迟。
连接迁移:QUIC支持快速的连接迁移,即使在网络切换或IP地址变更的情况下,连接也能够快速恢复,提高了网络的稳定性和可靠性。
抗拥塞控制:HTTP/3.0内置了先进的拥塞控制算法,能够更好地适应网络环境的变化,提供更稳定和可靠的网络性能。
内置加密:HTTP/3.0将TLS 1.3集成在传输层,所有连接默认使用TLS 1.3加密,进一步简化了安全连接的建立过程,并增强了数据传输的安全性。

十一、总结

HTTP协议是计算机网络中用于Web通信的基础协议之一。它基于请求-响应模式,通过分层顺序与对方进行通信。HTTP协议定义了请求和响应的格式以及常见的请求方法和状态码。HTTP协议是无状态的,但可以通过Cookie等技术来管理状态。随着技术的演进,HTTP协议也在不断发展和完善,以适应新的需求和挑战。


http://www.kler.cn/a/390001.html

相关文章:

  • Python 随笔
  • LLMs 如何处理相互矛盾的指令?指令遵循优先级实验
  • 利用滑动窗口解题
  • 94个属于一区且接受医工交叉领域投稿的期刊汇总|个人观点·24-11-13
  • 字符及字符串(ASCII编码系统)
  • k8s集群安装(kubeadm)
  • 红帆OA iorepsavexml.aspx文件上传漏洞
  • qt中编译使用freeglut库
  • 开源 PHP 商城项目 CRMEB 二次开发和部署教程
  • 【debug】QT 相关问题error汇总 QT5升级到QT6需要注意要点
  • 蓝桥杯备考——算法
  • MySQL数据导入与清洗
  • 【客观理性深入讨论国产中间件及数据库-科创基础软件】
  • 用react实现radio同时关联proform组件
  • 【C#】CS0246: 未能找到类型或命名空间名“MySql”
  • Django启动流程01-wsgi
  • ES7 查询超过10000条 返回条数错误
  • 基本MFC类框架的俄罗斯方块游戏
  • 【动态规划】斐波那契数列模型总结
  • 四焦距聚焦型光场计算成像系统的设计
  • 我的博客网站为什么又回归Blazor了
  • 【jenkins】jenkins使用pipeline配置django项目
  • 服务器同步时间脚本
  • 【LeetCode】【算法】21. 合并两个有序链表
  • C++《stack与queue》
  • 水库大坝安全监测预警方法