应用层协议http(无代码版)

目录

认识URL

urlencode 和 urldecode

HTTP 协议请求与响应格式

HTTP 的请求方法

GET 方法

POST 方法

HTTP 的状态码

HTTP 常见 Header

Location

关于 connection 报头

HTTP版本

远程连接服务器工具

setsockopt


我们来学习应用层协议http。

虽然我们说, 应用层协议是我们程序猿自己定的,但实际上, 已经有大佬们定义了一些现 成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其 中之一。 在互联网世界中,HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至 关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输 超文本(如 HTML 文档)。 HTTP 协议是客户端与服务器之间通信的基础。客户端通过 HTTP 协议向服务器发送 请求,服务器收到请求后处理并返回响应。HTTP 协议是一个无连接、无状态的协 议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

认识URL

这里说下,http或者https的区别就是https是支持加密的,更安全,最前面的叫做协议名称。

//后面就是访问路径+请求报头,请求报头的格式是kv的格式就是什么:什么,这些都是浏览器自动填写的,在url中/不一定是根目录,其实叫web根目录,二者不一定相同,就是这个/是根据当前请求位置而定的,像你要请求的网址如果在本地,那本地就是根目录,接着你可以接着往后输入根目录的其他内置的功能页,这些页比如/login/会直接被浏览器拼接在web根目录的后面,完善请求路径,然后路径所指向的内容就是请求正文(目标文件),这个正文可以是html,css,js等的页面,记住,浏览器会根据这个路径直接运行这个文件,也就是说直接上传一个html所在的路径就相当于用浏览器直接访问然后运行它,当然你也可以直接传一堆的html代码,浏览器直接可以做解析。所以我要通过url访问某个服务器的网页,就相当于请求某个资源,这些资源路径本质就是文件路径,这和Linux下是一样的。为什么没有体现端口号呢?成熟的应用层协议,往往和端口号是强关联的,这个port已经提前内置到浏览器里面了,人家本来就认识。我们把在服务器和客户端之间的浏览器这种东西叫做代理服务器

相当于转接端,它会将用户的请求转接给其后面的多个客户端,多个客户端进行处理后将响应返回给代理服务器然后呈现给用户。这很多个服务器就相当于多线程。所以我们平时用的百度等的各种app就是代理服务器不是真的位于最后的服务器。

代理服务器主要起到

我的数据给别人,别人的数据发送给我的本质是在做I/O,我们网上所有的行为都是在做I/O,我们通过url以及端口号进行通信,所以我们要获取资源首先要确定我们要的资源在哪台服务器上(网络,ip),在什么路径下(系统,路径)。

urlencode 和 urldecode

像 / ? : 等这样的字符, 已经被 url 当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义. 转义的规则如下: 将需要转码的字符转为 16 进制,然后从右到左,取 4 位(不足 4 位直接处理),每 2 位 做一位,前面加上%,编码成%XY 格式。urldecode 就是 urlencode 的逆过程。

对于特殊字符进行搜索时用的这种函数进行类似于序列化/反序列化的操作,这种处理方法是相当于在定协议了。这种函数的设计网上自己搜索一下就有了。

HTTP 协议请求与响应格式

http是应用层协议,是基于tcp协议的,所以http也是面向连接的,并且面向字节流的。

可以看到http的请求/响应都是结构化数据,一条url就是一条已经序列化的请求或者响应。对于http请求,首行: [方法] + [url] + [版本]中间用空格隔开,然后接上换行符/r/n,接着是请求报头,HTTP 的请求报头(HTTP Request Headers)在浏览器或客户端与服务器通信时,起着非常重要的作用。它们提供了关于客户端、请求内容、服务器期望的响应等关键信息,就是哈希表的结构,接着是空行,这个空行其实就是换行符,最后是请求正文,我们一个标准的http的request是需要有以上4个部分的,这个请求报头其实是可以没有的。正文(body)也可以是图片,文本,html等。像图片是二进制的格式是否能发送/读取图片完全取决于格式。

