网络协议(一)应用层(自定制协议、HTTP协议)

news2025/2/25 0:33:14

目录

应用层:负责应用程序之间的数据沟通

一、自定制协议(私有协议)

 二、HTTP协议

1)、请求行解析:GET /index.html  HTTP/1.1

第一部分:请求方法:多种多样,描述不同的请求目的

第二部分:URL

第三部分:协议版本

2)请求头部

3)空行

4)正文:

5)响应行

三、Cookie 与 Session

四、HTTPS协议


应用层:负责应用程序之间的数据沟通

        应用层协议其实是面向程序员的协议,因为应用程序是程序员自己写的,因此引用程序之间如何沟通是程序员定的

        程序员自己订立的程序沟通的数据格式约定,而针对某些场景,大佬们定制出的协议,大家觉得非常好,都用了这种协议,这种协议叫做知名协议(很有名)

一、自定制协议(私有协议)

程序员自己定义的程序沟通的数据格式约定完成序列化与反序列化的一种标准

        序列化:在网络传输或者数据的持久化存储时,将多个数据对象按照指定格式组织成为一个二进制数据进行传输或持久化的过程

        反序列化:对二进制数据传,按照指定格式进行解析,得到各个数据对象的过程

                程序员设计自定制协议时需要考虑哪些问题呢?

                ① 传输性能   定制一个协议,传输时的数据尽可能的短小,传输数据的时候才能尽可能的快

                ② 解析性能  传输多个数据对象的时候需要序列化,对方拿到数据后要进行反序列化,解析性能指的就是序列化和反序列化要足够快

                ③ 调试便捷性:讨论的更多的是对于程序员的可见性。可识别性

实例:网络计算器

        一个客户端进行俩个数据的运算,运算的过程并不是自己执行,而是将数据传输给服务器,让服务器运算、并返回结构

        数学运算: 11 + 22

        需要向服务器传输的数据对象有三个:第一个数字、第二个数字、运算符

        协议如何定制:

                方案一: 11 + 22字符串传输, 解析过程:获取数字字符,遇到其他字符截止,取出第一个数字,特殊字符为运算符,剩下的获取数字字符

                方案二:11;22;+;   逆波兰表达式,进行字符串分割,前俩个字符串转化为数字,最后为运算符

                方案三:二进制序列化:将三个对象的二级制数据分别放到一整块内存的指定位置,最终按照位置进程解析即可

 二、HTTP协议

互联网公司中使用最多的协议

        认识:HTTP——超文本传输协议(最早期就是为了传输web网页而设计的)

        特性:1、基于字符串明文传输的,调试便捷性高

                   2、是一种简单的请求-响应协议(早期是短链接--一次请求-响应结束就关闭)

                   3、基于TCP协议,传输安全可靠

书写一个简单的TCP访问,使用tcp响应发送以下内容

    std::cout<<"client say:["<<buf<<"]"<<std::endl;
    std::string body = "<html><body><h1>Hello wxl</h1><body></html>";
    buf.clear();
    buf = "HTTP/1.1 200 OK\r\n";
    buf += "Content-Length: ";
    buf += std::to_string(body.size());
    buf += "\r\n\r\n";
    buf += body;
    new_sock->Send(buf);

 通过云服务器端口进行访问

         格式:看下面这个数据传输示例

 GET 为方法; /index.htm 请求URI;  HTTP/1.1即为版本号

请求报文是由(请求行(首行)、请求头部、空行、正文)

 请求与响应报文模型

 一层一层剖析:

1)、请求行解析:GET /index.html  HTTP/1.1

        请求行中的内容分为三部分,以空格作为间隔,请求行以 \r\n结尾 (刚好就是一行数据)

第一部分:请求方法:多种多样,描述不同的请求目的

        GET:向服务器请求一个网页实体资源,请求中没有正文,但是也可以向服务器提交数据,提交的数据在URL中(安全性低,长度受限)

        POST:向服务器提交表单数据,请求中有正文

        HEAD:面试中经常会问到GET与HEAD的区别——目的与GET类似,但不同的是,实际的响应中不要实体资源,只要响应头部

