应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

本文主要是介绍应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

绪论​
“少年没有乌托邦 心向远方自明朗”,本章是应用层常用且重要的协议htttp,没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。
请添加图片描述
话不多说安全带系好,发车啦(建议电脑观看)。


1.Http协议

Http:协议超文本传送协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

2.1URL:

在这里插入图片描述

在WWW上(在网络中),每一信息资源都有统一的且在网上的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位器),它是WWW的统一资源定位标志(每一个网页会有一个确定的网址,通过网址就能进入),就是指网络地址(俗称网址)。

具体内容(看标注):
在这里插入图片描述
其中URL包括了:

  1. ip + port(上网本质就是进行进程间通信)
  2. 上网行为:获取的资源(网页、图片、视频、音频等资源本质也都是文件->存在Linux中)、上传的数据(也就是IO)

其中还有参数是通过urlencode和urldecode来实现:

对特殊的字符进行处理,像/*?这样的字符在URL中是有特殊意义的,所以就会把用户输进行转译避免冲突,将其转换成16进制的形式来代替将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
在这里插入图片描述

2.2http格式

在http中分为请求协议和应答协议:

  1. http请求协议:
    格式为:
    在这里插入图片描述
    如:在这里插入图片描述

其中格式的元素的意义:

  1. 请求行如(首行:[方法] + [url] + [版本]):
    在这里插入图片描述

    1. Method方法:Http的方法:
      在这里插入图片描述
      最长用的方法:
      1. GET:通常用来获取资源,也可以用来传递参数
      2. POST:上传数据
    2. 资源url路径:
      1. 网页、图片资源的路径(默认访问web根目录(/),也表示根目录放着该网站的首页)
    3. http协议版本
      1. http/1.0(适合学习,短连接(仅进行一次的请求与回复))
      2. http/1.1(主流,长连接)
      3. http/2.0
  2. Header(也就是上图的请求报文中很多的 K:V 部分)请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔,遇到空行表示Header部分结束在这里插入图片描述
    HTTP常见Header(咱们通过实际的协议后面理解记忆即可):

    1. Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上
    2. Content-Length: Body的长度
    3. Content-Type: 数据类型(text/html等)
    4. User-Agent: 声明用户的操作系统和浏览器版本信息;
    5. referer: 当前页面是从哪个页面跳转过来的;
    6. location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
    7. Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
      在这里插入图片描述
      http的报头中的关键字段
      Content-Type: 数据类型(text/html等)
  3. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个==Content-Length(上图是36byte)==属性来标识Body消息体(即实体数据)的长度在这里插入图片描述


http协议需要处理的问题:

  1. 报头和有效载荷如何分离
    1. 空行区分 (格式的红色标记处)
  2. 有效载荷如何交付
    1. 通过缓冲区和对应的函数
  3. http如何读到完整报文
    1. 一直读取,直到读到空行
    2. 其中空行(红色\r\n)是用来区分报头和有效载荷的
    3. 请求报头中会有存着 K:V = Content-Length : XXX,表示着正文(有效载荷)的长度
  4. http如何进行反序列化
    1. 直接根据\r\n进行区分出报头和数据然后反序列化即可

  1. http响应协议:
    在这里插入图片描述

    1. http协议版本(上方已经描述了就省略了)

    2. 状态码:在这里插入图片描述
      如常见的:
      200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)

    3. 状态码描述:ok


现在有了请求协议和应答协议
对于用户端和服务端就有:

当用户发送请求后,服务器就会响应回来(如下图)
在这里插入图片描述
其中两边协议都是有http协议版本的:
客户端中表示的是:浏览器支持的http版本(用户一般是使用浏览器来发送请求报文)、服务端中表示的是:server支持的http版本

  1. 灰度上线:版本更新先给一定用户,确定软件稳定好用后再推广给更多用户更新使用,所以版本不同就有不同的功能。
  2. telnet:远程登录服务命令

如果网页中包含了图片,那么该图片也需要再发送请求

因为HTTP协议是基于请求-响应模型的,即客户端(如浏览器)向服务器发送请求,服务器处理请求后返回响应。在网页中,每张图片都是通过HTML中的标签引入的,而浏览器在解析到这个标签时,会识别出图片资源的URL,并针对该URL发送一个新的HTTP GET请求到服务器,以获取图片数据。

你要请求的所有的资源都有后缀,后缀决定了文件的类型,在http response 给浏览器响应的时候,正文部分是什么类型,是通过文件后缀和Content-Type的映射表来判定!

所以总结:http超文本传输协议,可以支持很多内容的发送,根据请求资源的后缀,判定Content-Type是什么

用户如何请求方法(实现上网行为):

  1. 用户获取资源,发送请求报文,接收服务端返回的应答资源
  2. 向服务器进行传参,要把的数据上传到服务器(登录,注册,搜索等等),下面使用GET/POST再结合 HTML表单来实现一个登录界面底层

GET方法:

下图的HTML代码是用到了HTML表单不会可看看w3wschool的HTML对表单的使用教学
在这里插入图片描述
在这里插入图片描述
当在输入框中输入后:helloworld、123456789
url将会变成:
在这里插入图片描述

其中包含了

  1. 所打开的目录(之前表单中设置的action):“/dira/dirb/x.html”
  2. 输入的参数(对应的名称和输入的参数):myname = helloworld、…

所以GET可以通过form表单提交参数,参数提交的方式,是通过url提参的,其实输入的数据是给了浏览器


当不起指定写的时候:默认是GET方法


POST方法:

如果我们用POST方法传递参数,是通过请求正文进行参数传递
在这里插入图片描述

在这里插入图片描述


GET方法 vs POST方法

总结:
GET方法将参数拼接在url中、POST方法将参数写在正文,是在有效载荷中。
所以:
1. url传参:字节个数有限制(有些浏览器会限制url长度),POST方法:参数长度没有限制。
2. GET 私密性更差一些(直接就是在url上),POST方法能好一些(GET和POST方法都不安全,POST也能被抓包)


Http的状态码(响应码)补充:

在这里插入图片描述

  1. 当状态码是307(temporary Redirect 临时重定向):重定向可以用来进行页面的跳转。
    客户端会在服务器发来的报头中找到location报头信息(一般是一个网址)然后通过这个网址就能重定向跳转到location存的网页
    在这里插入图片描述

  2. 301 永久性重定向,搜索引擎 – 获取网页(url、关键字:无数个网络链接进行对应)
    如果一个网站过期了(之前的域名、url等改变了),当返回301 Location它就会-更新一下老的链接

2.3cookie和session

Http是无连接、无状态(http不会记录历史发送过的请求)的。

但不难发现http虽然是无状态的但,对于许多网站在登录后就会一直认识我,因为要根据身份区分我的权限(会员/非会员),这就是通过cookie技术实现的

cookie:分为文件级(较长时间有效)、内存级(短时间有效),cookie方法又称会话管理

浏览器保存数据Set Cookie,这样在后面用的时候就无需再次输入相关信息(具体如下图),浏览器就会自动的去帮你发送请求登录上你的账号(如下图set-cookie会自动添加你之前使用的信息)
在这里插入图片描述
像微软的Edge浏览器它就会存cookie信息
在这里插入图片描述
在这里插入图片描述
当我们把Cookie信息删除后就无法自动登录了就得重新登录:
在这里插入图片描述

可能存在的问题:
当别人拿着你的cookie文件岂不是就能直接用你身份去登录某些网站了。

解决方法:
通过sessionid(仅仅只是个标记)来代替cookie信息(存的就是用户的账号和密码),通过sessionid去服务端找到对应的cookie认证,也就是将cookie信息存在服务端。
在这里插入图片描述
这样我们就能再通过管理session来防止被别人盗用账号
session:可以通过用户的时间(一段时间后cookie失效)、地址(ip地址突然跳转到外地)来判断是否需要更新cookie认证是否是本人

所以说服务器上就会有大量session、session在服务器上就需要被管理


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量计算机网络细致内容,早关注不迷路。

这篇关于应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105360

相关文章

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固 通俗易懂版)

《MySQL中实现多表查询的操作方法(配sql+实操图+案例巩固通俗易懂版)》本文主要讲解了MySQL中的多表查询,包括子查询、笛卡尔积、自连接、多表查询的实现方法以及多列子查询等,通过实际例子和操... 目录复合查询1. 回顾查询基本操作group by 分组having1. 显示部门号为10的部门名,员

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

Qt实现发送HTTP请求的示例详解

《Qt实现发送HTTP请求的示例详解》这篇文章主要为大家详细介绍了如何通过Qt实现发送HTTP请求,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、添加network模块2、包含改头文件3、创建网络访问管理器4、创建接口5、创建网络请求对象6、创建一个回复对

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装