一下展示请求格式展示:

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

这个状态码和状态描述符都是人为规定的。

那怎么通信呢?首先用户向浏览器发送一个请求,内部发送的是一个请求结构体,然后经过序列化成一行字符串(请求行+请求报头+空行+请求正文),然后经由浏览器发送给服务端,服务端经过反序列化提取有效信息,然后返回资源,生成应答组件应答结构体,然后用相同的方式序列化,浏览器反序列化,通过浏览器读取呈现出来。只不过我们的服务端一般都是浏览器,由于请求/响应都是互相看得懂的,所以序列化/反序列化方式一致。这里响应报文的反序列化和读取是浏览器自己做的。点击客户端的连接也算发起一次请求不一定要输入url

浏览器并不是一个传统意义上的“代理服务器”,但它确实在客户端角色之外,承担了一些“代理服务器”类似的职责。

HTTP 的请求方法

正常来说,服务器不可能暴露出很多方法的,这个对服务器本身不好,一般只会暴露GET/POST方法。如果只是访问静态网页,那我们是不需要设置get/post方法的,请求正文正是我们要向服务器发送的东西,我们希望得到服务器相关的应答,就比如我们输入密码账号就希望服务器可以做出判断,这种就属于交互式的http。这种网站叫交互式网站。

GET 方法

用途:用于请求 URL 指定的资源。

示例:GET /index.html HTTP/1.1

特性:指定资源经服务器端解析后返回响应内容。

GET方式提交参数时,浏览器会自动将提交的参数作为请求报头kv形式的添加到url的后面 /xxx?k=v,请求报头和路径之间是用?隔开的。

POST 方法

用途:用于传输实体的主体,通常用于提交表单数据。

示例:POST /submit.cgi HTTP/1.1

特性:可以发送大量的数据给服务器,并且数据包含在请求体中。

POST提交参数时,浏览器会自动将其提交到请求正文中。由于GET是之间添加在url里面的,所以对信息没有起到保护作用,所以GET通常用来获取网页,POST通常用来上传数据。这两个本质都是用户向服务器发信息,GET传参通过url,POST通过body。

更多的请求方法都不是很重要了。如果没有指定请求方法默认是GET。

HTTP 的状态码

我们可以对不同的请求情况进行分析从而设置此次请求是否合法合理的状态码,然后设置状态码通过响应结构体返回。

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定 向), 504(Bad Gateway)

一下是常见的状态码和状态码描述

这种状态码描述以及码都是可以找到对应关系的,这种技术kv的关系,可以在网上找找看,不需要记。

HTTP 常见 Header

header就是请求/回响报头。

这些都可以在请求时填写,回应时自动根据请求的添加,所以请求报头和回应报头是基本一致的,都是可以设置的。

Content-Type指示请求体的内容类型,常用于 POST 或 PUT 请求。服务器返回的内容类型(如 HTML、JSON、XML 等)。主要是告诉服务器客户端发送的内容格式,帮助服务器正确解析请求体。像带了这个字段就不拍发送的正文被浏览器误解了,虽然浏览器有时候也可以自动识别正文内容。

Host用于填充主机地址,端口号对于浏览器来说不需要,必须包含在每个 HTTP/1.1 请求中,那搜索引擎是怎么知道域名(主机地址)的呢,因为每个服务器的地址域名都是保存在浏览器里面的,所以即使域名(地址)变更了搜索引擎也会内置这个变化。然后为了防止用户不知道新的域名是什么,浏览器会进行URL重定向,从旧的域名定向到新的域名,相当于访问旧的域名时直接指向跳转到了新的。

referer则相当于保留上此的访问记录。

User-Agent一般选择浏览器默认生成的。

Location

通常用于 重定向 响应,指示客户端应访问的 URL。如果在 HTTP 响应头中同时设置了 LocationHost,浏览器会根据 Location 头部的内容进行重定向,而不直接处理 Host 头部的变化。

