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

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

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

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

虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用.
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中,防止了别人直接登录,但是别人任然可以通过编号来直接请求访问服务器,因此服务器就需要做一些登录地理位置之类的验证,但是这样的问题还是不能得到完全的解决的。
在这里插入图片描述

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-08 20:44:07       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-08 20:44:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-08 20:44:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-08 20:44:07       18 阅读

热门阅读

  1. 模型训练——使用预训练权重、冻结训练

    2024-06-08 20:44:07       10 阅读
  2. 两段代码想编译其中一段

    2024-06-08 20:44:07       9 阅读
  3. ros常用环境变量

    2024-06-08 20:44:07       10 阅读
  4. 递归及其使用

    2024-06-08 20:44:07       11 阅读
  5. 机器学习和深度学习相关指标和方法

    2024-06-08 20:44:07       10 阅读
  6. 算法刷题笔记 判断子序列(C++实现)

    2024-06-08 20:44:07       11 阅读
  7. Mongodb数组元素更新之使用$定位数组第一个元素

    2024-06-08 20:44:07       12 阅读
  8. C++linux下使用clog和重定向实现写日志

    2024-06-08 20:44:07       10 阅读
  9. 使用安装包安装飞桨寒武纪版本@启智(未通过)

    2024-06-08 20:44:07       14 阅读
  10. 《青少年编程与数学》课程方案:4、课程策略

    2024-06-08 20:44:07       6 阅读