应用层——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状态码和原因短语详情

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 08:04:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 08:04:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 08:04:04       58 阅读
  4. Python语言-面向对象

    2024-07-19 08:04:04       69 阅读

热门阅读

  1. Redis 地理位置 GEO 模块

    2024-07-19 08:04:04       21 阅读
  2. 一文理解ThreadPoolExecutor线程池以及运行时间

    2024-07-19 08:04:04       20 阅读
  3. AccessibilityEvent常用事件

    2024-07-19 08:04:04       19 阅读
  4. vue3封装el-table及实现表头自定义筛选

    2024-07-19 08:04:04       19 阅读
  5. jEasyUI 显示海量数据

    2024-07-19 08:04:04       19 阅读
  6. 团队高效地使用 Git 进行协同开发

    2024-07-19 08:04:04       20 阅读
  7. ArrayList

    2024-07-19 08:04:04       21 阅读