计算机网络-----详解HTTP协议

发布于:2025-06-26 ⋅ 阅读:(23) ⋅ 点赞:(0)
✏️1. 什么是HTTP

HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的应⽤层协议(所谓 “超⽂本” 的含义, 就是传输的内容不仅仅是⽂本(⽐如 html, css 这个就是⽂本), 还可以是⼀些其他的资源, ⽐如图⽚, 视频, ⾳频等⼆进制的数据)。

在这里插入图片描述

HTTP 诞⽣与1991年,⽬前已经发展为最主流使⽤的⼀种应⽤层协议。最新的 HTTP 3 版本也正在完善,属于实验室版本,HTTP 往往是基于传输层的 TCP 协议实现的(HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于
UDP 实现),目前我们主要使⽤的还是 HTTP1.1 和 HTTP2.0。

我们平时打开⼀个⽹站,就是通过 HTTP 协议来传输数据的。当我们在浏览器中输⼊⼀个 搜狗搜索的 “⽹址”(URL) 时,浏览器就给搜狗的服务器发送了⼀个 HTTP请求,搜狗的服务器返回了⼀个 HTTP 响应。这个响应结果被浏览器解析之后,就展⽰成我们看到的⻚⾯内容。(这个过程中浏览器可能会给服务器发送多个 HTTP 请求,服务器会对应返回多个响应,这些响应⾥就包含了⻚⾯ HTML,CSS,JavaScript,图⽚,字体等信息)。

在这里插入图片描述
🌈 理解 HTTP 协议的⼯作过程

当我们在浏览器中输⼊⼀个 “⽹址”, 此时浏览器就会给对应的服务器发送⼀个 HTTP 请求. 对⽅服务器收到这个请求之后, 经过计算处理, 就会返回⼀个 HTTP 响应
在这里插入图片描述
事实上, 当我们访问⼀个⽹站的时候, 可能涉及不⽌⼀次的 HTTP 请求/响应 的交互过程,我们可以通过抓包工具来观察到所有的请求,macOS系统推荐使用proxy man抓包软件

✏️2. HTTP协议格式

以下是⼀个 HTTP请求/响应 的抓包结果

🌈HTTP请求
在这里插入图片描述

  1. ⾸⾏: [⽅法] + [url] + [版本]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束
  3. Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个
    Content-Length属性来标识Body的⻓度

🌈HTTP响应
在这里插入图片描述

  1. ⾸⾏: [版本号] + [状态码] + [状态码解释]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使⽤\n分隔;遇到空⾏表⽰Header部分结束
  3. Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个Content-Length属性来标识Body的⻓度; 如果服务器返回了⼀个html⻚⾯, 那么html⻚⾯内容就是在body中

在这里插入图片描述
为什么 HTTP 报⽂中要存在 “空⾏”?

因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空⾏就相当于是 “报头的结束标记”, 或者是"报头和正⽂之间的分隔符".HTTP 在传输层依赖 TCP 协议, TCP 是⾯向字节流的. 如果没有这个空⾏, 就会出现 “粘包问题”

✏️3. 认识URL

平时我们俗称的 “⽹址” 其实就是说的 URL (Uniform Resource Locator 统⼀资源定位符)

互联网上的每个⽂件都有⼀个唯⼀的URL,它包含的信息指出⽂件的位置以及浏览器应该怎么处理它.

URL 的详细规则由 因特⽹标准RFC1738 进⾏了约定

在这里插入图片描述

一个具体的URL
//https://v.bitedu.vip/personInf/student?userId=10000&classId=100

https : 协议⽅案名. 常⻅的有 http 和 https, 也有其他的类型. (例如访问 mysql 时⽤的jdbc:mysql)

user:pass : 登陆信息. 现在的⽹站进⾏⾝份认证⼀般不再通过 URL 进⾏了. ⼀般都会省略

v.bitedu.vip : 服务器地址. 此处是⼀个 "域名", 域名会通过 DNS 系统解析成⼀个具体的 IP 地址. (通过 ping 命令可以看到, v.bitedu.vip 的真实 IP 地址为 118.24.113.28)

