当前位置: 首页 > news >正文

应用层协议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));  

相关文章:

  • U 盘数据恢复全攻略
  • Linux下使用socat将TCP服务转为虚拟串口设备
  • LLM+RAG:文本分块处理策略
  • ProfiNet转MODBUSTCP网关模块的实时性保障Logix5000控制器与AltivarProcess变频器同步控制方案
  • 基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)
  • TestStand API编程:SequenceFile 基本操作
  • 【C/C++】线程局部存储:原理与应用详解
  • React从基础入门到高级实战:React 核心技术 - React 与 TypeScript:构建类型安全的应用
  • 解析极限编程-拥抱变化(第2版)笔记
  • USBIP是什么?技术实现方式与应用场景全解
  • Express+MySQL后台开发实战:从模块化到错误处理的全链路解析
  • 洛谷P1165—— 日志分析
  • python打卡day38@浙大疏锦行
  • 博图SCL基础知识-表达式及赋值运算
  • 嵌入式使用snprintf(str, sizeof(str), “ULV: %.3fV“,values);后出现小数部分丢失的错误以及解决方案
  • 数据要素配置如何驱动城市经济韧性的多元模式
  • 第四十五篇-Tesla P40+Qwen3-30B-A3B部署与测试
  • 电路图识图基础知识-主电路和辅助电路(七)
  • 网站资源加载出现401错误
  • 开源项目asp本地编译安装教程(ubuntu操作系统)
  • 怎么做网站代购/搜索引擎地址
  • 在哪个网站上找国外客户做外贸/南昌seo
  • 企业网站建设太原网站建设/2022近期时事热点素材摘抄
  • 做阿里巴巴怎么进公司网站/2022年搜索引擎优化指南
  • 微网站自己怎么做的/快速排名优化推广手机
  • 做微课的网站有哪些/百度账号找回