IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> HTTP基础 -> 正文阅读

[网络协议]HTTP基础

#什么是HTTP

HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的 应用层协议,HTTP 往往是基于传输层的 TCP 协议实现的. (HTTP1.0, HTTP1.1, HTTP2.0 均为TCP, HTTP3 基于 UDP 实现) 目前我们主要使用的还是 HTTP1.1 和 HTTP2.0 .

其实HTTP协议在我们日常使用网络中是不可或缺的存在,当我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的。当我们在百度的浏览器中输入一个网址(URL)时,浏览器作为客户端就会向百度的服务器发送一个HTTP请求而百度的服务器就会返回一个HTTP响应。这个响应被浏览器解析后就会变成我们所看到的网页,这个过程中浏览器可能会给服务器发 送多个 HTTP 请求, 服务器会对应返回多个响应, 这些响应里就包含了页面 HTML, CSS, JavaScript, 图片, 字体等信息)。

如上图中我们可以在打开百度的主页后按F12进入开发者模式后选择Network就可以看到当前所发送的HTTP请求

?

?#HTTP的报文格式

HTTP 是一个文本格式的协议. 可以通过开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的 细节。

在这里我们通过使用Fiddler这个软件来实现抓包分析,以下是下载地址

Fiddler下载链接

1.抓包工具的使用

当我们打开Fiddler后,就可以看到当前我们所发生的HTTP请求

如果我们想分析其中某个请求,直接双击即可

?

?之后选择Raw选项我们就可以看到HTTP协议请求与响应的报文格式。

2.抓包工具的原理

Fiddler 相当于一个 "代理". 浏览器访问 baidu.com 时, 就会把 HTTP 请求先发给 Fiddler, Fiddler 再把请求转发给百度的服务器. 当百度服务器返回数据时, Fiddler 拿到返回数据, 再把数据交给浏览器. 因此 Fiddler 对于浏览器和百度服务器之间交互的数据细节, 都是非常清楚的。

?

?3.HTTP协议格式分析

HTTP请求?

首行: [方法] + [url] + [版本]

Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 一个Content-Length属性来标识Body的长度?

HTTP响应

?首行: [版本号] + [状态码] + [状态码解释]

Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束 Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有 一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页 面内容就是在body中.

?我们在上图中可以看到HTTP的报文格式中存在空行,那么为什么我们要莫名其妙的为其加入一个空行呢?

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

?#HTTP请求

1.认识URL

平时我们俗称的 "网址" 其实就是说的 URL (Uniform Resource Locator 统一资源定位符). 互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它. URL 的详细规则由 因特网标准RFC1738 进行了约定。

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

登陆信息. 现在的网站进行身份认证一般不再通过 URL 进行了. 一般都会省略。

?服务器地址. 此处是一个 "域名", 域名会通过 DNS 系统解析成一个具体的 IP 地址

端口号:? 当端口号是可以被省略的,当被省略时 浏览器会根据协议类型自动决定使用 哪个端口. 例如 http 协议默认使用 80 端口, https 协议默认使用 443 端口.

带层次的文件路径:相当于html中的dom树,用于定位我们需要用的资源

查询字符串(query string). 本质是一个键值对结构. 键值对之间使 用 & 分隔. 键和值之间使用 = 分隔

片段标识:主要用于页面的跳转

当然,我们在日常中见到的网址也许并没有那么齐全的配置,因为其中有一些东西是可以被省略的

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

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

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

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

查询字符串: 可以省略

片段标识: 可以省略

2.认识HTTP的请求行“方法”

在HTTP协议中虽然存在许多的方法,但是我们日常中最常见的就只有GET与POST方法,所以在?这里我们就只介绍GET与POST

#GET

GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源

GET 请求的特点

首行的第一部分为 GET URL 的 query string 可以为空, 也可以不为空.

header 部分有若干个键值对结构.

body 部分为空.

关于 GET 请求的 URL 长度问题 网上有些资料上描述: get请求长度最多1024kb 这样的说法是错误的. HTTP 协议由 RFC 2616 标准定义, 标准原文中明确说明: "Hypertext Transfer Protocol -- HTTP/1.1," does not specify any requirement for URL length. 没有对 URL 的长度有任何的限制. 实际 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现. 在浏览器端, 不同的浏览器最大长 度是不同的, 但是现代浏览器支持的长度一般都很长; 在服务器端, 一般这个长度是可以配置的.

