HTTP协议
HTTP协议
说明
- 如果只想关注计算机网络的应用:
- 熟悉:HTTP协议的全部内容。
- 如果想深入学习计算机网络:
- 熟悉:HTTP协议的全部内容。
概述
HTTP是一种无状态、面向连接的协议,基于B/S架构(浏览器/服务器),通过URL标识资源,以请求-响应模式完成数据交互。其设计初衷是为万维网(WWW)提供超文本传输支持,现已成为Web应用的基础通信协议。
HTTP报文格式(面试题)
HTTP请求报文
请求方法
GET
方法:
GET
方法将用户在网页上输入的信息,拼接到URL
后面提交到后端。GET
方法用过URL
进行传参,利用一个问号?
代表URL
的结尾与请求参数的开始。采用请求的正文参数直接保留在外面,显然,这种方式不适合传送私密数据。GET
方法传递的参数长度是有限制的(有些浏览器只能识别前1024个字符),所以如果需要传送大量数据的时候,也不适合使用GET方式。GET
请求会被缓存GET
请求会保留在浏览器历史记录中
POST
方法:
POST
方法也支持参数提交,采用请求的正文提交参数!可以传输大量数据,所以对传送的数据大小没有限制。POST
请求不会被缓存POST
请求不会保留在浏览器历史记录中
DELETE
方法:
- HTTP1.1 请求服务器删除指定的页面。
PUT
方法
- HTTP1.1 从客户端向服务器传送的数据取代指定的文档的内容。
URL
URL:统一资源定位符,是一种资源位置的抽象唯一识别方法。
组成:<协议>://<主机>:<端口>/<路径>
像/?:
这样的字符,被url
当做特殊意义理解了,这些字符不能随便出现。某个参数中带有这些特殊字符,就必须对特殊字符进行转义。
转义规则:
将需要转码的字符转为
16
进制,然后从右到左,取4位,每2为做一位,在前面加上%
,编码成%XY
的格式。
请求体
请求体用于传输数据,格式由Content-Type
指定:
-
GET
请求:通常无请求体,参数通过URL传递(如/search?q=keyword
)。 POST
请求:包含提交的数据,例如:- 表单数据:
user=admin&password=123456
(application/x-www-form-urlencoded
)。 - 文件上传:使用
multipart/form-data
格式。 - JSON数据:
{"username": "admin", "password": "123456"}
(application/json
)。
- 表单数据:
HTTP响应报文
状态码、短语
重定向状态码:让服务器知道浏览器,让浏览器访问新的地址。
重定向分为:
- 临时重定向:网页临时跳转到另一个网页
- 永久重定向:网页永久跳转到另一个网页
请求报文:
响应报文:
响应报文中常见的状态行:
响应报文 | 状态 |
---|---|
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.0
和 HTTP/1.1
的区别:
- 连接方式:
HTTP/1.0
只支持短连接,即建立一次TCP
连接只能进行一次HTTP
请求。而HTTP/1.1
支持了长连接,即建立一次TCP
连接可以进行多次HTTP
请求。 - 请求方式:
HTTP/1.1
中引入了新的请求方式,比如PUT
、DELETE
方法。
HTTP/2
和 HTTP/1.1
的区别:
- 二进制格式:
HTTP/2
中HTTP
请求和响应报文的首部字段,头部,正文都采用了二进制数据进行传输。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请求报文和响应报文。
- 非流水线方式:客户在收到前一个响应后才能发出下一个请求。这比非持续连接的两倍
RTT
的开销节省了 建立TCP
连接所需的一个RTT
时间。但服务器在发 送完一个对象后,其TCP
连接就处于空闲状态,浪费 了服务器资源。 - 流水线方式:客户在收到
HTTP
的响应报文之前就能够接着发送新的请求报文。一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。使用流水线方式时,客户访问所有的对象只需花费一个RTT
时间,使TCP
连接中的空闲时间减少,提高了下载文档效率。
HTTP
先请求整个网页,再2
次请求请求图片。一个三次http
请求
举例
1 | <body> |
- 对于非持续连接
- 对于持续连接(非流水线模式)
- 对于持续连接(流水线模式)
Cookie
我们想象一个场景,当我们打开一个网站时,如果这个网站我们曾经登录过,那么当我们再次打开网站时,发现就不需要再次登录了,而是直接进入了首页。例如blibli,csdn等网站。
这是怎么做到的呢?其实就是游览器保存了我们的cookie,里面记录了一些信息,当然,这些cookie是服务器创建后返回给浏览器的。流览器只进行了保存。
- Cookie的生命周期
cookie
有2种存储方式,一种是会话性,一种是持久性。
- 会话性:如果
cookie
为会话性,那么cookie
仅会保存在客户端的内存中,当我们关闭客服端时cookie
也就失效了- 持久性:如果
cookie
为持久性,那么cookie
会保存在用户的硬盘中,直至生存期结束或者用户主动将其销毁。
cookie
我们是可以进行设置的,我们可以人为设置cookie
的有效时间,什么时候创建,什么时候销毁。
- Cookie的组成
- Name:这个是cookie的名字
- Value:这个是cooke的值
- Path:这个定义了Web站点上可以访问该Cookie的目录
- Expires:这个值表示cookie的过期时间,也就是有效值,cookie在这个值之前都有效。
- Size:这个表示cookie的大小
- Cookie的HTTP传输
1 | response_header += "Set-Cookie: name=haha&&password=12345"; |
我们同样可以设置多个Cookie
保存不同的信息
1 | response_header += "Set-Cookie: name=haha"; |
HTTP响应头
Content-Type
:指定响应体的数据类型(如text/html或application/json)。-
Content-Length
:声明响应体的字节长度。 Cache-Control
:定义缓存策略(如max-age=3600表示缓存1小时)。Server
:标识服务器软件(如Nginx/1.18.0)。Set-Cookie
:向客户端设置Cookie,用于会话管理。