应用层——HTTP协议(自己实现一个http协议)——客户端(浏览器)的请求做反序列化和请求分析,然后创建http向响应结构

news2024/11/18 19:40:35

应用层:之前我们写的创建套接字,发送数据,序列化反序列化这些都是在写应用层

我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层

之前的网络计算机是我们自定义的协议:传输的数据最终是什么样的结构!是如何进行序列化反序列化的,
而对于我们的应用层我们已经有了非常完善的协议:

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用.
HTTP(超文本传输协议) 就是其中之一.

当我们在浏览器(相当于客户端)使用URL(网址)去访问我们的服务器的时候就可以以http协议的方式对服务器发送请求,服务器也可以以这样的格式给我们发送响应:

URL:在浏览器用它就快速的向服务器发送一个请求(相当于一个客户端)
在这里插入图片描述
http请求:
在这里插入图片描述
http相应
在服务器收到http请求后:反序列化,然后再对请求做处理,得出结果,然后把结果也按照http协议的结构储存,序列化,发送回给客户端(给客户端响应):
在这里插入图片描述

自写一个能够收发http请求的服务器(进程),并且自定义一个自己的http协议(结构体字段):

服务器的代码编写:
1.创建监听套接字,绑定相应的网络信息(ip和port)。

在这里插入图片描述
启动服务器:监听套接字监听请求,监听到请求后,创建了新的套接字来供于这次请求的对家,并创建新线程来完成对请求的处理:
在这里插入图片描述
ThreadRun:对线程的处理:接收字符串型的请求,并对他做反序列化(用我们自定义的http协议来反序列化):

在这里插入图片描述
htttp请求不仅可以向服务器请求html的文本,还可以向服务器请求图片,视频等资源,所以他叫超文本协议,
所以http响应的kv字段中还有一个TYpe所传文本类型的字段

在这里插入图片描述

请求方法:
http常用的两种方法:GET /POST
主要作用:客户端(浏览器)不仅可以向我们的服务器获取资源,而且还可以传参
这两种方式的区别就是传参的方式不同。
这两中方式的传参是通过html文档中的form表单来完成的,当我能请求的html文档中有form表单是,我们的客户端就可以传参
GET:
所传参数会被拼接到URL中,向服务器发送请求传参
在这里插入图片描述
在这里插入图片描述

POST:
所传参数会被保存到请求的有效载荷中,只有参数所要传到的那个路径会被拼接到URL中:
在这里插入图片描述
在这里插入图片描述

get vs post
在这里插入图片描述
两种方法其实都不安全,即使post的参数会被放到请求的文本中保存,但是通过抓包仍然可以完全的看到。
在这里插入图片描述

HTTP响应结构

通过对http请求的分析,创建出http响应结构,然后再序列化后发送回客户端。

在这里插入图片描述
1、构建响应结构

在这里插入图片描述
构建header内容
然后把请求的内容放到有效载荷中

响应的一些特性:

301:重定向

我们把状态码设置为301的话,然后在header字段中添加:
std::string location=“Location:http://www.qq.com\r\n”;
当我们服务器返回这样的响应的时候,就不会去访问有效载荷中的网页,而是马上去访问location中的链接网页
在这里插入图片描述
原理图:
在这里插入图片描述
http响应的一些状态码,及其含义:
在这里插入图片描述

http协议的特性:

cookie文件和session结构
1、无连接:是不要去链接的而是双方都定好此协议(我们所写的套接字的监听和链接是底层的,不是http协议)
2、无状态:每次请求都是独立???
但是为什么我们有的网站登录之后下一次就不在去请求登录了呢?
因为:如果我们获取到登录页面之后,然后把登录信息填好后再次请求发送给服务器之后,服务器的登录成功响应会header字段为我们添加Set-Coookie字段返回给客户端(浏览器),浏览器有一个cookie文件,可以保存响应回的这个字段,当浏览器再次去访问这个服务器的时候,http请求中的header字段就会携带cookie这样的请求字段,服务器就会根据这个字段自动认证
在这里插入图片描述
在这里插入图片描述
但是这样的直接保存到浏览器的cookie中的用户信息是私密铭感信息,所以我们的服务器要把登录页面发送来的用户信息做封装,最后生成一个独有的编号返回给登录成功的这个客户端使用,这样虽然避免了用户直接信息暴露到浏览器的cookie中,防止了别人直接登录,但是别人任然可以通过编号来直接请求访问服务器,因此服务器就需要做一些登录地理位置之类的验证,但是这样的问题还是不能得到完全的解决的。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1799401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis缓存(笔记二:Redis常用五大数据类型)

目录 1、Redis中String字符串 1.1 常用命令解释: 1.2 原子性 1.3 具有原子性的常用命令 1.4 String数据结构 1、Redis中String字符串 概念 String 是 Redis 最基本的类型,可以理解成与 Memcached 一模一样的类型,一个 key对应一个 value…

Go微服务: 基于使用场景理解分布式之二阶段提交

概述 二阶段提交(Two-Phase Commit,2PC)是一种分布式事务协议,用于在分布式系统中确保多个参与者的操作具有原子性即所有参与者要么全部提交事务,要么全部回滚事务,以维持数据的一致性它分为两个阶段进行&…

php反序列化中的pop链