使用fiddler抓包工具彻底搞懂Get与Host区别及使用http://t.csdn.cn/cHv3u

        PUT:更新服务器上的资源

        DELETE:删除服务器上的资源

        ……

第二部分:URL

URL:统一资源定位符,其实就是咱们所说的网址,功能就是定位网络上某一台主机上的某个资源

完整格式: http://username:password@domainname:port/s?wd=C%2B%2B#ch

特殊符号为间隔符(://   :   @    :     ?    #)

http:协议方案内容,当前大多都是https(对http协议的加密)

username:用户名;                password:密码

domainname:域名或者服务器IP地址        即就是(baidu.com 或者 14.215.177.39)

        域名:IP地址才是网络上一台主机的唯一标识,但是IP地址不容易记忆,因此大佬们就设计了域名系统,使用便于记忆的字符串作为域名,通过域名上网时,先通过域名系统进行域名解析,得到服务器的IP地址,然后通过iP地址进行访问

ping是一个十分基本但又十分重要的TCP/IP网络工具。它的作用主要为:

(1)通常用来检测网络的连通情况和测试网络速度;

(2)也可以根据域名得到相应主机的IP地址

(3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。
(4)因为具备以上功能,ping命令常常被黑客用来进行网络扫描和攻击。

 port:很多时候我们浏览网页,在网址中并没有看到端口,这是因为HTTP服务默认使用80端口,浏览器自动加上啦(HTTP 80端口,  https443端口     ssh 22 端口)

加上:443 进入百度网页

输入其他端口就会无法访问


 /s: 资源路径,以/作为起始, 明确的描述要请求的资源路径名。 / 表示根目录,但是实际上只是服务器上的相对子目录

左侧是给予客户端访问的相对路径:   右侧实际是服务端的文件存储位置

/index.html   --》    /home/dev/workspace/proiect/bit-http-v2/src/http/wwwroot/index.html

因为服务端不能把自己所有的文件权限都交给你,让你都能访问,这是不合理的,所以服务端给你一个相对地址,你只能访问这个相对地址以下目录内容文件,不能访问该层往上文件目录

不能让用户随意的访问服务器上的文件,只能访问相对根目录中的所有文件


wd=C%2B%2B&encode=utf8:  GET 请求提交给服务端的数据,学名叫做查询字符串

        查询字符串中的数据,是提交给服务器的数据,放在URL中,但是URL中很多特殊字符都是特殊含义的,但是提交的数据中也有了中特殊字符,就会造成二义性。因此,标准文档规定了,查询字符串中的特殊字符要进行编码(URL编码)

URLEncode:URL编码,对特殊字符进行转义,将特殊字符数据转为16进制的ASCII前缀%

                                        +  -》  %2b     +的ascii为43, 16进制就是2b

URLDecode:URL解码,在URL中遇到了%字符,则认为其后的俩个字符进行了url编码需要解码

                                         %2b  -》  2*16+11  ->  43    -》 +


ch: #之后的数据,叫做片段标识符,通常用于定位网页中的某个标签id,用于打开网页后,直接跳转到指定位置

第三部分:协议版本

描述了当前请求所使用的HTTP协议版本,不同的版本之间有功能支持力度上的差异
HTTP协议的版本迭代:HTTP/0.90.9版本,是一个不成熟的版本,只能使用GET获取网页,而且也没有当前的完善的协议格式

HTTP/1.01.0版本,完善了协议格式,新增支持了更多的请求方法:GET, HEAD,POST,并且有了缓存的控制,以及流媒体的传输

HTTP/1.11.1版本,是当前用的最多的版本,新增支持了更多的请求方法: PUT,DELETE ....针对当前的网络,觉得以前的通信效率太低了: 支持了长连接, 对缓存的管理更加精细了

 长连接与短连接

长连接旨在只通过进行一次TCP连接后可以进行多次的请求与响应的交互

减少了TCP连接的重复建立和断开造成的额外开销,减轻了服务器的负载

 长连接管线化传输(使得TCP建立一次连接后,可以同时并行发送多个请求,不需要一个接一个等待响应)

HTTP/1.1版本的迭代,更多的是对传输效率的改进

HTTP/2 这个版本是一个大跃进,因为并不向前兼容1.使用二进制传输,以前是名文字符串2.不用重复每次请求传输相同的头部字段3.长连接的一些改进,不需要按序响应,解决了队头阳塞问题4.主动推送功能的加入, 服务器响应数据的时候,可以主动响应依赖数据

2)请求头部

由一个一个的键值对组成(针对请求的一些附加描述,以及对于请求正文的描述)

        请求头部

                User-Agent(用户代理),Host(域名),Referer(当前网页的来源)

                例如,在www.google.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com,它的header 信息里就有: Referer=http://www.google.com

        正文头部(在请求与响应中都会出现,主要是对于正文的描述)

                Content-Length:129  用于描述正文长度

                Content-Type:application/json;charset=UTF-8 

                                          用于描述正文的数据类型(决定了如何解析正文)

        响应头部(只会在响应中出现的头部字段,描述响应)

                Location:http://baidu.com  用于描述重定向

        通用头部(在请求与响应中都会出现,属于对于本次通信或连接的一些描述)

                Connection:keep-alive/close:用于描述当前的连接使用的是短连接还是长连接

3)空行

