【计算机网络】理解应用层协议HTTP

news/2024/9/23 4:08:35/
http://www.w3.org/2000/svg" style="display: none;">

目录

  • HTTP协议
  • 认识URL
  • HTTP协议的请求
    • 如果我们想获得请求报文的完整内容,怎么办?
  • HTTP协议的响应
  • HTTP的方法
    • GETvsPOST
  • HTTP的状态码
  • HTTP常见Header
  • HTTP版本
  • 实现一个简单的HTTP服务器

HTTP协议

HTTP协议是一种超文本传输协议,它定义了客户端与服务端之间如何进行数据传输进而通信的协议,HTTP是一种可以用来解析和传输超文本的协议,

认识URL

随便找一个网址我们看一下对应的URL的格式是怎样的
https://i-blog.csdnimg.cn/direct/a7e8f2de2f444c15a7be5fa3f4076665.png" alt="在这里插入图片描述" />
对于协议方案名,我们这里学习的是http,但我们平常使用的都是https,但两者大同小异,https使用起来更安全。
对于域名,浏览器后台会自动给转换为ip地址,找到相应服务器,加上后面的带层次的文件路径,就能唯一标识网络上唯一一台主机上的唯一的文件资源,即互联网上的唯一文件资源。
域名后面其实还有端口号,但端口号跟协议名称是强关联的,我们不需要看到,后台会自动拼接。
对于?后面的一些字符串我们不需要知道,这些都是编码格式。

HTTP协议的请求

https://i-blog.csdnimg.cn/direct/fe4faaa0575d485c9e032d2aee4efa76.png" alt="在这里插入图片描述" />

  • 首行(请求行):方法 + url + HTTP版本
  • Header(请求报头):请求的属性,每组属性是":"分隔的kv键值对,每组属性用\r\n分开,遇到空行表示Header部分结束。
  • Body行(请求正文):Body后面跟的都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length 的属性来标识Body的长度。

如果我们想获得请求报文的完整内容,怎么办?

假如我们从网络中截获一段网络报文,我们如何知道这串报文是一个完整的请求报文呢?
我们可以按照换行符为分隔符,如果拿到空行,就说明我们已经拿到了请求报头部分,再从请求报头中拿到Content-Length属性就能知道Body数据的大小了,从而就能拿到完整的报文。
下面是一个截获的报文
https://i-blog.csdnimg.cn/direct/b7a797a7c6ce46fe81a0075a7c650277.png" alt="在这里插入图片描述" />
上面就是一个GET请求的报文。

HTTP协议的响应

https://i-blog.csdnimg.cn/direct/358a16773a8741219efb900022955de1.png" alt="在这里插入图片描述" />

  • 首行(状态行):版本号 + 状态码 + 状态码描述
  • Header(响应报头):回应的属性,每组属性是":"分隔的kv键值对,每组属性用\r\n分开,遇到空行表示Header部分结束。
  • Body(响应正文): 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.

应答响应格式
https://i-blog.csdnimg.cn/direct/5a70d301c2a24949b501d4ba011868ae.png" alt="在这里插入图片描述" />

HTTP的方法

HTTP的方法都是请求时使用,HTTP的方法众多
https://i-blog.csdnimg.cn/direct/a4056f1a6569480d8871d775b468c24e.png" alt="在这里插入图片描述" />
其中GET和POST是重点理解的两个方法,其他方法不常用,了解即可。

GETvsPOST

我们在进行登陆时,使用的账号密码就可以作为参数进行传递。

  1. GET一般用来获取静态资源(例如html),也可以通过URL来向服务器传递参数。
  2. POST可以通过http request的正文来进行参数传递。
  3. URL传递参数,参数的体量一定不大,正文可以很大。
  4. POST方法比GET方法传参更私密,但都不安全!所以需要对http的参数部分进行加密,所以就有了https。

HTTP的状态码

