网络基础2--HTTP协议详解

news2024/9/27 12:17:55

目录

 一、自定制协议

 二、TCP粘包问题

2.1. 定长结构体和非定长结构体在发送时的区别

 2.2. 那么为什么内存不连续的结构体不能直接使用send发送呢?

2.2. 那我们怎样去接收不定长的数据呢?

2.3. 我们怎样去接收不连续的内存呢?

2.4序列化和反序列化

三、HTTP协议

3.1 http协议概述

3.2  HTTP的URL解释

 3.3  HTTP协议的数据流

3.4  HTTP协议的格式

3.4.1、请求格式

3.4.2、响应格式

3.5  HTTP的请求方法:

面试题: GET方法和POST谁更安全

3.6 分析请求体的内容:

3.7  HTTP的响应状态码

3.7.1 为什么需要状态码?

3.8 HTTP常见的header


主要讲的是应用层传输层

 一、自定制协议

 就是程序员在应用层约定应用层格式

我们先来实现一个网络版本的计算器

思路:

实现:

 

引出到底什么是自定制协议?

 二、TCP粘包问题

tcp的面向字节流的特性,导致了tcp粘包的问题

针对接收方而言,没有办法区分数据是发送了几次,前后发送的数据是没有间隔符的,粘连在一起的 

2.1. 定长结构体和非定长结构体在发送时的区别

 2.2. 那么为什么内存不连续的结构体不能直接使用send发送呢?

我们先来看看内存连续结构体的发送原理:

 我们再来看看不定长的结构体

2.2. 那我们怎样去接收不定长的数据呢?

比如发送了两次数据,一次10字节,一次100字节,怎么去接收呢?

 1.tcp在传输数据的时候可以加上大小

 先接收4个字节,解析数据包的长度,再去接收后面的内容

这就解决了粘连的问题

2.还可以加上自定制的分隔符  (\r\n)

2.3. 我们怎样去接收不连续的内存呢?

比如这一种数据,存放的是首字符的地址

 这就需要引出序列化和反序列化

2.4序列化和反序列化

序列化:    将程序当中的数据结构转化成为二进制序列;


数据结构:
内存如果是连续的,直接就可以发送。 例如: 结构体
内存如果是不连续的, 序列化就是将不同的内存组合起来, 放到一块连续的空间当中,发送出去。例如: 链表多个节点

反序列化: 将二进制转化成为数据结构。

三、HTTP协议

3.1 http协议概述

超文本传输协议

3.2  HTTP的URL解释

我们来看下完整的URL

带层次的文件路径:

 查询字符串:

URL每个部分的总结

 3.3  HTTP协议的数据流

首先要知道:HTTP协议是应用层协议,他在网络协议栈使用到的下层(传输层)协议是TCP协议

直白一点就是:HTTP协议产生的数据,是交给了传输层的TCP协议传输的

3.4  HTTP协议的格式

3.4.1、请求格式

利用tcp模拟HTTP的服务端,去接受浏览器给服务端发送的请求

代码和之前的差不多,我们来看下工作线程的功能:

 我们模仿URL在网站上搜索:

 这时候显示网页无法正常工作是因为我们并没有给网页发任何消息

但是我们这时候能够发现,我们接收到了网页给我们发送的请求:下面就是请求的内容

 我们可以来分析一下这个到底是什么 ,分析一下HTTP的请求格式到底是什么:

 请求首行:    请求方法, 路径,   协议版本

3.4.2、响应格式

我们现在模拟server给浏览器发送一个响应:

 

我们在浏览器中给server发送一个请求,观察收到的响应是什么样的

 

3.5  HTTP的请求方法:

 请求方法重点的是GET  和  POST

GET:问服务端要抹些资源

 PST:给服务端提交数据

POST提交的数据在正文当中:

               例如:     username=xxx&&passwd=xxx