\r\n   主要用于间隔HTTP头部与正文

主要是在实现解析时,先接受一个完整的HTTP协议头部,根据其中的Connect-Length确定正文长度,然后根据正文长度取出指定长度的正文,则刚好能够完整的获取到一条HTTP请求

4)正文:

提交给服务器的数据,类型格式通过Connect-Type描述

响应格式

响应行,响应头部,空行,正文

5)响应行

协议版本  状态码  状态码描述\r\n        HTTP/1.1 200 OK\r\n

        状态码:用于明确直接的向客户端表示本次请求的处理结果

1xx:继续请求或者协议切换        101--协议切换

2xx:请求已经成功处理        200--成功处理,   206--区间内容处理成功

3xx:请求重定向        301--永久重定向     302--临时重定向     303--see other     304--not modify

重定向: 把一个请求,重定向到其他链接。示例: 一个请求,要请求的资源,被移动到了其他位置。但是想要依然保持原链接有效

对于301永久重定向来说,当用户访问该网址后,在解析的响应行中含有301这个状态码,则将会在接下来的响应报头中解析Location关键字所对应信息,来告诉用户,我这个旧网址以后就不要访问,以后就访问我这个Location后面这个新的吧!

永久重定向适用于网站迁移、域名更换

对于302临时重定向来说,比如用户在提交购物车的订单之后,系统提示:即将为您跳转到XXX页面进行下一步信息确认……这样的称为临时重定向。

301、302、303这种要跟Location响应头字段搭配使用,Location字段用于指定的重定向的新链接; Location: http://baidu.com

4xx:表示客户端的错误;        400--bad request        404--Not Found 请求资源不存在

5xx:表示服务器的错误,        500--服务器内部错误;       

                                                  502--bad gateway,代理服务器连接错误

                                                  504-gateway timeout--代理请求超时

状态码:没有实际的功能性意义,给程序员看的,一个对于状态码的文字描述信息

响应头部:Connection、Location……

空行:间隔头部与正文

正文:响应给客户端的数据

三、Cookie 与 Session

对于HTTP协议,本身就是一种不保存状态、即无状态(stateless)协议,HTTP协议自身不对请求与响应之间的通信状态进行保存,协议对于发送过的请求或响应都不做持久化处理

无状态协议不需要服务端每次对客户端的信息进行收集与存储,那么对于服务端来说,这无疑减轻了服务端CPU及内存资源的消耗,可以更快的处理大量事物,确保协议的伸缩性,所以这种简单的协议模式更符合我们对于网页的通信需求,被应用于各种场景

那么也就是说我们在登录一个网站输入账号密码之后,刷新一下页面,还需要进行重新输入账号密码,这显然增加了大量的麻烦,那么可不可以有一种机制来帮助我们来存储这种状态信息呢?

Cookie:小饼干,cookie是一种信息缓存机制,将一些信息保存到客户端主机上,等下一次请求服务器的时候读取出来发送给服务器

有了Cookie机制,就可以很好地在多次通信中不断维护客户端的状态,但是这存在缺陷:不安全

session会话,就是在客户端与服务端的通信建立一个会话,将会话重要内容保存起来,会话内容

                      被保存在服务器上,通过Cookie只需要传递Session_id即可

                       这样做有个好处,不会再网络上传输用户的敏感信息