端⼝号: 上⾯的 URL 中端⼝号被省略了. 当端⼝号省略的时候, 浏览器会根据协议类型⾃动决定使⽤·哪个端⼝. 例如 http 协议默认使⽤ 80 端⼝, https 协议默认使⽤ 443 端⼝

/personInf/student : 带层次的⽂件路径.

userId=10000&classId=100 : 查询字符串(query string). 本质是⼀个键值对结构. 键值对之间使⽤ & 分隔. 键和值之间使⽤ = 分隔

片段标识: 此 URL 中省略了⽚段标识. ⽚段标识主要⽤于⻚⾯内跳转

关于 query string

query string 中的内容是键值对结构. 其中的 key 和 value 的取值和个数, 完全都是程序猿⾃⼰约定的. 我们可以通过这样的⽅式来⾃定制传输我们需要的信息给服务器.

URL中可以省略的部分

	协议名: 可以省略, 省略后默认为 http://

	ip 地址 / 域名: 在 HTML 中可以省略(⽐如 img, link, script, a 标签的 src 或者 href 属性). 省略后表
	⽰服务器的 ip / 域名与当前 HTML 所属的 ip / 域名⼀致

	端⼝号: 可以省略. 省略后如果是 http 协议, 端⼝号⾃动设为 80; 如果是 https 协议, 端⼝号⾃动设为
	443.

	带层次的⽂件路径: 可以省略. 省略后相当于 / . 有些服务器会在发现 / 路径的时候⾃动访问
	/index.html

	查询字符串: 可以省略

	⽚段标识: 可以省略

关于URL encode

像/ ? : 等这样的字符,已经被url当做特殊意义理解了。因此这些字符不能随意出现。某个参数中需要带有这些特殊字符,就必须先对特殊字符进⾏转义。(⼀个中⽂字符由 UTF-8 或者 GBK 这样的编码⽅式构成, 虽然在 URL 中没有特殊含义, 但是仍然需要进⾏转义. 否则浏览器可能把 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊号)

转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不⾜4位直接处理),每2位做⼀位,前⾯加上%,编码成%XY格式

在这里插入图片描述

“+” 被转义成了 “%2B”
URL encode工具

✏️4. 认识方法(method)

在这里插入图片描述

  1. 🌈GET方法

GET 是最常⽤的 HTTP ⽅法. 常⽤于获取服务器上的某个资源,在浏览器中直接输⼊ URL, 此时浏览器就会发送出⼀个 GET 请求,另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求。

GET 请求的特点

  1. ⾸⾏的第⼀部分为 GET
  2. URL 的 query string 可以为空, 也可以不为空
  3. header 部分有若⼲个键值对结构
  4. body 部分为空

关于 GET 请求的 URL ⻓度问题

网上有些资料上描述: get请求⻓度最多1024kb 这样的说法是错误的,实际上对URL的长度没有限制,URL 的⻓度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最⼤⻓度是不同的, 但是现代浏览器⽀持的⻓度⼀般都很⻓; 在服务器端, ⼀般这个⻓度是可以配置的。

  1. 🌈POST方法

POST ⽅法也是⼀种常⻅的⽅法,多⽤于提交⽤⼾输⼊的数据给服务器(例如登陆⻚面)。

POST 请求的特点

  1. ⾸⾏的第⼀部分为 POST
  2. URL 的 query string ⼀般为空 (也可以不为空)
  3. header 部分有若⼲个键值对结构
  4. body 部分⼀般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的⻓度由 header 中的 Content-Length 指定.

经典⾯试题: 谈谈 GET 和 POST 的区别

  1. 语义不同: GET ⼀般⽤于获取数据, POST ⼀般⽤于提交数据

  2. GET 的 body ⼀般为空, 需要传递的数据通过 query string 传递, POST 的 query string ⼀般为空, 需要传递的数据通过 body 传递

  3. GET 请求⼀般是幂等的, POST 请求⼀般是不幂等的. (如果多次请求得到的结果⼀样, 就视为请求是
    幂等的)

  4. GET 可以被缓存, POST 不能被缓存. (这⼀点也是承接幂等性)

