HTTP协议

说明

  1. 如果只想关注计算机网络的应用:
    • 熟悉:HTTP协议的全部内容。
  2. 如果想深入学习计算机网络:
    • 熟悉:HTTP协议的全部内容。

概述

HTTP是一种​​无状态、面向连接​​的协议,基于B/S架构(浏览器/服务器),通过URL标识资源,以请求-响应模式完成数据交互。其设计初衷是为万维网(WWW)提供超文本传输支持,现已成为Web应用的基础通信协议。

HTTP报文格式(面试题)

alt text

HTTP请求报文

请求方法

GET方法:

  • GET方法将用户在网页上输入的信息,拼接到URL后面提交到后端。
  • GET方法用过URL进行传参,利用一个问号?代表URL的结尾与请求参数的开始。采用请求的正文参数直接保留在外面,显然,这种方式不适合传送私密数据。
  • GET方法传递的参数长度是有限制的(有些浏览器只能识别前1024个字符),所以如果需要传送大量数据的时候,也不适合使用GET方式。
  • GET请求会被缓存
  • GET请求会保留在浏览器历史记录中

alt text

POST方法:

  • POST方法也支持参数提交,采用请求的正文提交参数!可以传输大量数据,所以对传送的数据大小没有限制。
  • POST请求不会被缓存
  • POST请求不会保留在浏览器历史记录中

alt text

DELETE方法:

  • HTTP1.1 请求服务器删除指定的页面。

PUT方法

  • HTTP1.1 从客户端向服务器传送的数据取代指定的文档的内容。

URL

URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>

alt text

/?:这样的字符,被url当做特殊意义理解了,这些字符不能随便出现。某个参数中带有这些特殊字符,就必须对特殊字符进行转义。

转义规则:

将需要转码的字符转为16进制,然后从右到左,取4位,每2为做一位,在前面加上%,编码成%XY的格式。

请求体

请求体用于传输数据,格式由Content-Type指定:

  • ​​GET请求​​:通常无请求体,参数通过URL传递(如/search?q=keyword)。
  • ​POST请求​​:包含提交的数据,例如:
    • 表单数据:user=admin&password=123456application/x-www-form-urlencoded)。
    • 文件上传:使用multipart/form-data格式。
    • JSON数据:{"username": "admin", "password": "123456"}application/json)。

HTTP响应报文

状态码、短语

alt text

重定向状态码:让服务器知道浏览器,让浏览器访问新的地址。

重定向分为

  • 临时重定向:网页临时跳转到另一个网页
  • 永久重定向:网页永久跳转到另一个网页

请求报文:

alt text

响应报文:

alt text

响应报文中常见的状态行:

响应报文 状态
HTTP/1.1 200 OK 成功返回响应
HTTP/1.1 202 Aceepted 接收请求
HTTP/1.0 301 Moved Permanently 永久重定向
HTTP/1.0 302 Found 临时重定向
HTTP/1.1 400 Bad Requset 错误的请求
HTTP/1.1 403 Forbidden 服务器理解了客户端发出的请求,但拒绝授权
HTTP/1.1 503 Service Unavailable 服务器端暂时无法处理请求

响应体

响应体是服务器返回的实际数据,格式由Content-Type决定:

  • ​​HTML页面​​:如text/html类型返回的网页内容。
  • ​二进制数据​​:如图片(image/png)或文件下载。
  • JSON/XML​​:常见于API接口数据交互。

HTTP版本

HTTP/2.0

  • 二进制传输:将以前的文本传输变为二进制传输。
  • IO多路复用:允许单个TCP上同时并发的传输多个
  • 服务器推送:服务器可以主动推送信息。

HTTP/3.0

  • 基于UDP的可靠传输:HTTP/3.0将UDP协议进行封装的。通过QUIC的技术实现了UDP的可靠传输。

HTTP/1.0、HTTP/1.1、HTTP/2.0有什么区别?

HTTP/1.0HTTP/1.1的区别:

  • 连接方式HTTP/1.0只支持短连接,即建立一次TCP连接只能进行一次HTTP请求。而HTTP/1.1支持了长连接,即建立一次TCP连接可以进行多次HTTP请求。
  • 请求方式HTTP/1.1中引入了新的请求方式,比如PUTDELETE方法。

HTTP/2HTTP/1.1 的区别:

  • 二进制格式HTTP/2HTTP请求和响应报文的首部字段,头部,正文都采用了二进制数据进行传输。HTTP/1.1请求和响应报文的首部字段,头部,正文都采用了文本数据进行传输。
  • 并发传输:引入了IO多路复用的机制。多个二进制流可以在同一个TCP连接上进行HTTP请求。

首部字段

HTTP请求头

Host

