HTTP协议相关知识

192 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

HTTP

HTTP概述

HTTP即超文本传输协议,是一个用于传输超媒体文档(如HTML)的应用层协议。它是为Web浏览与Web服务器之间的通信而设计的。HTTP遵循客户端 - 服务端模型,客户端打开一个连接发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,意味服务器不会在两个请求之间保留任何数据(状态)。

HTTP无状态

HTTP协议是无状态的。

请求与请求之间,是互不关心对方的情况的。上一秒发出A请求,下一秒发出B请求,B是完全感知不到A请求曾经的存在。总之,两个请求间毫无瓜葛。

若需要维持状态信息,可以使用cookiesession

cookie:

cookie是存储在浏览器的小段文本,会在浏览器每次向同一服务器再发起请求时被携带并发送到服务器上。可以把状态信息放在cookie里,带给服务器。

session:

session是存储在服务器的用户数据。浏览器第一次向服务器发起请求时,服务器会为当前会话创建一个session,并且把对应的session-id写入cookie中,用来标识session。此后,每次用户的请求都会携带一个包含了 session-id的cookie,服务器解析出session-id,便能定位到用户的用户信息。

TCP长/短连接

短连接:

建⽴连接--数据传输--关闭连接

建⽴连接--数据传输--关闭连接

建⽴连接--数据传输--关闭连接

长连接:

建⽴连接--数据传输--保持连接--数据传输--保持连接--数据传输--关闭连接

优点:

长连接可以省去较多的TCP建⽴和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户端来说,比较适⽤⻓连接。

缺点:

client与server之间的连接如果⼀直不关闭,会随着客户端连接越来越多,server端迟早会扛不住,这时server端要采取⼀些措施。如关闭⼀些⻓时间没有读写事件发生的连接,这样避免⼀些恶意连接导致server端服务受损。

请求方法类型

HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS等。

类型描述
GET请求指定页面信息,用作数据的读取,请求参数以query的形式附加,返回实体主体。
HEAD类似于GET请求,只请求页面的首部、不请求页面内容。它允许单纯获取服务器的响应头信息。
POST向指定资源提交数据进行处理请求,即创建新资源或修改现有资源。请求参数以body的形式传递,即数据被包含在请求体中
PUTPUT的URI指向是具体的某个资源,而不能指向资源集合。同时PUT对资源的修改是幂等的。从客户端向服务器传送的数据取代指定的文档的内容
DELETE请求服务器删除指定的资源。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS用于获取指定服务能够支持的通信选项。
TRACE回显服务器收到的请求,主要用于测试或诊断

请求格式

HTTP请求格式主要包括:请求行(request line)、请求头(header)、空行和请求数据

GET / HTTP/1.1
# GET表示请求方式 /表示请求的网页 HTTP/1.1表示当前HTTP的版本为1.1

HOST: 127.0.0.1:8080
# 服务器的IP地址和端口号

connection: keep-alive
# 表示连接方式为长连接

accept: text/html, application/xhtml+xml, application/xml; q=0.9,image/webp, */*;q=0.8
# 表示浏览器可接受的数据格式

user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
# 表示浏览器的版本

accept-Encoding: gzip, deflate, sdch
# 表示浏览器可接受的压缩格式

accept-Language: zh-CN, zh; q=0.8
# 表示浏览器可以接受的语言

cookie: uuid_tt_dd=10_19572343470-1658843455170-6410
# 表示浏览器在本地缓存中存储的数据

响应格式

HTTP响应格式主要包括:状态行、消息头、空行和响应正文

HTTP/1.1 200 OK
# HTTP/1.1表示当前HTTP的版本为1.1200 OK表示网络状态码

Cache-Control: private
# 缓存控制是公有的还是私有的

Connection: keep-alive
# 连接方式是长连接

Content-Encoding: gzip
# 发送数据的压缩格式采用gzip

Content-Type: text/html;charset=utf-8
# 发送数据的格式采用了text/html; 编码是utf-8

date: Thu, 20 Oct 2022 12:02:15 GMT
# 服务器当前的时间

Expires: Thu, 24 May 2022 12:02:15 GMT
# Expires存储的是一个用来控制缓存失效的日期

Set-Cookie: TOKEN=123456
# 设置Cookie,存在浏览器本地的一个缓存区域

Transfer-Encoding: chunked
# 表示将实体安全传递给用户所采用的编码形式。chunked代表使用分块传输编码

响应状态码

1xx

成功接收请求,但是处理过程还没结束,需要客户端再抛出一个请求才能完成整个过程。少见,了解即可。

2xx

表示成功接收请求、并且已经处理完毕。

200 OK:标识客户端的请求已经被服务器正确处理

3xx

表示服务器虽然处理了请求,但客户端还需要进一步的工作,才可以完成请求。

301:永久性重定向,表示资源已被分配了新的URL

302:临时性重定向,表示资源临时被分配了新的URL

304:表示服务器校验后发现资源没有改变,提醒客户端直接走缓存来取资源

4xx

客户端错误,意味着请求出错。

400:请求报文存在语法错误

403:对请求资源的访问被服务器拒绝,多半是没权限

404,资源不存在,可能是访问路径不对,也可能是这个资源在服务端被删除了

5xx

服务器错误,意味着服务器内部的程序处理有问题。

500:服务器在接受请求后进行处理的过程中,发生了内部错误

502:网关错误

504:网关超时

Heather

常规Heather

字段含义
Cache-Control控制缓存的行为
Connection控制不再转发给代理的首部字段、管理持久连接
Date创建报文的日期时间
Pragma报文指令
Trailer报文末端的首部一览
Transfer-Encoding指定报文主体的传输编码方式
Upgrade升级为其他协议
Via代理服务器的相关信息
Warning错误通知

请求头Heather

字段含义
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的内容编码
Accept-Language优先的语言(自然语言)
AuthorizationWeb认证信息花
Expect期待服务器的特定行为
From用户的电子邮箱地址
Host请求资源所在服务器
If-Match比较实体标记
If-Modified-Since比较资源的更新时间
If-None-Match比较实体标记,与If-Match相反
If-Range资源未更新时发送实体 Byte的范围请求
If-Unmodified-Since比较资源的更新时间
Max-Forwards最大传输逐跳数
Proxy-Authorization代理服务器要求客户端的认证信息
Range实体的字节范围请求
RefererTE传输编码的优先级
User-AgentHTTP客户端程序的信息

响应头Heather

字段含义
Accept-Ranges是否接受字节范围请求
Age推算资源创建经过时间
ETag资源的匹配信息
Location令客户端重定向至指定URI
Proxy-Authenticate代理服务器对客户端的认证信息
Retry-After对再次发起请求的时机要求
ServerHTTP服务器的安装信息
Vary代理服务器缓存的管理信息
WWW-Authenticate服务器对客户端的认证信息

实体Heather

请求消息和响应消息都可以包含实体信息

字段含义
Allow资源可支持的HTTP方法
Content-Encoding实体主体适用的编码方式
Content-Language实体主体的自然语言
Content-Length实体主体的大小
Content-Location替代对应资源的URI
Content-MD5实体主体的报文摘要
Content-Range实体主体的位置范围
Content-Type实体主体的媒体类型
Expires实体主体过期的日期时间
Last-Modified资源的最后修改日期时间