session会话机制,在Cookie的基础上,避免了敏感信息的传输,提高了安全性

Cookie与session的区别:

        1、Cookie是将信息保存在客户端上,每次通信将之前确认过得Cookie信息绑定一起发送过去

        2、session是将会话信息保存在服务端上,通过session_id进行Cookie传输,保护隐私性

四、HTTPS协议

在HTTP协议的基础上进行了一次加密,因此HTTPS不是一个新的协议,而是一个加密的HTTP协议

加密:SSL/TLS加密

为什么要加密:

        身份验证:

                第三方权威机构  +  CA认证

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

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

相关文章

吐血整理的网络工程师必懂的26个技术名词,自查一下看看自己知道多少 ?

在做网络工程师的工作时候&#xff0c;虽说那些晦涩难懂的英语以及技术名词很难记 比如我这个英语从不及格的小乐色&#xff0c;但是你会发现很多都会用到&#xff0c;所以多多少少还是要储备一些在脑子里&#xff0c;有点印象就OK了。查起来也方便不是&#xff01;那么今天咱…

基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计(二)

第 3 章 嵌入式软件系统移植本课题中嵌入式系统正常工作的前提是嵌入式软件系统完整且能正常工作&#xff0c; 以便为之后的软件开发提供一个能够正常工作的平台。引导程序 PMON 需要完成 内核引导&#xff0c;嵌入式 Linux 内核需要具有完备的功能且能够正常使用&#xff0c;根…

2023年 Android Studio Unable to find bundled Java version 解决方法

学习flutter过程中发现 Unable to find bundled Java version 错误搜索网上的解决方案都不对最后在 b站 https://www.bilibili.com/video/BV1S4411E7LY?p17&vd_sourced7cf0e2cd70b3cc57314d2efcb598c3d 教程的课件中找到了解决方哦 我的flutter版本 C:\Users\Ken>flu…

MQTT传输JSON数据实例

想跑一个用MQTT传输JSON的实例&#xff0c;上网找了一下开源代码&#xff0c;找到一个比较合适的&#xff1a;https://blog.csdn.net/ktigerhero3/article/details/107178252&#xff0c;程序源码直接用这个就可以&#xff0c;然后过程中需要进行一下环境的配置&#xff0c;本篇…

本地事务详解

1、事务的基本性质 数据库事务的几个特性&#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation) 和持久性(Durabilily)&#xff0c;简称就是 ACID&#xff1b;  原子性&#xff1a;一系列的操作整体不可拆分&#xff0c;要么同时成功&#x…

【Optional】告别丑陋判空,使用Optional类

一、概述 当项目中充斥着大量的、丑陋的判空语句&#xff0c;如下&#xff1a; if (user ! null) {Address address user.getAddress();if (address ! null) {Country country address.getCountry();if (country ! null) {String isocode country.getIsocode();if (isocod…

ksycopg2连接人大金仓数据库报错ksycopg2._ksycopg问题解决

一句话解决 ksycopg2目前仅支持python2.7/3.5&#xff0c;若版本不同&#xff0c;则会发生报错&#xff1a; 替换ksycopg2为psycopg2即可&#xff1a; pip install psycopg2 测试&#xff1a; import psycopg2conn psycopg2.connect(host"xxx.xxx.xxx.xxx", por…

average_precision_score()函数----计算过程与原理详解

最近在复现论文时发现作者使用了 sklearn.metrics 库中的 average_precision_score() 函数用来对分类模型进行评价。 看了很多博文都未明白其原理与作用&#xff0c;看了sklean官方文档也未明白&#xff0c;直至在google上找到这篇文章Evaluating Object Detection Models Usi…

【SpringBoot 自动配置】-EnableAutoConfiguration 注解

【SpringBoot 自动配置】-EnableAutoConfiguration 注解 续接上回 【Spring Boot 原理分析】- 自动配置 与【SpringBoot 自动配置】- Enable*注解 ,在前面笔者分析了在 SpringBoot 自动装配中的最重要的两个注解类&#xff0c; Condition 与 EnableAutoConfiguration 哎~说到…