指定目标服务器的域名或IP地址及端口(如Host: www.baidu.com)。HTTP/1.1后为必填字段,用于支持虚拟主机托管(同一IP托管多个域名)。

User-Agent

1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36  

应用:服务器可根据此字段优化响应内容(如移动端返回简化页面)。

Content-Type

表示具体请求中的媒体类型信息,确切的来说是客户端告知服务端,自己即将发送的请求消息携带的数据结构类型,好让服务端接收后以合适的方式处理。一般get请求不需要设置Content-Type,只有post才有必要设置!

  • MediaType:即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中。

常见的媒体格式类型如下:

后缀 格式
text/html HTML格式
text/plain 纯文本格式
text/xml XML格式
image/gif gif图片格式
image/jpeg jpg图片格式
image/png png图片格式
application/xhtml+xml XHTML格式
application/xml XML数据格式
application/json JSON数据格式
application/pdf pdf格式
application/msword Word文档格式
application/octet-stream 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

Content-Length

声明请求体的字节大小(如Content-Length: 2048),对POST请求为必需字段。

Connection

控制TCP连接行为。

Keep-Alive:复用连接(HTTP/1.1默认启用) close:请求后关闭连接(HTTP/1默认启用)

  • 非持久连接

HTTP/1.0采用非持续连接方式。在该方式下,每次浏览器每次请求一个文件都要与服务器建立TCP连接,当收到响应后就立即关闭连接

  • 每请求一个文档就要有两倍的RTT的开销。
  • 为了减少时延,浏览器通常会建立多个并行的TCP连接同时请求多个对象。但这会使服务器负担很重。
  • 持久连接

HTTP/1.1采用持续连接方式。在该方式下,万维网服务器在发送响应之后仍然保持这条连接,时同一个客户(浏览器)和服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。

  1. 非流水线方式:客户在收到前一个响应后才能发出下一个请求。这比非持续连接的两倍RTT的开销节省了 建立TCP连接所需的一个RTT时间。但服务器在发 送完一个对象后,其TCP连接就处于空闲状态,浪费 了服务器资源。
  2. 流水线方式:客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。使用流水线方式时,客户访问所有的对象只需花费一个RTT时间,使TCP连接中的空闲时间减少,提高了下载文档效率。

alt text

HTTP先请求整个网页,再2次请求请求图片。一个三次http请求

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<body>
<h1>hello world<h1>
正文:你好,我是

<br>
<img src='./source/1.png' width='300' height='300'>
<br>

<video width='300' height='400' control>
<source src='./video' type='video/mp4'>
</video>

<br>
<img src='./source/2.png' width='300' height='300'>
<br>
</body>
  • 对于非持续连接

alt text

  • 对于持续连接(非流水线模式)

alt text

  • 对于持续连接(流水线模式)

alt text

Cookie

我们想象一个场景,当我们打开一个网站时,如果这个网站我们曾经登录过,那么当我们再次打开网站时,发现就不需要再次登录了,而是直接进入了首页。例如blibli,csdn等网站。

这是怎么做到的呢?其实就是游览器保存了我们的cookie,里面记录了一些信息,当然,这些cookie是服务器创建后返回给浏览器的。流览器只进行了保存。

alt text

  • Cookie的生命周期

cookie有2种存储方式,一种是会话性,一种是持久性。

  1. 会话性:如果cookie为会话性,那么cookie仅会保存在客户端的内存中,当我们关闭客服端时cookie也就失效了
  2. 持久性:如果cookie为持久性,那么cookie会保存在用户的硬盘中,直至生存期结束或者用户主动将其销毁。

cookie我们是可以进行设置的,我们可以人为设置cookie的有效时间,什么时候创建,什么时候销毁。

  • Cookie的组成
  • Name:这个是cookie的名字
  • Value:这个是cooke的值
  • Path:这个定义了Web站点上可以访问该Cookie的目录
  • Expires:这个值表示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。
  • Size:这个表示cookie的大小

alt text

  • Cookie的HTTP传输
1
2
response_header += "Set-Cookie: name=haha&&password=12345";
response_header += "\r\n";

alt text

我们同样可以设置多个Cookie保存不同的信息

1
2
3
4
response_header += "Set-Cookie: name=haha";
response_header += "\r\n";
response_header += "Set-Cookie: password=12345";
response_header += "\r\n";

HTTP响应头

  • ​Content-Type​​:指定响应体的数据类型(如text/html或application/json)。
  • ​​Content-Length​​:声明响应体的字节长度。
  • Cache-Control​​:定义缓存策略(如max-age=3600表示缓存1小时)。
  • Server​​:标识服务器软件(如Nginx/1.18.0)。
  • Set-Cookie​​:向客户端设置Cookie,用于会话管理。