一、预备知识:
何为应用层:
应用层是OSI七层模型中的最高层,直接面向应用程序的,它的作用是提供网络服务给应用,为应用程序提供对应接口满足其需求,同时它也是TCP/IP的五层模型的最顶层,由用户自己定义实现,需要程序员在传输层的基础上自己定义好相关协议(数据报文格式),并对其进行加密解密(如果需要加密的话),或者自己去拓展功能
核心特征:
- 面向应用程序: 每个应用层协议都是为了解决某一类特定应用问题而生的(如万维网、电子邮件、文件传输)。
- 用户空间的协议: 应用层协议通常是在操作系统之上的应用程序中实现的(如浏览器、邮件客户端),而不是在内核中。
- 使用下层服务: 应用层依赖于传输层(及其下层)提供的服务。它把传输层视为一个"数据管道",这个管道可能可靠(TCP),也可能不可靠(UDP)。
何为HTTP:
HTTP本质上也是用户在传输层(TCP)的基础上自己定义的一套协议,是由历史上无数程序员不断进行规范改进,成为了一套为了特定应用(万维网)而生的通信协议。
何为URL:
**URL(全名:统一资源定位符)**类似我们的身份证号,我们的身份证号表明了我们来自哪个省,出生日期,性别等重要信息,URL就是互联网的"身份证",他可以表明我们使用什么协议,服务器地址,服务器的端口号以及资源在服务器上的具体路径等等信息,下面拿一个常用的URL来讲解
http://www.example.com:8080/path/to/myfile.html?key1=value1&key2=value2
- 协议方案:指定了用于访问资源所使用的应用层协议。
部分: http: - 主机名:指定了存放资源的主机(服务器)的域名。
部分: www.example.com
说明: 这个域名本质上就是IP地址,浏览器会通过 DNS 系统将域名解析为对应的 IP 地址,从而找到服务器在网络上的位置,所以我们在访问一个网页时既可以用域名访问,也可以用IP地址访问
ps:DNS系统:当游览器用域名访问某个网址时,会先发送给DNS系统,让其帮忙进行域名向IP地址的转换,再往对应的IP地址发送HTTP请求。
- 端口:指定连接到服务器上的哪个网络服务
部分: :8080
默认端口: 如果省略,会使用协议的默认端口(如 HTTP 是 80,HTTPS 是 443)。只有当服务运行在非默认端口时,才需要显式指定。
- 路径:描述了资源在服务器上的位置
部分: /path/to/myfile.html
说明: 通常对应于服务器文件系统中的一个文件或一个由程序处理的虚拟路径。它像文件在文件夹中的路径一样,定义了资源的层次结构。比如这个地址就可能相当于在服务器的"./path/to/myfile.html"
- 查询字符串(可选):以 ? 开头,用于向服务器传递额外的参数。
部分: ?key1=value1&key2=value2
说明: 这些参数通常是 键=值 对,多个参数之间用 & 分隔。
用途: 用于搜索、过滤、分页等。例如,?q=apple&page=2 表示搜索"apple"并显示第二页的结果。
二、HTTP:
一、HTTP的请求与响应:
HTTP请求报文:
格式:
<方法> <请求目标> <HTTP版本> // 请求行
<头部字段名>: <值> // 请求头部(多行)
一个空行(\n) // 标志头部结束
<请求体> // 可选
请求行:
方法:定义要对资源执行的操作。
常用的方法:
GET
: 向请求的对象获取数据。POST
: 向请求的对象提交数据。PUT
: 向请求的对象创建或完整替换资源(如果不存在则创建,存在则替换)DELETE
: 让请求的对象删除指定的资源。HEAD
: 与 GET 相同,但服务器只返回头部,不返回正文。(常用于检查资源是否存在)
请求目标:通常是 URL 的路径和查询部分,如 /index.html?page=1。
HTTP版本:HTTP有众多版本,比如HTTP 1.0/1.1
请求头部:为请求提供附加信息、上下文和条件。是键值对集合。
Host: www.example.com
: (HTTP/1.1 必需)指定服务器域名和端口。User-Agent: Mozilla/5.0...
: 告知服务器客户端软件信息。Content-Type: application/json
: 当有请求体时,说明请求体的类型。Content-Length: 348
: 请求体的字节长度。Cookie: name=value
: 将之前服务器设置的 Cookie 发送回去。Connection: keep-alive:
连接设为长连接
请求数据:包含要发送给服务器的数据,数据格式由 Content-Type
指定
HTTP响应报文:
格式:
<HTTP版本> <状态码> <状态短语> // 状态行
<头部字段名>: <值> // 响应头部(多行)
一个空行(\n) // 标志头部结束
<响应体> // 服务器返回的实际数据
状态行:
状态码和状态短语:
- 状态码:一个三位数字,表示请求的结果
- 状态短语:对状态码的简短描述,比如404状态码的状态短语就是Not Found
常见状态码状态行:
|---------|---------------------------|-------------------------------------|--------------------------------------------------------------------------|
| 状态码 | 状态短语 | 含义解释 | 常见场景 |
| 1xx | 信息性状态码 | 请求已被接收,继续处理。 | 在客户端发送请求体之前,服务器用来进行初步确认。 |
| 100 | Continue | 客户端应继续发送请求的剩余部分。 | 客户端发送了一个较大的请求体(如文件上传),先发一个带 Expect: 100-continue
的请求头探路,服务器同意后客户端再发数据。 |
| 102 | Processing | 服务器已收到并正在处理请求,但尚无响应。 | 用于处理耗时较长的请求,防止客户端超时。 |
| 2xx | 成功状态码 | 请求已成功被服务器接收、理解、并接受。 | 客户端的请求目的已达到。 |
| 200 | OK | 请求成功。这是最理想的状态。 | 成功获取到了请求的 HTML 页面、图片、数据等。 |
| 201 | Created | 请求成功,并因此创建了一个新资源。 | POST
或 PUT
请求成功创建了新资源。响应头 Location
应包含新资源的 URI。 |
| 202 | Accepted | 请求已接受,但处理尚未完成。 | 请求已进入后台排队(如异步任务)。 |
| 204 | No Content | 服务器成功处理了请求,但不需要返回任何实体内容。 | DELETE
请求成功;或不需刷新页面的表单提交。 |
| 206 | Partial Content | 服务器已成功处理了部分 GET 请求。 | 用于断点续传或视频音频的流媒体播放。 |
| 3xx | 重定向状态码 | 需要客户端采取进一步的操作才能完成请求。 | 告诉浏览器:"你要的资源不在这了,去另一个地方找。" |
| 301 | Moved Permanently | 永久重定向 。请求的资源已被永久移动到新位置。 | 网站改版,旧的 URL 永久失效,应使用新的 URL。搜索引擎会更新其索引。 |
| 302 | Found | 临时重定向 。请求的资源临时从不同的 URI 响应。 | 用户未登录,临时重定向到登录页。搜索引擎会继续抓取原URL。 |
| 304 | Not Modified | 资源未改变。客户端缓存的版本仍然是最新的。 | 用于缓存验证。服务器告诉客户端:"直接用你本地的缓存吧,没变。" |
| 4xx | 客户端错误状态码 | 请求包含语法错误或无法被执行。 | 错误在客户端,比如请求了不存在的资源、没有权限等。 |
| 400 | Bad Request | 坏请求。服务器无法理解请求的语法。 | 请求参数有误、JSON 格式错误。 |
| 401 | Unauthorized | 未认证。请求需要用户认证。 | 用户未登录,访问需要权限的页面。通常会弹出登录框。 |
| 403 | Forbidden | 禁止访问。服务器理解请求,但拒绝执行。 | 登录了,但权限不足(如普通用户试图访问管理员页面)。 |
| 404 | Not Found | 未找到。服务器找不到请求的资源。 | 最常见的错误之一:URL 拼写错误、资源已被删除。 |
| 405 | Method Not Allowed | 方法不被允许。请求行中指定的方法不能被用于请求相应的资源。 | 对只读的 URL 发送了 POST
请求。 |
| 408 | Request Timeout | 请求超时。服务器等待客户端发送请求的时间过长。 | 网络连接缓慢,服务器在等待期内没有收到完整的请求。 |
| 5xx | 服务器错误状态码 | 服务器在处理请求的过程中发生了错误。 | 错误在服务器端,客户端请求本身是正常的。 |
| 500 | Internal Server Error | 服务器内部错误。服务器遇到了一个未曾预料的状况,无法完成请求。 | 最常见的服务器端错误:后端代码有 Bug、数据库连接失败。 |
| 503 | Service Unavailable | 服务不可用。服务器当前无法处理请求(由于超载或系统维护)。 | 服务器流量过大,正在进行维护。通常可配合 Retry-After
头告知客户端何时重试。 |
响应头部:为响应提供附加信息。
例如下文:
Server: Apache/2.4.1
: 服务器软件信息。- Content-Type
: text/html; charset=utf-8
: 极其重要,告知客户端响应体的数据类型和编码。 Content-Length: 14345
: 响应体的字节长度。Set-Cookie: sessionId=abc123; path=/
: 指示客户端设置一个 Cookie。Location: /new-page
: 用于重定向(3xx 响应),指定新地址。Connection: keep-alive:
连接设为长连接
响应体:服务器返回的实际数据,如 HTML 文档、图片、JSON 数据等。
二、HTTP 的连接版本:
HTTP/1.0:
每一对HTTP的请求/响应要建立一次TCP连接,一对请求响应完毕就会关闭,这种就称为短连接
缺点:对于需要加载多种资源的网页,每个资源的请求都要建立一次连接(每一次都要经历三次握手、四次挥手),效率极低
HTTP/1.1:
将Connection设为keep-alive,建立一次TCP连接,就可以处理多次请求/响应,减少了 TCP 连接建立和关闭的延迟和开销,而这种就是长连接
三、Cookie和Session:
- Cookie : 一小段数据,由服务器通过
Set-Cookie
头发送给浏览器,浏览器后续请求会自动带上它(Cookie
头)。用于状态管理。 - Session: 服务器端的一种机制,用于存储特定用户会话的信息。通常 Session ID 会通过 Cookie 传递给客户端。
ps:登录时,服务器不会将密码存回 Cookie。相反,它会生成一个唯一的、随机的、有时效的字符串,称为 Session ID(会话ID) 或 Token(令牌)。服务器在后台(如内存或数据库)将这个 Session ID 与用户的身份信息(如用户ID)关联起来。服务器通过 Set-Cookie 响应头,将这个 Session ID 发送给浏览器,以后的游览器每次发送请求时,都会自动携带Cookie:session_id=xxxx,然后服务器就可以获得找到对应用户的相关信息,并发送所需信息。
三、HTTPS:
HTTPS 不是一个新的协议,它只是在原来HTTP 和 TCP 之间增加了一个 TLS/SSL 加密层
- 加密: 防止通信内容被窃听/被篡改。
- 认证 : 通过数字证书验证服务器的身份,防止中间人攻击。
工作流程简述: 非对称密钥(通过数字证书保证安全性)-> 交换对称密钥 -> 使用对称密钥加密所有 HTTP 通信。
总结:
HTTP作为最常见的应用层协议,其请求/响应报文的每个部分都要熟悉,版本之间的不同点,以及与HTTPS的区别都要理解,掌握好HTTP的相关知识有助于我们更好地理解网络,对我们做工程项目、求职升学都有极大的好处。
结语:
以上就是我分享的网络应用层常用协议------HTTP的全部内容了,希望对大家有些帮助,也希望与一样喜欢编程的朋友们共进步
谢谢观看
如果觉得还阔以的话,三连一下,以后会持续更新的,我会加油的
祝大家早安午安晚安