(小林coding) 计算机网络学习笔记:什么是HTTP?

什么是HTTP

HTTP 是超文本传输协议

我们从HTTP的名字来详细拆解他是什么

  • 协议:这表明了这是一种计算机之间九六通信的规范
  • 传输:表示用于数据的传输
  • 超文本:文字,图片,视频等的混合体,最关键的是超链接,从一个超文本跳转到另一个超文本。

HTTP请求和响应的基本流程:

  1. 建立连接:客户端(通常是Web浏览器)与服务器之间通过TCP/IP协议建立连接。默认情况下,HTTP使用端口号为80的TCP连接,或者使用端口号为443的加密连接(HTTPS)。

  2. 发送请求:客户端构建HTTP请求并发送给服务器。请求包括请求行、请求头部和请求正文。请求行包含请求方法(例如GET、POST)、请求的URL和协议版本。请求头部包含一些附加信息,如主机名、用户代理(User-Agent)和内容类型等。

  3. 服务器处理:服务器收到请求后,根据请求行和头部信息进行相应的处理。这包括查找请求的资源、验证身份、执行业务逻辑等。服务器也可以生成一个HTTP响应来提供所需的数据。

  4. 发送响应:服务器构建HTTP响应并发送给客户端。响应包括响应行、响应头部和响应正文。响应行包含状态码(例如200、404)和协议版本。响应头部包含附加的响应信息,如内容类型、长度和缓存控制等。响应正文包含服务器返回的实际数据。

  5. 接收响应:客户端接收到服务器发送的响应后,开始处理响应内容。根据内容类型和需求,客户端可能会将响应解析为HTML页面、图像、视频或其他数据类型。然后,客户端使用解析后的数据来展示内容或执行其他操作。

  6. 关闭连接:当请求和响应的交换完成后,客户端和服务器可以选择关闭连接,释放资源。HTTP1.1引入了持久连接的概念,允许多个请求和响应通过同一个连接进行交换,以提高性能。

这些步骤描述了HTTP请求和响应的基本流程。实际应用中,还可能涉及到缓存、认证、重定向等其他概念和步骤。HTTP的灵活性和开放性使其成为Web应用程序通信的标准协议。

在介绍了基本的流程之后,我们再来介绍一下这个过程中最重要的两个部分:请求报文和响应报文。

请求报文:

HTTP请求报文是客户端发送给服务器的数据块,它包含了客户端对服务器的请求内容和相关信息。HTTP请求报文由以下几个部分组成:

java 复制代码
+---------------------------+
|           请求行          |
+---------------------------+
|        请求头部字段        |
+---------------------------+
|           空行              |
+---------------------------+
|         请求体             |
+---------------------------+
  1. **请求行(Request Line):**请求行由三个部分组成,它们之间使用空格进行分隔:

请求方法(Request Method):定义了要执行的操作类型,如GET、POST、PUT、DELETE等。

请求目标(RequestTarget):表示请求要访问的资源的路径。

协议版本(Protocol Version):使用的HTTP协议的版本,如HTTP/1.1。

请求头部(Request Headers):请求头部包含关于请求的附加信息,每个头部字段都以键值对的形式出现。常见的请求头部字段包括:

Host:指定要访问的服务器主机名。 User-Agent:发送请求的用户代理,通常是浏览器标识。

Content-Type:请求的数据类型,如application/json或application/x-www-form-urlencoded。

Content-Length:请求正文的长度。 Authorization:对请求进行身份验证的凭证。

空行(Blank Line):空行用于分隔请求头部和请求正文。

请求正文(Request Body):请求正文包含了具体的请求数据,例如表单数据、JSON数据等。并非所有请求都需要请求正文,某些请求(如GET请求)通常不包含请求正文。

响应报文:

java 复制代码
+----------------------------------+
|            状态行               |
+----------------------------------+
|           响应头部字段           |
+----------------------------------+
|             空行                 |
+----------------------------------+
|           响应体                 |
+----------------------------------+

HTTP响应报文是服务器返回给客户端的数据块,它包含了服务器对客户端请求的响应内容和相关信息。HTTP响应报文由以下几个部分组成:

响应状态行(Status Line):响应状态行由三个部分组成,它们之间也使用空格进行分隔:

协议版本(Protocol Version):使用的HTTP协议的版本,如HTTP/1.1。

状态码(StatusCode):表示服务器对请求的处理结果,常见的状态码有 200(OK,请求成功)、404(Not

Found,资源不存在)、500(Internal Server Error,服务器内部错误)等。

状态信息(StatusMessage):与状态码对应的可读性描述。

响应头部(Response Headers):响应头部包含关于响应的附加信息,例如:

Content-Type:响应数据的类型,如text/html或application/json。

Content-Length:响应正文的长度。

Cache-Control:控制缓存的行为。

Set-Cookie:设置Cookie。

空行(Blank Line):空行用于分隔响应头部和响应正文。

响应正文(Response Body):响应正文包含了服务器返回给客户端的实际数据,例如HTML页面、JSON数据、图像等。

通过请求报文和响应报文,客户端和服务器之间进行通信并交换数据。客户端发送请求报文,服务器根据请求进行处理,并通过响应报文将结果返回给客户端。这种请求-响应模型是HTTP通信的基础。

了解了这些之后,我们在讲一讲在请求和响应报文中比较重要的一个知识点:

HTTP常见的状态码

2xx 成功

200 OK
  • 请求成功
  • 最常见的状态码
201 Created
  • 请求成功,并创建了新资源
  • 常见于注册、创建数据

3xx 重定向

301 Moved Permanently
  • 永久重定向
  • 资源已被永久移动到新地址
302 Found
  • 临时重定向
  • 常见于登录跳转

4xx 客户端错误

400 Bad Request
  • 请求参数错误或格式不正确
401 Unauthorized
  • 未认证(通常是未登录)
403 Forbidden
  • 已认证,但无权限访问
404 Not Found
  • 请求的资源不存在(非常常见)

5xx 服务器错误

500 Internal Server Error
  • 服务器内部错误(最常见)
502 Bad Gateway
  • 网关错误(服务器之间通信失败)
503 Service Unavailable
  • 服务不可用(服务器过载或维护)
504 Gateway Timeout
  • 网关超时(服务器响应太慢)

HTTP 常见字段有哪些?

  • Host字段:用于给客户端发送请求时,来指定服务器域名。
    有了Host字段,就可以将请求发往同一台服务器上的不同网站
  • Content-Length 字段:用于告诉浏览器,本次访问回应的数据长度是多少字节
  • Connection 字段:用于客户端要求服务器使用HTTP长连接机制(也就是我们常说的TCP三次握手协议)
  • Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式
  • Content-Encoding 字段:用于表示服务器返回数据使用了什么压缩格式

GET和POST请求区分

GET :意为从服务器获取指定的资源(只读)

特点:

  • 安全:意为请求操作不会对服务器上的资源造成破坏
  • 幂等:多次执行相同的操作,结果都一样(

给一个视频多次点赞,点赞数永远只会+1)

  • 可被缓存的

POST :根据请求负荷(报文body)对指定资源做出处理

特点:

  • 不安全
  • 不幂等
  • 不可被缓存

HTTP缓存技术

强制缓存

只要浏览器判断缓存没有过期,则可以直接用浏览器本地缓存

协商缓存

流程如上图所示

协商缓存就是与服务端协商过后,通过协商结果来判断是否使用本地缓存

总结

本篇文章主要讲解了

  • 什么是HTTP协议
  • HTTP请求和响应的流程
  • 常见的状态码
  • 常见字段
  • GET和POST请求区分
  • 缓存技术
相关推荐
咬_咬2 小时前
go语言学习(变量定义与输入输出)
开发语言·学习·golang·io·go语言··go变量定义
程序员雷欧2 小时前
大模型应用开发学习第四天
学习
炽烈小老头2 小时前
【每天学习一点算法 2026/04/03】二叉树的序列化与反序列化
学习·算法
童话名剑2 小时前
YOLO v8(学习笔记)
笔记·学习·yolo
xzal122 小时前
Python 中,and 和 or 运算符的运算规则
笔记·python
阿荻在肝了2 小时前
Agent学习一:开发环境搭建
学习
li星野2 小时前
DeepSeek可以解决什么问题?
学习
日更嵌入式的打工仔3 小时前
Clark 变换与反 Clark 变换
笔记