HTTP 状态码 301(永久重定向)和 302(临时重定向)都依赖 Location 选项。以下 是关于两者依赖 Location 选项的详细说明: HTTP 状态码 301(永久重定向): • 当服务器返回 HTTP 301 状态码时,表示请求的资源已经被永久移动到新的位 置。 • 在这种情况下,服务器会在响应中添加一个 Location 头部,用于指定资源的新位 置。这个 Location 头部包含了新的 URL 地址,浏览器会自动重定向到该地址。

HTTP 状态码 302(临时重定向): • 当服务器返回 HTTP 302 状态码时,表示请求的资源临时被移动到新的位置。 • 同样地,服务器也会在响应中添加一个 Location 头部来指定资源的新位置。浏览 器会暂时使用新的 URL 进行后续的请求,但不会缓存这个重定向。

就是301是永久修改指向,302是临时的响应。

无论是 HTTP 301 还是 HTTP 302 重定向,都需要依赖 Location 选项来指定资 源的新位置。这个 Location 选项是一个标准的 HTTP 响应头部,用于告诉浏览器应该 将请求重定向到哪个新的 URL 地址。

关于 connection 报头

HTTP 中的 Connection 字段是 HTTP 报文头的一部分,它主要用于控制和管理客户 端与服务器之间的连接状态,也可以设置的。

• Connection: keep-alive:表示希望保持连接以复用 TCP 连接。(长链接)

• Connection: close:表示请求/响应完成后,应该关闭 TCP 连接。(短链接)

Connection 字段还用于管理持久连接(也称为长连接)。持久 连接允许客户端和服务器在请求/响应完成后不立即关闭 TCP 连接,以便在同一个连接 上发送多个请求和接收多个响应。 如果connect设置是keep-alive那就是长链接,位于长链接时TCP交互不会自动关闭,会一直保持开启状态,允许我们不断的发送请求,如果设置成close,就是短链接,在短链接下,我们只能交互一次,传输完后socket就自动关闭了,下次要传输时就得再次启动tcp服务。这个根一次访问量是没有关系的,重点差别是次数。

HTTP版本

填写格式,HTTP/x(x为版本号),这个x一般填写1.0,1.1,2.0

远程连接服务器工具

1。postman

Postman 是一个非常流行的 API 开发与测试工具,广泛用于 开发者测试人员 在开发 RESTful API 和其他 Web 服务时进行接口测试、调试和文档生成。Postman 提供了图形化界面,方便用户构造、发送 HTTP 请求,查看响应数据,以及对接口进行自动化测试。记得选免费版的

2。telnet

Telnet 是一种用于远程连接到另一台计算机的协议和工具,通常用于命令行界面(CLI)下的网络管理和故障排查。通过 Telnet,用户可以通过网络连接到远程计算机,执行命令,管理设备或访问服务。不过,Telnet 已经有些过时,很多现代网络中更推荐使用 SSH(Secure Shell)来代替,因为 SSH 更安全,使用加密技术保护数据传输。而 Telnet 的数据是以明文形式传输的,容易受到窃听。我觉得不是很好用,还是用上面那个吧,这个是属于Linux指令,直接我用过了。

setsockopt

setsockopt 函数是一个用于在套接字(socket)上设置选项的函数,它允许程序控制套接字的行为。这在网络编程中非常重要,尤其是在 TCP/IP 协议的套接字编程中。它通常用于设置一些影响套接字行为的参数,如缓冲区大小、超时、重试次数等。

如果服务器比客户端先退出了,就会出现短时间绑定同一个端口绑定不上的问题,当服务器退出时,TCP 连接会处于一个 TIME_WAIT 状态,等待足够的时间确保客户端收到确认消息。这段时间内,端口无法立即重新绑定给新的服务器实例,因为操作系统正在保护这个端口,以防止出现旧数据包的重传或延迟到达的情况。就是挥手的过程,我们后面再说。它的作用是配置套接字的行为,通过修改底层协议栈或操作系统对套接字的处理方式,来满足特定的需求。这个函数可以允许服务器快速重启,告别TIME_WAIT状态从而使同一个端口号被快速使用。