目录 一、什么是POP 二、成员属性赋值对象 例题: 方法一 方法二 三、魔术方法的触发规则 例题: 四、POC的编写 例题1: 例题2 [NISACTF 2022]babyserialize 今日总结: 一、什么是POP 在反序列化中,我们…

DexCap——斯坦福李飞飞团队泡茶机器人:更好数据收集系统的原理解析、源码剖析

前言 2023年7月,我司组建大模型项目开发团队,从最开始的论文审稿,演变成目前的两大赋能方向 大模型应用方面,以微调和RAG为代表 除了论文审稿微调之外,目前我司内部正在逐一开发论文翻译、论文对话、论文idea提炼、论…

RDMA (1)

RDMA是什么 Remote Direct Memory Access(RDMA)是用来给有高速需求的应用释放网络消耗的。 RDMA在网络的两个应用之间进行低延迟,高吞吐的内存对内存的直接数据通信。 InfiniBand需要部署独立的协议。 RoCE(RDMA over Converged Ethernet),也是由InfiniBand Trade Associat…

不要硬来!班组管理有“巧思”

班组管理,听起来似乎是一个充满“硬气”的词汇,让人联想到严肃、刻板的制度和规矩。然而,在实际操作中,我们却需要运用一些“巧思”,以柔克刚,让班组管理既有力度又不失温度。 在班组管理中,我们…

Istio_1.17.8安装

项目背景 按照istio官网的命令一路安装下来,安装好的istio版本为目前的最新版本,1.22.0。而我的k8s集群的版本并不支持istio_1.22的版本,导致ingress-gate网关安装不上,再仔细查看istio的发布文档,如果用istio_1.22版本…

Fatfs

STM32进阶笔记——FATFS文件系统(上)_stm32 fatfs-CSDN博客 STM32进阶笔记——FATFS文件系统(下)_stm32 文件系统怎样获取文件大小-CSDN博客 STM32——FATFS文件基础知识_stm32 fatfs-CSDN博客 021 - STM32学习笔记 - Fatfs文件…

Go select 语句使用场景

1. select介绍 select 是 Go 语言中的一种控制结构,用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作,使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。 基本语法: select {case communica…

纷享销客集成平台(iPaaS)的应用与实践

案例一 企业系统集成的产品级解决方案 概况 随着国家出台一系列鼓励LED照明产业发展与创新的规划和政策,以及国际市场全球演唱会、音乐会的活跃以及线上零售、商业地产等行业回暖,LED显示行业发展形势积极向好。深圳市艾比森光电股份有限公司&#xff…

第一周:计算机网络概述(上)

一、计算机网络基本概念 1、计算机网络通信技术计算机技术 计算机网络就是一种特殊的通信网络,其特殊之处就在于它的信源和信宿就是计算机。 2、什么是计算机网络 在计算机网络中,我们把这些计算机统称为“主机”(上图中所有相连的电脑和服…

【动手学深度学习】softmax回归的简洁实现详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 softmax回归的简洁实现 🌍3.2 基础练习 🌊4. 研究体会 🌊1. 研究目的 理解softmax回归的原理和基本实现方式;学习如何…

开发人员必备的常用工具合集-lombok

Project Lombok 是一个 java 库,它会自动插入您的编辑器和构建工具,为您的 Java 增添趣味。 再也不用编写另一个 getter 或 equals 方法了,只需一个注释,您的类就拥有了一个功能齐全的构建器,自动化了您的日志记录变量…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战五(引入vue-router,并给注册功能加上美丽的外衣el-form)

安装vue-router pnpm install vue-router创建router src下新增router目录,ruoter目录中新增index.ts import { createRouter, createWebHashHistory } from "vue-router"; const routes [{path: "/",name: "Home",component: () …

SQL语句练习每日5题(四)

题目1——查找GPA最高值 想要知道复旦大学学生gpa最高值是多少,请你取出相应数据 题解: 1、使用MAX select MAX(gpa) FROM user_profile WHERE university 复旦大学 2、使用降序排序组合limit select gpa FROM user_profile WHERE university 复…

当C++的static遇上了继承

比如我们想要统计下当前类被实例化了多少次,我们通常会这么写 class A { public:A() { Count_; }~A() { Count_--; }int GetCount() { return Count_; }private:static int Count_; };class B { public:B() { Count_; }~B() { Count_--; }int GetCount() { return …

LeetCode1143最长公共子序列

题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

Type-C音频转接器方案

在数字化时代,音频设备作为我们生活中不可或缺的一部分,其连接方式的便捷性和高效性显得尤为重要。Type-C音频转接器,作为一种新型的音频连接解决方案,正逐渐走进我们的生活,以其独特的优势改变着我们的音频体验。 一、…

数据库设计步骤、E-R图转关系模式、E-R图的画法

一、数据库设计步骤 ①需求分析阶段 准确了解与分析用户需求。 ②概念结构设计阶段 通过对用户需求进行综合、归纳与抽象,形成一个独立于具体数据库管理系统的概念模型。 ③逻辑结构设计阶段 将概念结构转换为某个数据库管理系统所支持的数据模型&am…

LCM — Least Common Multiple 最小公倍数

因为任何一个数都可以表示为若干个质数幂的乘积。 比如75 3*5*5,即 2^0 * 3^1 * 5^2 * 7^0 ... 那么对于两个数来说,gcd就是他们取每个质数的较小幂的乘积,lcm则相反。显然,这些幂加起来就是他们乘积。 gcd(a,b) * lcm(a,b) a…