补充说明

  1. 关于语义: GET 完全可以⽤于提交数据, POST 也完全可以⽤于获取数据.
  2. 关于幂等性: 标准建议 GET 实现为幂等的. 实际开发中 GET 也不必完全遵守这个规则(主流⽹站都有"猜你喜欢" 功能, 会根据⽤⼾的历史⾏为实时更新现有的结果
  3. 关于安全性: 有些资料上说 “POST ⽐ GET 请安全”. 这样的说法是不科学的. 是否安全取决于前端在传输密码等敏感信息时是否进⾏加密, 和 GET POST ⽆关
  4. 关于传输数据量: 有的资料上说 “GET 传输的数据量⼩, POST 传输数据量⼤”. 这个也是不科学的, 标准没有规定 GET 的 URL 的⻓度, 也没有规定 POST 的 body 的⻓度. 传输数据量多少, 完全取决于不同浏览器和不同服务器之间的实现区别.
  5. 关于传输数据类型: 有的资料上说 “GET 只能传输⽂本数据, POST 可以传输⼆进制数据”. 这个也是不科学的. GET 的 query string 虽然⽆法直接传输⼆进制数据, 但是可以针对⼆进制数据进⾏ urlencode
  1. 🌈补充说明
  1. PUT 与 POST 相似,只是具有幂等特性,⼀般⽤于更新
  2. DELETE 删除服务器指定资源
  3. OPTIONS 返回服务器所⽀持的请求⽅法
  4. HEAD 类似于GET,只不过响应体不返回,只返回响应头
  5. TRACE 回显服务器端收到的请求,测试的时候会⽤到这个
  6. CONNECT 预留,暂⽆使⽤
✏️5. 认识请求报头

Header 的整体的格式也是 “键值对” 结构。每个键值对占⼀⾏,键和值之间使⽤“: ”分割。

  1. Host : 表示服务器主机的地址和端⼝
  2. Content-Length :表示 body 中的数据⻓度
  3. Content-Type : 表示请求的 body 中的数据格式
  4. User-Agent : 表示浏览器/操作系统的属性
  5. Referer : 表示这个⻚⾯是从哪个⻚⾯跳转过来的
✏️6. 认识状态码(status code)
  1. 200 OK : 这是⼀个最常⻅的状态码,表示访问成功(抓包抓到的⼤部分结果都是 200)
  2. 404 Not Found : 浏览器输⼊⼀个 URL, ⽬的就是为了访问对⽅服务器上的⼀个资源. 如果这个 URL 标识的资源不存在,那么就会出现 404
  3. 403 Forbidden : 表示访问被拒绝. 有的⻚⾯通常需要⽤⼾具有⼀定的权限才能访问(登陆后才能访问). 如果⽤⼾没有登陆直接访问, 就容易⻅到 403
  4. 405 Method Not Allowed : HTTP 中所⽀持的⽅法, 有 GET, POST, PUT, DELETE 等。但是对⽅的服务器不⼀定都⽀持所有的⽅法(或者不允许用户使⽤⼀些其他的⽅法)
  5. 500 Internal Server Error : 服务器出现内部错误. ⼀般是服务器的代码执⾏过程中遇到了⼀些特殊情况(服务器异常崩溃)会产⽣这个状态码
  6. 504 Gateway Timeout : 当服务器负载⽐较⼤的时候, 服务器处理单条请求的时候消耗的时间就会很⻓, 就可能会导致出现超时的情况
  7. 302 Move temporarily :临时重定向。在登陆⻚⾯中经常会⻅到 302. ⽤于实现登陆成功后⾃动跳转到主⻚,响应报⽂的 header 部分会包含⼀个 Location 字段, 表⽰要跳转到哪个⻚⾯.
  8. 301 Moved Permanently : 永久重定向. 当浏览器收到这种响应时, 后续的请求都会被⾃动改成新的地址.301 也是通过 Location 字段来表⽰要重定向到的新地址

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到