当前位置: 首页 > news >正文

应用层——HTTP

像我们电脑和手机使用的应用软件就是在应用层写的,当我们的数据需要传输的时候换将数据传递到传输层。 应用层专门给用户提供应用功能,比如HTTP,FTP…

我们程序员写的一个个解决我们实际的问题都在应用层,我们今天来聊一聊HTTP。

协议

协议是双方约定好的东西,在我们的客户端将数据(结构化的数据)传送给服务端的时候,要先将数据进行序列化(即将结构化的数据变成字节流),服务端得到字节流的数据,然后将字节流的数据反序列化(变成结构化的数据)进行处理。 这里我们传送过去的数据格式就是协议。 这是双方约定好的

我们先来看一看HTTP请求报文的图片
在这里插入图片描述
我们先来认识一下URL
在这里插入图片描述

URLENCODE和URLDECODE

像/ ? : 等这样的字符,已经被url当做特殊的字符特殊处理了。

转移的规则如下:

  • 将需要转码的字符转为16进制,然后从有到左,取4位,每2位做一位,前面加上%,编码成为%XY的格式

在这里插入图片描述

这是我得到的HTTP请求的格式。
在这里插入图片描述
首行: [方法] + [url] + [版本]

Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束

Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
Content-Length属性来标识Body的长度;

可以注意到请求行中,出现了 / ,其实这就是我们搜索的时候,我们向要从服务端那里拿到什么样的资源。

我先来聊一聊请求的方法
在这里插入图片描述
GET:是从服务器获取指定的资源。(如图片、音频、视频等等)
POST:是根据请求报文对指定的资源做出处理。

其中GET、POST方法是最常见的,我们要知道HTTP是以明文传输的,所以GET和POST方法的就在于,POST比GET更加私密。注意,私密!= 安全,其实GET和POST都是不安全的,当我们在一个网页输入信息的时候,我们输入的信息会出现在URL中,而POST不会出现,所以POST更加私密。

但是通过FIddler抓包,我们发现可以我们输入的信息出现在了正文中,其实也是可以被中间截获的。

协议版本: 我们现实中都在使用手机,即使使用的同一个手机,我们手机的版本也可能是不一样的,当我们需要去获取资源的时候,服务端会根据你版本的高低来判断你是否可以获取到这个资源。
如果出现了一个新的功能,你想使用,但是你版本不满足他们更新后才有的功能,这时你需要更新版本。

HTTP常见的Header

  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;(一般用于重定向的时候)
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

HTTP的响应报头

在这里插入图片描述
在这里插入图片描述
可以看到是一一对应的, 以下是我的解析

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

HTTP的状态码
在这里插入图片描述

  • 「200 OK」是最常见的成功状态码,表示一切正常。
  • 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
  • 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
  • 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。

如果想了解具体的状态码,可以去看看下面的这篇文章。
HTTP状态码和原因短语详情

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 42、PHP 实现把二叉树打印成多行
  • 【补】【康复学习--LeetCode每日一题】1186. 删除一次得到子数组最大和
  • 企业级-PDF图片水印
  • 【React】事件绑定、React组件、useState、基础样式
  • 如何理解ref toRef和toRefs
  • 问题记录-Spring Security- bean httpSecurity not found
  • HarmonyOS Web组件(二)
  • 低代码与传统编程:快速高质量构建系统的比较与方法
  • 全新UI自助图文打印系统小程序源码/自助云打印机前后端源码
  • IDEA工具中Java语言写小工具遇到的问题
  • 在RK3568上如何烧录MAC?
  • Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)
  • flutter 充电气泡
  • 安卓系统签名的制作与使用(SignApk.jar)踩坑记录
  • 【Vue3】从零开始编写项目
  • Laravel5.4 Queues队列学习
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Object.assign方法不能实现深复制
  • Odoo domain写法及运用
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python打包系统简单入门
  • vagrant 添加本地 box 安装 laravel homestead
  • 浮现式设计
  • 基于Android乐音识别(2)
  • 开源SQL-on-Hadoop系统一览
  • 入口文件开始,分析Vue源码实现
  • 山寨一个 Promise
  • 我从编程教室毕业
  • 写给高年级小学生看的《Bash 指南》
  • 学习使用ExpressJS 4.0中的新Router
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 《天龙八部3D》Unity技术方案揭秘
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 7行Python代码的人脸识别
  • kubernetes资源对象--ingress
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #mysql 8.0 踩坑日记
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)换源+apt-get基础配置+搜狗拼音
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (九)信息融合方式简介
  • (六)软件测试分工
  • (十六)Flask之蓝图
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)c++ std::pair 与 std::make
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • ... 是什么 ?... 有什么用处?
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net 无限分类
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限