由于我们要处理的是端口的允许重用的问题所以选择SO_REUSEADDR(允许多个套接字绑定相同 IP + 端口(Linux 3.9+,用于多进程服务器),默认是开启的所以optval是1,就得到以下实现了:当然level也可以用IPPROTO_TCP,

int optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));  

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

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

相关文章

Cangjie 中的值类型与引用类型

1. 值类型和引用类型 1.1 值的存储方式 所有变量在底层实现中,都会关联一个具体的“值”,这个值可能存储在 内存地址 或 寄存器 中。 寄存器用于优化常用变量的访问速度。只有局部、小、频繁使用的变量才更可能被分配到寄存器中。实际行为由编译器根据…

使用el-input数字校验,输入汉字之后校验取消不掉

先说说复现方式 本来input是只能输入数字的&#xff0c;然后你不小心输入了汉字&#xff0c;触发校验了&#xff0c;然后这时候&#xff0c;你发现校验取消不掉了 就这样了 咋办啊&#xff0c;你一看校验没错啊&#xff0c;各种number啥的也写了,发现没问题啊 <el-inputv…

使用 Zabbix 监控 MySQL 存储空间和性能指标的完整实践指南

目录 引言 一、最终目标支持功能 二、监控方案设计 2.1 技术选型 2.2 设计思路 三、实现步骤 3.1 准备工作 3.11 创建 MySQL 监控账号 3.12 配置 .my.cnf 文件 3.2 编写统一脚本 3.3 配置 Zabbix Agent UserParameter 3.4 Zabbix 前端配置建议 四、总结 引言 MySQL …

多元素纳米颗粒:开启能源催化新纪元

在能源转型的浪潮中&#xff0c;纳米催化剂正成为推动能源技术突破的关键力量。多元素纳米颗粒&#xff08;Polyelemental Nanoparticles&#xff09;凭借其独特的元素协同效应&#xff0c;展现出在能源催化领域的巨大潜力。然而&#xff0c;合成这些复杂体系的纳米颗粒面临着诸…

铁路行业数字化应用建设方案

数字化转型面临的挑战 铁路行业正处于数字化转型的关键时期&#xff0c;铁路行业应用场景复杂&#xff0c;数据量巨大&#xff0c;传统信息化建设模式难以满足日益增长的业务需求。铁路企业亟需引入敏捷高效的数字化工具&#xff0c;加速推进业务创新&#xff0c;实现提质增效…

PlankAssembly 笔记 DeepWiki 正交视图三维重建

manycore-research/PlankAssembly | DeepWiki PlankAssembly项目原理 这个项目是一个基于深度学习的3D重建系统&#xff0c;其核心原理是从三个正交视图的工程图纸中重建出3D形状的结构化程序表示。 核心技术原理 1. 问题定义 PlankAssembly旨在从三个正交视图的工程图纸中…

分布式不同数据的一致性模型

1. 强一致性&#xff08;Strong Consistency&#xff09; 定义&#xff1a;所有节点在任何时间点看到的数据完全一致&#xff0c;读操作总是返回最近的写操作结果。特点&#xff1a; 写操作完成后&#xff0c;所有后续读操作都能立即看到更新。通常需要同步机制&#xff08;如…

C文件操作1

一、为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失 了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的保存&am…

Centos7.x内网环境Jenkins前端打包环境配置

Centos7.x内网环境Jenkins前端打包环境配置 参考地址&#xff1a; https://www.cnblogs.com/guangdelw/p/18763336 https://2048.csdn.net/682c1be8606a8318e857d687.html 前言&#xff1a;环境描述和目标 最近公司新接了一个项目&#xff0c;要求是&#xff1a;需要再桌面…

Hash 的工程优势: port range 匹配