https://i-blog.csdnimg.cn/direct/5f48ca25aeae44c98c775e826fbc2b4e.png" alt="在这里插入图片描述" />
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
https://i-blog.csdnimg.cn/direct/98f5619a2b0740848c308f7fe6e9ee40.png" alt="在这里插入图片描述" />
https://i-blog.csdnimg.cn/direct/b871f52b6eb94a0da7499a28117202a5.png" alt="在这里插入图片描述" />
理解重定向:

  • 永久重定向:即状态码为301,表示请求的资源已经被永久的移动到新的位置,在这种情况下,服务器会在响应中添加一个Location头部,用于指定资源的新位置,这个Location包含了新的URL地址,以后浏览器会自动重定向到指定的地址。
  • 临时重定向:即状态码为302,表示请求的资源被暂时移动到新的位置,同样的,服务器会在响应中添加一个Location头部,用于暂时指定资源的新位置,浏览器会使用新的URL来重定向指定的地址,但不会缓存这个重定向。
  • 总之:无论是 HTTP 301 还是 HTTP 302 重定向, 都需要依赖 Location 选项来指定资源的新位置。 这个 Location 选项是一个标准的 HTTP 响应头部, 用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。

HTTP常见Header

  • Content-Type: 数据类型(text/html 等)
  • Content-Length: Body 的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息(比如存储账号密码,使得后续再次进入无需登录). 通常用于实现会话(session)的功能;
  • connection: 用于控制和管理客户端与服务器之间的连接状态。
  • Connection: keep-alive:表示希望保持连接以复用 TCP 连接(长连接)
  • Connection: close:表示请求/响应完成后,应该关闭 TCP 连接(短连接)

HTTP/1.1: 在 HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接,而HTTP/1.0: 在 HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。

HTTP版本

  • HTTP/0.9:仅支持GET请求,无请求与响应的报头,仅支持纯文本传输。
  • HTTP/1.0:引入POST和HEAD方法,请求和响应头信息,支持多种数据格式,支持缓存、状态码、字符集等。
  • HTTP/1.1:在1.0基础上增加了长连接、管道化、缓存控制。
  • HTTP/2.0:多路复用、二进制帧格式、头部压缩、服务器推送等功能的引入。
  • HTTP/3.0:使用 QUIC 协议替代 TCP 协议, 基于 UDP 构建的多路复用传输协议,减少了 TCP 三次握手及 TLS 握手时间, 提高了连接建立速度,解决了 TCP 中的线头阻塞问题, 提高了数据传输效率。

实现一个简单的HTTP服务器

我的gitee仓库点击这里有源码


http://www.ppmy.cn/news/1529139.html

相关文章

Mysql----索引与事务

1.索引 1.1什么是MYSQL的索引 MySQL官方对于索引的定义:索引是帮助Mysql高效获取数据的数据结构 Mysql在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据&…

【算法】栈与模拟

【ps】本篇有 5 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)删除字符串中的所有相邻重复项 .1- 题目解析 .2- 代码编写 2)比较含退格的字符串 .1- 题目解析 .2- 代码编写 3)基本计算器 II .1- 题目解析 .2- 代码编写 4&…

代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

目录 链表理论基础203. 移除链表元素1、题目描述2、思路3、code4、复杂度分析 707. 设计链表1、题目描述2、思路3、code 206. 反转链表1、题目描述2、思路3、code4、复杂度分析 链表理论基础 ❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1),适合动态增删&#xf…

LeetCode题练习与总结:回文链表--234

一、题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&#x…

【诉讼流程-健身房-违约-私教课-诉讼书提交流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(3)】

【诉讼流程-健身房-违约-私教课-诉讼书提交流程-民事诉讼-自我学习-铺平通往法律的阶梯-讲解(3)】 1、前言说明2、流程说明3、现场提交(线下)4、网上提交1-起诉书样例2-起诉书编写(1)原告信息:&…

leetcode:最高乘法得分

用auto可以过 class Solution { public:long long maxScore(vector<int>& a, vector<int>& b) {int n b.size();vector<vector<long long>> memo(4,vector<long long>(b.size(), LLONG_MIN));auto dfs [&](auto&& dfs, i…

认识结构体

目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…

KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用

KTH5762系列 低功耗、高精度 3D 霍尔角度传感器 电子手表旋钮应用 KTH5762AQ3DNE 概述 KTH5762 是一款集成了高度匹配霍尔元件的3D (XY、 XZ 、 YZ 平面 ) 霍尔角度传感器&#xff0c;集成低功 耗&#xff0c;低噪声&#xff0c;高精度零漂运放&#xff0c;高性能&#xff…