eg:假设我们要在某个网页进行登录,使用POST请求就会将我们的账号,密码放在请求正文中进行提交

面试题: GET方法和POST谁更安全

路径:

就是我们想要请求资源的路径

协议版本:

HTTP 0.9,HTTP  1.0,HTTP 1.1 ,HTTP 2.0(还在研发)

目前使用最多的就是HTTP1.1

3.6 分析请求体的内容:

请求体可以有很多条 key:value

 

3.7  HTTP的响应状态码

3.7.1 为什么需要状态码?

浏览器发起了一个HTTP请求,web服务器要告诉浏览器一个状态码(刚刚发起的请求是处理成功了还是失败了)

常见的测试码:

 

 

3.8 HTTP常见的header

  • Content-Length: 正文的长度
  • Content-Type : 正文的类型
  • location    : 重定向地址,一般搭配3 x x 使用
  • Set-Cookie :设置Http Cookie

Cookie 和 Session

Cookie:    浏览器保存的信息,一般是客户端的一些不敏感的信息,Cookie数据的来源自服务端

                   在浏览器保存。当下次在请求服务端的某个资源的时候,会携带上

Session:session 数据保存在服务端,一般描述当前会话信息(例如:浏览器的信息,浏览器访问到哪个页面等等)

Cookie:

应用场景:

为什么: 在访问百度的时候,第一次是需要进行登录的,但第二次的时候就不需要再进行登录了

就是因为在第一次登录的时候,登录成功的时候,百度服务器会给浏览器返回一个登录成功的的响应,在响应中就有一些Cookie信息,

下次再来访问的时候就会携带着这些Cookie信息,这些Cookie信息让服务端解析后就能知道是谁登录了。

我们也可以利用代码去实验一下Cookie的作用:

我们的服务端给浏览器返回一个Cookie信息

 当然:我们这里的Cookie信息设置的是很随意的,平时网站上的Cookie设计的时候是非常复杂的

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

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

相关文章

shiro权限框架介绍以及springboot整合shiro

What is Apache Shiro? Apache Shiro is a powerful and flexible open-source security framework that cleanly handles authentication, authorization, enterprise session management and cryptography. Apache Shiro’s first and foremost goal is to be easy to use…

LDO的dropout voltage

目录从一个设计错误谈起Dropout压降从芯片内部电路结构理解dropout压降MOS管 > 低dropout压降的LDO进一步降低dropout压降的方法在系统设计中,电源管理是不可或缺的,而LDO(线性稳压器)是电源管理器件中及其重要的一类器件。其应…

【JUC系列】线程变量ThreadLocal详解

ThreadLocal简介 ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访…

Java-基础-2.常用类

一:object 他是java中最基础,最核心的类。在java类中,为申明extends,默认 extends Object。方法。 3.1 toString方法 public String toString()方法,其返回值是 String 类型,描 述当前对象的有关信息。 3.…

Java中的多态及应用示例

Java中的多态及实现示例简介实现示例instance of(待补)补入Java多态 简介 【预留(业务逻辑)接口的抽象类】对象 new 【实现了该 预留(业务逻辑)接口】的【预留业务逻辑接口的抽象类的子类】的 对象&…

Java_Git:5. 在IntelliJ IDEA中使用git

目录 1 在Idea中配置git 2 将工程添加至git 2.1 创建工程 2.2 创建本地仓库 2.3 将工程添加至本地仓库 2.4 推送到远程 3 从远程仓库克隆 4 从服务端拉取代码 1 在Idea中配置git 安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找…

C语言学习笔记-数据类型

在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。 C数据可以从两方面宽泛的看:一、变量和常量;二、数据类型 从定义出发,变…

打造数字时代的“诺亚方舟”

玛雅人关于2012世界末日的预言除了提供给好莱坞灵感,拍摄了令人震撼的灾难片《2012》之外,似乎没有留下什么,人们已经渐渐淡忘了世界末日的说法。 但现实世界中却接二连三地在发生着重大灾难:2018年巴西国家博物馆大火&#xff0c…

