【应用层】网络基础 -- HTTP协议

  • 再谈协议
  • HTTP协议
    • 认识URL
    • urlencode和urldecode
    • HTTP协议格式
    • HTTP的方法
    • HTTP的状态码
    • HTTP常见Header
    • HTTP周边会话保持

再谈协议

协议是一种 “约定”. socket api的接口,在读写数据时,都是按 “字符串” 的方式来发送接收的(tcp是以字节流的方式发送的,这里便与表述使用"字符串")

如果我们要传输一些"结构化的数据" 怎么办呢?
在这里插入图片描述

那么我们(TCP)在收到一个报文的时候,如何保证你收到了一个完整的报文?
在这里插入图片描述
tcp是面向字节流的,所以要明确报文和报文的边界

我们调用的所有的发送函数,根本就不是把数据发送到网络中,发送函数,本质是拷贝函数tcp发送的本质,其实就是将数据从c的发送缓冲区,拷贝到s的接受缓冲区:tcp是全双工的!


HTTP协议

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

认识URL

平时我们俗称的 “网址” 其实就是说的 URL
在这里插入图片描述
在这里插入图片描述

一切你在网络中看到的都是资源,这些资源文件在你服务器的磁盘上,拿到这些文件就需要Linux系统的路径结构,http就是通过http协议从服务器上拿下来对应的"资源"。因为文件资源种类特别多,http都能搞定,所以:http协议为超文本传输协议

不要认为在https的网址上没有看见端口号就真的没有端口号,只是一般而言端口号采用默认的443

urlencode和urldecode

/ ? :等这样的字符,已经被url当做特殊意义理解了,因此这些字符不能随意出现。

比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义。
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
在这里插入图片描述

“+” 被转义成了 “%2B”,urldecode就是urlencode的逆过程;

HTTP协议格式

HTTP请求:
在这里插入图片描述
在这里插入图片描述

  • 首行: [方法] + [url] + [版本]
  • Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • Body:空行后面的内容都是Body。Body允许为空字符串。如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;

细节:
1.请求和响应怎么保证应用层完整读取完毕了?

  • 我可以读取完整的一行
  • while(读取完整的一行) 一 所有的请求行+请求报头全部读完 一 直到空行
  • 我们能保证把报头读完,报头有一个属性: Content-Length: XXX正文长度
  • 解析出来内容长度,在根据内容长度,读取正文即可

2.请求和响应是怎么做到序列化和反序列化的?
http自己实现的,第一行+请求/响应报头,只要按照\r\n将字符串1->n即可。正文不用做

HTTP响应:

在这里插入图片描述

  • 首行:[版本号] + [状态码] + [状态码解释]
  • Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • Body:空行后面的内容都是Body。Body允许为空字符串。如果Body存在,则在Header中会有一个
  • Content-Length属性来标识Body的长度;如果服务器返回了一个html页面,那么html页面内容就是在body中。

HTTP的方法

在这里插入图片描述

其中最常用的就是GET方法和POST方法.

在这里插入图片描述
我们进行数据提交的时候,本质前端要通过form表单提交的,浏览器会自动将form表单中的内容转换成为GET/POST方法请求

  • GET方法:
    在这里插入图片描述
  • POST方法:
    在这里插入图片描述
    区别:
  • GET通过url传递参数,具体: http://ip:port/Xxx/YY?name=value&name2=value2
  • POST提交参数通过http请求的正文提交参数!
  • Post方法通过正文提交参数,所以一般用户看不到,私密性更好,私密性!=安全性,GET方法不私密
  • 无论是GET和POST方法,都不安全!要谈安全,必须加密!
  • 通过URL传递参数,注定了不能太大,但是POST方法,通过正文,正文可以很大,甚至可以是其他的东西

HTTP的状态码

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

什么是重定向?就是server告诉client,由客户端完成
在这里插入图片描述

  • 临时重定向:比如自动跳转到广告商
  • 永久重定向:比如一个公司以前用的域名更换了,但是用户不知道,所以就给旧域名一个重定向到新的域名,来防止用户找不到新地址。