#POST

POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面)

POST 请求的特点

首行的第一部分为 POST URL 的 query string 一般为空 (也可以不为空)

header 部分有若干个键值对结构.

body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type(如CSS,HTML,JS等)指定. body 的长度由 header 中的 Content-Length 指定.

#GET与POST的区别

语义不同: GET 一般用于获取数据, POST 一般用于提交数据.

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

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

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

?补充说明:

关于语义: GET 完全可以用于提交数据, POST 也完全可以用于获取数据.

关于幂等性: 标准建议 GET 实现为幂等的. 实际开发中 GET 也不必完全遵守这个规则(主流网 站都有 "猜你喜欢" 功能, 会根据用户的历史行为实时更新现有的结果.

关于安全性: 有些资料上说 "POST 比 GET 请安全". 这样的说法是不科学的. 是否安全取决于 前端在传输密码等敏感信息时是否进行加密, 和 GET POST 无关.

关于传输数据量: 有的资料上说 "GET 传输的数据量小, POST 传输数据量大". 这个也是不科 学的, 标准没有规定 GET 的 URL 的长度, 也没有规定 POST 的 body 的长度. 传输数据量多少, 完全取决于不同浏览器和不同服务器之间的实现区别.

关于传输数据类型: 有的资料上说 "GET 只能传输文本数据, POST 可以传输二进制数据". 这 个也是不科学的. GET 的 query string 虽然无法直接传输二进制数据, 但是可以针对二进制数 据进行 url encode.

3.HTTP的报头

?header 的整体的格式是 "键值对" 结构. 每个键值对占一行. 键和值之间使用分号分割。同样的在这里我们也只介绍一些常用的报头

1.HOST

用于表示服务器主机的地址和端口号

2.Content-Length

表示 body 中的数据长度.

3.Content-Type?

表示请求的 body 中的数据格式.

4.User-Agent (简称 UA)

表示浏览器/操作系统的属性

5.Referer

表示这个页面是从哪个页面跳转过来的. 常用于一些广告的计费,比如我们在百度的页面点击了广告,那么运营商就会知道这条请求是从百度来的就为后续的广告计费提供了依据。

6.Cookie

由于HTTP是一种无状态协议也就是说它不对之前发生过的请求和响应的状态进行管理,也就是说无法依据之前的状态处理本次请求,相当于每次请求都要重新来过。这样做当然又一些好处,因为不必要保存之前的状态所以可以节省一些CPU资源和内存空间,但不可避免的也会让运行的速度变慢。于是便引入了Cookie,我们通过在报文中写入Cookie信息来控制客户端的状态。

?

这样我们只需要通过检查报文中的Cookie就能实现快速的响应,可以理解为缓存。

#HTTP的响应信号

认识 "状态码" (status code)

状态码表示访问一个页面的结果. (是访问成功, 还是失败, 还是其他的一些情况...

1.200 OK

表示访问成功

?大多数情况下我们都是能访问成功。

2.404 Not Found

表示没有找到资源,我们在中浏览器输入一个 URL, 目的就是为了访问对方服务器上的一个资源. 如果这个 URL 标识的资源不存 在, 那么就会出现 404

3.403 Forbidden

表示服务器中存在该资源但是我们没有权限访问

4.405 Method Not Allowed

前面我们已经学习了 HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等. 但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法).

5.500 Internal Server Error

服务器出现内部错误. 一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个 状态码. 咱们平时常用的网站很少会出现 500。

6.504 Gateway Timeout

当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的 情况.

7.302 Move temporarily

临时重定向,常在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页. 响应报文的 header 部分会包含一个 Location 字段, 表示要跳转到哪个页面.

?

?我们可以在gitee的登陆成功后通过Fiddler抓包看到此状态码

gitee登录

8.301 Moved Permanently

永久重定向. 当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址. 301 也是通过 Location 字段来表示要重定向到的新地址.

状态码总结

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:14:47  更:2022-10-08 21:16:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:27:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码