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协议的那些事

上篇博客简单介绍了TCP和UDP的协议内容,本篇将继续探讨HTTP协议

目录

引子

HTTP的协议格式

抓包工具

HTTP请求

请求行

URL

URL encode/decode

请求头

空行

正文

HTTP响应

首行

响应头

空行

正文


引子

之前讲过的TCP和UDP是基于传输层上的协议,与程序员直接交互还比较少。

但是HTTP协议是应用层协议,也就是日常开发中用到最多的协议。

传输层的协议关注的是端到端的数据传输,而应用层协议就更关注传输数据的具体使用

并且应用层协议很多情况下是程序员自己根据需求制定的,也就有了很多大佬写的协议模板,

这个HTTP协议就是这个模板之一。

HTTP协议虽然已经设计好,但是自身扩展性强,可根据自己需求自定义数据信息。

最后还有一点要注意:HTTP协议有很多版本,其中HTTP/1和HTTP/2是基于TCP的HTTP/3是基于UDP的


HTTP的协议格式

HTTP是一个文本格式的协议。那么如何获取一个HTTP的协议呢?

我们可以借助一些“抓包”工具来获取到协议。这里我们用Fiddler这个软件。

抓包工具

此软件左侧是显示抓到的所有HTTP和HTTPS的数据报

当双击左侧某个条目后,右侧就会显示这个数据报的详细信息

右侧上部分是HTTP请求下半部分是HTTP响应。


HTTP请求

来一个具体的HTTP请求:

HTTP请求分为4个部分:

请求行

请求行包含3个部分:

  1. HTTP方法,描述了这个请求想干什么
  2. URL,描述了要访问的网络上的资源具体是在哪?
  3. 版本号,HTTP/1.1表示当前的HTTP的版本是1.1版本(最主流版本)

首先, 我们具体来讨论一下HTTP方法:

其中,最常见的两个方法就是GETPOST

HTTP最初引入这些方法是为了表示不同语义,但是现在GET和POST已经没有本质区别了,都可以取和拿

不过还是有一点细微区别的:

  1. 语义上来说,GET一般用来取数据,POST用来传数据,但现在一般都混用了
  2. 通常情况下GET无正文,通过查询字符串向服务器传数据;POST有正文,通过正文来传,且无查询字符串。
  3. GET一般是幂等的POST一般是不幂等的(幂等:每次相同的输入会得到相同的结果)
  4. GET可以被缓存POST不能被缓存,因为不幂等的时候就如百度搜索的广告数据会变化,会变化就没必要缓存

最后注意,URL长度是不被限制的,不论是GET还是POST。

URL

这是一个URL的具体格式。

协议方案名 描述了当前这个URL给哪个协议使用的?

登录信息?上古时代用来展现用户名密码,现在一般都省略了

服务器地址 描述当前要访问的主机是啥,可以是域名,也可以是IP地址

服务器端口号 表示当前要访问主机上的哪个应用程序,不过一般浏览器会给HTTP设置默认值为80,HTTPS设置为443

带层次的文件路径 描述了当前要访问的服务器资源是啥

查询字符串(query string) 这是对在路径下的资源查找进一步提出了要求,而且它的格式也是键值对格式,查询字符串和路径之间用 '?' 来分割

https://www.bilibili.com/video/BV1z4411Y7tX?spm_id_from=333.999.0.0

比如上面这串网址,'?'之后的都是查询字符串,不过外人一般都不懂,这是程序员自己设定的。

片段表示符 描述了要访问当前html页面中哪个具体的子部分,能够控制浏览器滚动到相关位置,一般小说网站会有,很少见。

这么多的内容,其中主要就是上面标红的4个部分,另外后面两个是和写代码密切相关的。

URL encode/decode

当查询字符串中如果包含了特殊字符,就需要对特殊字符进行转义

转义的过程就叫作URL encode,把转移的内容还原回来就是URL decode

因为有些符号,比如 / : & = 等 在URL里都是由特殊含义的,所以为了解析成功,需要转义.

比如我们用百度搜索C++:

这里就进行了转义,将 ‘+’ 转义为 '%2B',也就是转为ASCII码的16进制表示

所以这里就能总结encode的规则:把转义内容的ASCII码取出并用十六进制表示,同时加上%就可以了

之后实际开发中,尤其在前后端交互的时候,要通过URL给服务器传递信息的时候,需要针对里面的特殊符号进行转义操作。

请求头

请求头包含了很多行,每一行都是一个键值对

空行

如上, 在请求头下方会有一行空行,相当于请求头的结束标记

正文

在请求头下方就会有一个正文。

最后注意:空行和正文可能没有,但是请求行和请求头一般都有。


HTTP响应

先来一个完整的HTTP响应:

HTTP响应也是包含了4个部分:

首行

也是包含3个部分:

  1. 版本号 HTTP/1.1
  2. 状态码 这里的200就是一个状态码
  3. 状态码的描述 这是一个英文单词,用来简单描述状态码的含义

响应头

与请求头类似, 这里也有响应头,里面有很多键值对来表示各种含义。

空行

一样的,在响应头下方会有一行空行,相当于响应头的结束标记

正文

最后就是正文部分,即服务器返回给客户端的具体数据,其中最常见的格式就是html?

? ?

谢谢你能看到这,一起加油ヽ( ̄ω ̄( ̄ω ̄〃)ゝ

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:29:04  更:2022-05-16 11:29:17 
 
开发: 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年5日历 -2024/5/19 6:00:06-

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