HTTP常见Header

  • Content-Type: 数据类型(text/html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

长连接:
其实一张我们看到的网页,实际上可能由多种元素构成,所以一张完整的网页需要多次http请求

在这里插入图片描述
http网页中可能包含多个元素,http是基于tcp的,如果频繁发起http请求,那么就会有tcp面向链接的频繁创建链接的问题

长连接:建立好一条链接,获取一大份资源的时候,通过同一条链接完成
建立长连接需要client和server都要支持,才能建立,显示Connection: keep-alive表示支持长连接,显示Connection: close表示短链接

HTTP周边会话保持

HTTP无状态协议,是指协议对于交互性场景没有记忆能力。

比如点击一个纯的html网页,请求获取服务器的html文件资源时,每次http请求都会返回同样的信息,因为这个是没有交互的,每一次的请求都是相互独立的。在无交互场景中上面那样,当然也不会有太大的问题。但是对于涉及到动态交互的场景,就显得很尴尬了

会话保持严格意义不是http天然具备的,是后面使用发现需要的,http协议是无状态的。但是用户需要。因为用户查看新的网页是常规操作,如果发生网页跳转,那么新的页面也就无法识别是哪一个用户了,为了让用户一经登陆,可以在整个网站,按照自己的身份进行随意访问

在这里插入图片描述

cookie技术:

  • cookie文件:比如你登陆了一个网站,关闭浏览器,结束掉这个进程,你再次登陆这个浏览器的网站,你不需要重新登陆,这就是文件级别的。
  • cookie内存:跟上面例子相反,你没有关闭浏览器,你关闭这个网站重新打开不需要登陆,但是你关闭浏览器以后,再次打开这个浏览器的网站就需要重新登陆。(使用文件还是内存可以自行配置)

在这里插入图片描述

在这里插入图片描述

配合策略:比如异地登陆提醒等。
比如你个人的信息被黑客盗取走问题可能不是特别严重,但是如果企业的信息被盗取,问题就上升了几个档次。


如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀

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

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

相关文章

浏览器的事件循环

其实在我们电脑的操作系统中,每一个运行的程序都会由自己的进程(可能是一个,也可能有多个),浏览器就是一个程序,它的运行在操作系统中,拥有一组自己的进程(主进程,渲染进…

Python3 字符串

Python3 字符串 字符串是 Python 中最常用的数据类型。我们可以使用引号( 或 " )来创建字符串。 创建字符串很简单,只要为变量分配一个值即可。例如: var1 Hello World! var2 "Runoob" Python 访问字符串中的值 Python 不支持单字…

树莓派4B上安装Gitlab

参考连接: 树莓派上使用 GitLab 搭建专业 Git 服务 | 树莓派实验室 gitlab reconfigure 卡住 ruby_block[wait for redis service socket] action run_芹菜学长的博客-CSDN博客 以及用到了讯飞星火 系统版本信息 1.进入 giblab安装页面gitlab/gitlab-ce - Instal…

【深入探索Docker】:开启容器化时代的技术奇迹

深入探索Docker 深入探索Docker:开启容器化时代的技术奇迹前言1. 容器化:实现快速部署和可移植性2. 虚拟化:提高安全性和可靠性3. 映像:打包应用及依赖项的模板4. 网络管理:连接容器和主机5. 持久化数据:保…

软考:中级软件设计师:无线网,网络接入技术,ipv6

软考:中级软件设计师:无线网 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &#x…

Vue:插槽,与自定义事件

1.插槽slot <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <div id"app"><!-- <p>列表书籍</p>--> <!-- …

重新认识Android中的线程

线程的几种创建方式 new Thread&#xff1a;可复写Thread#run方法。也可以传递Runnable对象&#xff0c;更加灵活。缺点&#xff1a;缺乏统一管理&#xff0c;可能无限制新建线程&#xff0c;相互之间竞争&#xff0c;及可能占用过多系统的资源导致死机或oom。 new Thread(new…

什么是 API ?

一、API 的定义&#xff1a;数据共享模式定义 4 大种类 作为互联网从业人员&#xff0c;API 这个词我耳朵都听起茧子了&#xff0c;那么 API 究竟是什么呢&#xff1f; API 即应用程序接口&#xff08;API&#xff1a;Application Program Interface&#xff09;&#xff0c;…

Linux(基础IO、文件权限、Makefile)

目录 1、man 手册 1.1 汉化 1.2 具体使用 2、文件权限 2.1 权限理解 2.2 文件详细信息查询 2.3 权限更改 3、常用函数接口 3.1 open 3.2 read 3.3 write 3.4 close 3.5 函数使用示例 4、make与Makefile 4.1 make 与 Makefile区别 4.2 Makefile的编写 5、vim简…

阿里云服务器搭建FRP实现内网穿透-P2P

前言 在了解frp - p2p之前&#xff0c;请先了解阿里云服务器搭建FRP实现内网穿透-转发: 文章地址 1、什么是frp - p2p frp&#xff08;Fast Reverse Proxy&#xff09;是一个开源的反向代理工具&#xff0c;它提供了多种功能&#xff0c;包括端口映射、流量转发和内网穿透等。…

归并排序之从微观看递归

前言 这次&#xff0c;并不是具体讨论归并排序算法&#xff0c;而是利用归并排序算法&#xff0c;探讨一下递归。归并排序的特点在于连续使用了两次递归调用&#xff0c;这次我们将从微观上观察递归全过程&#xff0c;从本质上理解递归&#xff0c;如果能看完&#xff0c;你一…

Wlan——STA上线流程与802.11MAC帧讲解以及报文转发路径

目录 802.11MAC帧基本概念 802.11帧结构 802.11MAC帧的分类 管理帧 控制帧 数据帧 STA接入无线网络流程 信号扫描—管理帧 链路认证—管理帧 用户关联—管理帧 用户上线 不同802.11帧的转发路径 802.11MAC帧基本概念 802.11协议在802家族中的角色位置 其中802.3标…

【Git Bash】简明从零教学

目录 Git 的作用官网介绍简明概要 Git 下载链接Git 的初始配置配置用户初始化本地库 Git 状态查询Git 工作机制本地工作机制远端工作机制 Git 的本地管理操作add 将修改添加至暂存区commit 将暂存区提交至本地仓库日志查询版本穿梭 Git 分支查看分支创建与切换分支跨分支修改与…

leetcode500. 键盘行

【简单题】 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成。第三行由字符 "zxcvbnm&…

Nacos集群

需要与Nginx配合。 这是使用三个Nacos来搭建集群。 创建mysql数据库nacos。 配置Nacos 进入nacos的conf目录&#xff0c;修改配置文件cluster.conf.example&#xff0c;重命名为cluster.conf。 在cluster.conf文件的最后加上&#xff1a; #it is ip #example 127.0.0.1:8…

通俗理解DDPM到Stable Diffusion原理

代码1&#xff1a;stabel diffusion 代码库代码2&#xff1a;diffusers 代码库论文&#xff1a;High-Resolution Image Synthesis with Latent Diffusion Models模型权重&#xff1a;runwayml/stable-diffusion-v1-5 文章目录 1. DDPM的通俗理解1.1 DDPM的目的1.2 扩散过程1.3 …

测试框架pytest教程(6)钩子函数hook开发pytest插件

pytest hook 函数也叫钩子函数&#xff0c;pytest 提供了大量的钩子函数&#xff0c;可以在用例的不同生命周期自动调用。 比如&#xff0c;在测试用例收集阶段&#xff0c;可利用 hook 函数修改测试用例名称的编码。 pytest的hook是基于Python的插件系统实现的&#xff0c;使…

Tokenview再度升级:全新Web3开发者APIs数据服务体验!

Tokenview发布全新版本的区块链APIs和数据服务平台&#xff0c;为开发者打造更强大、更便捷的开发体验&#xff01; 此次升级&#xff0c;我们整合了开发者使用习惯以及Tokenview产品优势。我们深知对于开发者来说&#xff0c;时间是非常宝贵的&#xff0c;因此我们努力提供一…

蚂蚁 SOFAServerless 微服务新架构的探索与实践

赵真灵&#xff08;有济&#xff09; 蚂蚁集团技术专家 Serverless 和微服务领域专家曾负责基于 K8s Deployment 的应用发布运维平台建设、K8s 集群的 Node/pod 多级弹性伸缩与产品建设。当前主要负责应用架构演进和 Serverless 相关工作。同时也是 SOFAArk 社区的开发和维护者…

两款开箱即用的Live2d

目录 背景第一款&#xff1a;开箱即用的Live2d在vue项目中使用html页面使用在线预览依赖文件地址配置相关参数成员属性源码 模型下载 第二款&#xff1a;换装模型超多的Live2d在线预览代码示例源码 模型下载 背景 从第一次使用服务器建站已经三年多了&#xff0c;记得那是在2…