(考研湖科大教书匠计算机网络)第三章数据链路层-第四节:可靠传输

专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:可靠传输基本概念(1)不可靠传输与可靠传输(2)分组丢失、分组失序和分组重复(3)可靠传输注意二&#xff1…

如何快速掌握Mybatis-Plus

目录 1. 什么是mybatis-plus 2. 初体验 3. 日志 4. 主键生成策略 6. 自动填充 7. 乐观锁 8. 条件查询 9. 分页查询 10. 逻辑删除 11. Wrapper 12. 在Mybatis-plus中使用xml配置 1. 什么是mybatis-plus MyBatis-Plus (opens new window)(简称 MP&#xff…

细说Linux虚拟化KVM-Qemu之virtio驱动

说明: KVM版本:5.9.1QEMU版本:5.0.0工具:Source Insight 3.5, Visio 1. 概述 前篇文章讲完了Qemu中如何来创建Virtio Device,本文将围绕Guest OS中的Virtio Driver来展开; 看一下Guest OS&…

发布自己的依赖(代码)到maven仓库2023

如果不想看文字可以看下面的视频 发布自己代码到maven中央仓库!第一步去sonatype注册登录,并发布issue https://issues.sonatype.org/secure/Dashboard.jspa > 去这个网站注册登录,用户名和密码会在后面发布jar包到中央仓库上用的到。 …

力扣刷题记录——748. 最短补全词、744. 寻找比目标字母大的最小字母、747. 至少是其他数字两倍的最大数

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——748. 最短补全词、744. 寻找比目标字母…

LinuxC—网络套接字

网络套接字socket 1 跨主机传输需要注意的问题 1.1 字节序问题 大端存储与小端存储 大端:低地址处方高字节小端:低地址处方低字节 主机字节序和网络字节序 若两个主机的字节序存储方式不同,直接传输的数据被对方接收后会就会使完全错误的&a…

Java8到Java17之间的主要特性描述

Java8到Java17之间的主要特性描述 文章目录Java8到Java17之间的主要特性描述Java8lambda表达式与Stream API方法引用(Method Reference)接口默认方法(Default Methods)类型注解(Type Annotations)可重复注解…

一文看懂YOLO v8

2023年,YOLO系列已经迭代到v8,v8与v5均出自U神,为了方便理解,我们将通过与v5对比来讲解v8。想了解v5的可以参考文章yolov5。 首先,回归一下yolov5: Backbone:CSPDarkNet结构,主要结…

结构体的内存对齐规则

结构体的内存 一、对齐规则 1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个成员在与结构体变量偏移量为0的地址处,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节&#xff0…

anaconda/python安装虚拟环境并安装特定版本的库文件

anaconda/python安装虚拟环境并安装特定版本的库文件 文章目录anaconda/python安装虚拟环境并安装特定版本的库文件python安装虚拟环境安装教程pycharm加载虚拟环境以及安装指定的库文件python安装虚拟环境 安装教程 安装主要的代码指令就是下面这一句: conda create -n Env…

金融风控10

深度学习与金融风控 反欺诈生命周期 第一层设备与网络 - 代理检测 - IDC检测 - 模拟器/虚拟机检测 - 木马检测 第二层用户行为 - 注册行为 - 登录行为 - 交易行为 - 事件行为 - 时间间隔异常 第三层业务频次 - 注册频次 - 登录频次 - 交易频次 - 地域频次 - …

计算机组成原理笔记记录(第二章)

次为笔记记录&#xff0c;原视频链接为B站视频链接&#xff0c;若有错误请指出&#xff0c;看到就会改正 进制 r进制数及其转换成十进制数 r^n就是第n位的维权,n<0就是小数部分的位权。 例子:1011 为十进制的时候:10111103010211011100 为二进制的时候 1011123022121120(10…