从0到1搭建大数据平台之监控

大家好&#xff0c;我是脚丫先生 (o^^o) 大数据平台设计中&#xff0c;监控系统尤为重要。 它时刻关乎大数据开发人员的幸福感。 试想如果半夜三更&#xff0c;被电话吵醒解决集群故障问题&#xff0c;那是多么的痛苦&#xff01;&#xff01;&#xff01; 但是不加班是不可…

shiro总结

0x00 前言 此篇作为shiro总结篇&#xff0c;用于查漏补缺。 利用工具推荐&#xff1a;https://github.com/j1anFen/shiro_attack 0x01 反序列化 1.shiro 124 shiro 124&#xff0c;因为AES加密秘钥硬编码导致反序列化漏洞&#xff0c;124修复 Java 代码审计——shiro 1.2…

React 虚拟DOM的前世今生

引文 通过本文你将了解到 什么是虚拟DOM&#xff1f;虚拟DOM有什么优势&#xff1f;React的虚拟Dom是如何实现的&#xff1f;React是如何将虚拟Dom转变为真实Dom&#xff1f; 一、前言 要了解虚拟DOM&#xff0c;我们先明确一下DOM的概念。 根据MDN的说法&#xff1a; 文档…

Win10关闭自动更新

Win10关闭自动更新第一步&#xff1a;修改电脑系统时间第二步&#xff0c;设置自动更新时间第三步&#xff1a;再次修改系统时间为正确时间因为国内使用的操作系统&#xff0c;很多‍是非正版的系统&#xff0c;如果更新了系统&#xff0c;很容易造成电脑蓝屏&#xff0c;系统运…

90%的合同麻烦都源于签约“漏洞”,君子签电子签章闭坑指南来了!

业务签约中&#xff0c;有哪些合同麻烦呢&#xff1f;文字套路、印章造假、假冒代签、乱签漏签、信息泄露…事实上&#xff0c;这些签约“漏洞”都是源于签约风险排查不到位&#xff0c;管控不力而导致的&#xff0c;以至于后期履约中纠纷也不断。 君子签针对业务签约中的各类…

小黑子的python入门到入土:第二章

python零基础入门到入土2.0python系列第二章1. 三目运算符2. 运算符优先级3. if 语句3.1 简单的if语句3.2 if-else 语句3.3 if-elif-else 语句3.4 if 语句注意点4. pass 关键字5. 猜拳游戏案例6. while 循环语句7. while 练习8. range9. for...in 循环的使用10. break 和contin…

小林coding

一、图解网络 问大家&#xff0c;为什么要有TCP/Ip网络模型&#xff1f; 对于同一台设备上的进程通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;对于不同设备上的进程通信&#xff0c;就需要有网络通信&#xff0c;而设备是…

约束优化:PHR-ALM 增广拉格朗日函数法

文章目录约束优化&#xff1a;PHR-ALM 增广拉格朗日函数法等式约束非凸优化问题的PHR-ALM不等式约束非凸优化问题的PHR-ALM对于一般非凸优化问题的PHR-ALM参考文献约束优化&#xff1a;PHR-ALM 增广拉格朗日函数法 基础预备&#xff1a; 约束优化&#xff1a;约束优化的三种序…

【MyBatis】逆向工程与分页插件

11、MyBatis的逆向工程 11.1、创建逆向工程的步骤 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源…

公司技术团队为什么选择使用 YApi 作为 Api 管理平台?

在 2021 年 12 月份的时候我就推荐过一款软件程序员软件推荐&#xff1a;Apifox&#xff0c;当时体验了一下里面的功能确实很实用&#xff0c;但是当时公司有一套自己的 API 管理方案&#xff0c;所有 Apifox 暂时就没在内部使用。 直到最近要使用其他的 API 管理方案的时候才…

SAP ERP系统PP模块MRP运行参数说明

SAP/PP模块运行MRP(MD01/MD02)的界面有很多参数&#xff0c;这些参数的设置上线前由PP业务顾问根据实际业务需求定义好的&#xff0c;上线后一般不会轻易去调整&#xff0c;对于一般操作用户&#xff0c;按手册操作就行&#xff0c;不需要深入了解这些参数&#xff0c;但作为负…