昨天和朋友聊到 “如何匹配一个 port range”&#xff0c;觉得挺有意思&#xff0c;简单写篇散文。 回想起十多年前&#xff0c;我移植并优化了 nf-HiPAC&#xff0c;当时还看不上 ipset hash&#xff0c;后来大约七八年前&#xff0c;我又舔 nftables&#xff0c;因为用它可直…

kafka学习笔记(三、消费者Consumer使用教程——使用实例及及核心流程源码讲解)

1.核心概念与架构 1.1.消费者与消费者组 Kafka消费者是订阅主题&#xff08;Topic&#xff09;并拉取消息的客户端实例&#xff0c;其核心逻辑通过KafkaConsumer类实现。消费者组&#xff08;Consumer Group&#xff09;是由多个逻辑关联的消费者组成的集合。 核心规则 同一…

《java创世手记》---java基础篇(下)

《Java 创世手记 - 基础篇&#xff08;下&#xff09;》 第五章&#xff1a;契约与规范 —— 接口 (Interfaces) 与抽象类 (Abstract Classes) 造物主&#xff0c;在你日益繁荣的世界里&#xff0c;你发现仅仅依靠“继承”来构建“物种体系”有时会遇到一些限制。比如&#x…

气镇阀是什么?

01、阀门介绍&#xff1a; 油封机械真空泵的压缩室上开一小孔&#xff0c;并装上调节阀&#xff0c;当打开阀并调节入气量&#xff0c;转子转到某一位置&#xff0c;空气就通过此孔掺入压缩室以降低压缩比&#xff0c;从而使大部分蒸汽不致凝结而和掺入的气体一起被排除泵外起此…

计算机一次取数过程分析

计算机一次取数过程分析 1 取址过程 CPU由运算器和控制器组成&#xff0c;其中控制器中的程序计数器(PC)保存的是下一条指令的虚拟地址&#xff0c;经过内存管理单元(MMU)&#xff0c;将虚拟地址转换为物理地址&#xff0c;之后交给主存地址寄存器(MAR)&#xff0c;从主存中取…

从equals思考对“正念”的认知

正念 很多人聊正念&#xff0c;每个人有自己的解说&#xff0c;我听到最符合逻辑的一个说法&#xff1a;正念就是对抗惯性。 如果尝试过打坐或者冥想&#xff0c;就有一个说法叫正观&#xff0c;什么意义呢&#xff1f;就是说感受自己的呼吸&#xff0c;自己的心跳&#xff0c…

信息安全管理与评估2025山东卷

需要其他赛题解析的可联系博主

【leetcode】02.07. 链表相交

链表相交 题目代码1. 计算两个链表的长度2. 双指针 题目 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 代码 …

可视化与动画:构建沉浸式Vue应用的进阶实践

在现代Web应用中&#xff0c;高性能可视化和流畅动画已成为提升用户体验的核心要素。本节将深入探索Vue生态中的可视化与动画技术&#xff0c;分享专业级解决方案与最佳实践。 一、 Canvas高性能渲染体系 01、Konva.js流程图引擎深度优化 <template><div class"…

⼤模型驱动的DeepInsight Copilot在蚂蚁的技术实践

本文整理自潘兰天&#xff08;蚂蚁数据智能团队数据分析平台技术专家)在DA数智大会2025上海站的演讲实录。 本文围绕AI技术在数据分析领域的应用及DeepInsight Copilot产品展开。DeepInsight是一款蚂蚁长期深耕数据分析领域的BI产品&#xff0c;本文首先介绍了DeepInsight Copi…

Express教程【003】:Express获取查询参数

文章目录 3、获取URL中携带的查询参数3.1 参数形式&#xff1a;查询字符串3.2 参数形式&#xff1a;动态参数3.3 参数形式&#xff1a;Json数据 3、获取URL中携带的查询参数 3.1 参数形式&#xff1a;查询字符串 1️⃣通过req.query对象&#xff0c;可以访问到客户端通过查询…