【Linux网络】:HTTP(应用层协议)

 

目录

一、HTTP

1、URL

2、协议格式

3、请求方法

4、状态码

5、Header信息

6、会话保持Cookie

7、长连接

8、简易版HTTP服务器代码

一、HTTP

我们在编写网络通信代码时,我们可以自己进行协议的定制,但实际有很多优秀的工程师早就写出了许多非常成熟且好用的应用层协议来供我们直接参考使用,其中最典型的就是 HTTP(超文本传输协议),它是一个简单的请求-响应协议,通常运行在 TCP 之上。所谓应用层协议,就是程序员基于socket接口之上编写的具体逻辑,做的很多工作都是和文本处理相关的(协议分析与处理),HTTP 协议具有大量的文本分析和协议处理。

1、URL

URL 就是我们平时俗称的 “网址”。在全球范围内,只要找到 url 就能访问该资源。

http://server ip[:80]/a/b/c/d/e.html------------https://server ip[:80]/a/b/c/d/e.html

要访问一个服务器,ip 地址和端口号是必须要有的,有 ip 地址就可以找到这台唯一的机器,能够访问到端口号就可以找到给我们提供服务对应端口的进程,可是上图在 url 中并没有体现出来,是因为一般在请求时,端口号是被省略的(在请求网络服务时,对应的端口号都是众所周知的(客户端知道))。

使用浏览器访问 URL(统一资源定位符):通过域名(server ip)找到唯一的一台网络主机,而域名后面就是该机器提供服务的进程,接着是客户想访问的资源路径,通过资源路径找到想要的文件名,可能是图片或者文本,把资源(客户想访问的资源路径 + 客户要的文件名)返回给浏览器。

HTTP 的本质就是通过 HTTP 协议从服务端拿下文件资源,而因为文件资源的种类特别多,HTTP  都能搞定,所以叫做超文本传输协议

客户端和服务器通过urlencode 和 urldecode,来翻译URL的内容。实际当服务器拿到对应的 URL 后,也需要对编码后的参数进行解码,此时服务器才能拿到你想要传递的参数,解码实际就是编码的逆过程。

2、协议格式

HTTP 是基于请求和响应的应用层服务,底层采用 TCP,作为客户端可以向服务器发起 request,服务器收到这个 request 之后,会对这个 request 做数据分析,得出你想要访问什么资源,然后服务器再构建 response,完成这一次 HTTP 的请求,返回响应。由于 HTTP 是基于请求和响应的应用层访问,所以必须要知道 HTTP 对应的请求格式和响应格式。

2.1、HTTP请求

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

2.2、HTTP响应

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

2.3、如何保证请求和响应被应用层完整读取?

HTTP 所有请求字段都是按行为单位的字符串,比如说对于 HTTP 请求,我们使用 while 循环按行读取,直到遇到空行为止,这样就可以保证把请求行和请求报头读完。而报头的 key: val 结构就有一个属性是 Content-Length: XXX,它表示的是正文的长度,由此,正文的也能完整读取了。

2.4、如果现在我们想获得name的key值,如何把数据从字符串中反序列化?

①对于报头部分,其实请求 / 响应报头布置包含 name: val 信息,后边还有字符串分隔符:name: val\r\n,序列化直接发送就行,想要反序列化就可以按照 \r\n 来按行提取,所以 HTTP 报头是用特殊字符进行信息分离。
②对于正文部分,不需要做处理,如果需要的话,可以设计自定义序列化与反序列化方案。

3、请求方法

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

①GET:通过 URL 传递参数,要提交的参数拼接到到 url 的后边。
②POST:通过请求正文提交参数。

因为 POST 方法是通过正文传参的,所以一般不会回显,用户看不到,私密性(不等于安全性,加解密才具有安全性)更好,而 GET 方法会回显输入的私密信息,不够私密。但无论是 GET 还是 POST 方法都不安全(HTTP 请求都是可以被抓到的,想要安全必须加密,就得使用 HTTPS 协议)。一般情况下,传递大字段或者较为私密的数据的时候使用 POST 方法,其他的使用 GET 方法。

4、状态码

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

重定向状态码:

通过各种方法将各种网络请求重新定个方向转到其它位置(跳转网站),此时这个服务器相当于提供了一个引路的服务。当我们发送请求给服务端,服务端返回一个新的 url,状态码是 3,浏览器自动用这个新的 url 继续发送请求给新的地址,所以重定向是由客户端完成的。而重定向又分为临时重定向和永久重定向,其中状态码 301(Moved Permanently)表示的就是永久重定向,而状态码 302(Found)和 307(Temporary Redirect)表示的是临时重定向。

临时重定向和永久重定向本质是影响客户端的标签,决定客户端是否需要更新目标地址。

① 如果某个网站是永久重定向,那么第一次访问该网站时由浏览器帮你进行重定向,但后续再访问该网站时就不需要浏览器再进行重定向了,此时访问的就是重定向后的网站。
② 如果某个网站是临时重定向,那么每次访问该网站时如果需要进行重定向,都需要浏览器来帮我们完成重定向跳转到目标网站。

5、Header信息

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

6、会话保持Cookie

HTTP 的特征:1、简单快捷    2、无连接    3、无状态

HTTP 实际上是一种无状态协议,每次请求并不会记录它历史上请求过什么。HTTP 的每次请求/响应之间是没有任何关系的,但在使用浏览器时发现并不是这样的,比如在登录一次 CSDN 后,就算把 CSDN 网站关闭甚至重启电脑,当再次打开 CSDN 网站时,CSDN 并没有要求我们再次输入账号和密码,这实际上是通过 Cookie 技术实现的,点击浏览器当中锁的标志就可以看到对应网站的各种 Cookie 数据。

这些 cookie 数据实际都是对应的服务器方写的,如果你将对应的某些 cookie 删除,那么此时可能就需要你重新进行登录认证了,因为你删除的可能正好就是你登录时所设置的 cookie 信息。会话保持不是 HTTP 协议天然具备的特点,而是浏览器为了满足用户的使用需求,做了相应的工作。

6.1、Cookie技术的设计

用户在第一次输入账号和密码时,浏览器会进行保存(Cookie),近期再次访问同一个网站(发送 http 请求),浏览器会自动将用户信息添加到报头中推送给服务器。这样只要用户首次输入密码,一段时间内将不用再做登录操作了。Cookie 又分为 Cookie 内存和 Cookie 文件。

6.2、Cookie的内存和文件

Cookie 就是在浏览器当中的一个小文件,文件里记录的就是用户的私有信息。Cookie 文件可以分为两种,一种是内存级别的 Cookie 文件,另一种是文件级别的 Cookie 文件。

① 将浏览器关掉后再打开,访问之前登录过的网站,如果需要你重新输入账号和密码,说明你之前登录时浏览器当中保存的 Cookie 信息是内存级别的。
② 将浏览器关掉甚至将电脑重启再打开,访问之前登录过的网站,如果不需要你重新输入账户和密码,说明你之前登录时浏览器当中保存的 Cookie 信息是文件级别的(真实的文件,保存在磁盘,进程退出也不影响)。

6.3、Cookie安全问题

本地的 Cookie 如果被不法分子拿到了,那么此时这个非法用户就可以用我们的 Cookie 信息,以我们的身份去访问我们曾经访问过的网站,将这种现象称为 Cookie 被盗取了。

为了保证安全,我们可以把信息保存在服务端,在服务端形成一个文件:Session 文件,而因为有很多 Session 文件,所以给每个文件一个名字:Session ID。并将其返回给浏览器,浏览器存到 Cookie 的其实是 Session id。接下来我们把 Session ID 放到请求中,然后发送到服务端,在服务端获取登录信息(鉴权)。目前只保证了用户信息的泄漏,接下来只能靠服务端的安全策略保障安全,例如账号被异地登录了,服务端察觉后只要让 session id 失效即可,这样异地登录就会让用户重新验证账号密码或手机或人脸信息(尽可能确保是本人),一定程度上保障了信息的安全。

7、长连接

HTTP 请求是基于 TCP 协议的,而 TCP 是需要进行连接的。对于一个完整的网页来说,可能包含多种元素资源,那就需要发起多次 Connect。为了减少连接次数,需要客户端和服务器均支持长链接,建立一条连接,传输完后不断开连接,一直传递资源,不用频繁创建连接。如果是短连接请求了一份资源后就会自动关闭连接。

客户端和服务端怎么知道是否是长连接呢?

在报头信息中会有 Connection 字段:
Connection: keep-alive    //支持长连接
Connection: close         //短连接

8、简易版HTTP服务器代码

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

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

相关文章

C++-linux 7.文件IO(三)文件元数据与 C 标准库文件操作

文件 IO 进阶:文件元数据与 C 标准库文件操作 在 Linux 系统中,文件操作不仅涉及数据的读写,还包括对文件元数据的管理和高层库函数的使用。本文将从文件系统的底层存储机制(inode 与 dentry)讲起,详细解析…

WordPress Ads Pro Plugin本地文件包含漏洞(CVE-2025-4380)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。 前言:我们建立了一个更多,更全的知识库。每日追踪最新的安全漏洞,追中25HW情报。 更多详情: http…

从爆红到跑路:AI明星Manus为何仅用四个月就“抛弃”了中国?

目录 前言 一、资本的“无形之手”:7500万美元融资背后的“投名状” 二、技术的双重困境:算力封锁与“应用层”的原罪 三、战略的错判:一场与中国市场的“双向奔赴”失败 四、事件的启示:当“出海”变成“出走” &#x1f3a…

CCF-GESP 等级考试 2025年6月认证Python三级真题解析

1 单选题(每题 2 分,共 30 分)第1题 2025年4月19日在北京举行了一场颇为瞩目的人形机器人半程马拉松赛。比赛期间,跑动着的机器人会利用 身上安装的多个传感器所反馈的数据来调整姿态、保持平衡等,那么这类传感器类似于…

16.使用ResNet网络进行Fashion-Mnist分类

16.1 ResNet网络结构设计################################################################################################################ #ResNet ################################################################################################################…

C# 结构体 和 类 的区别

✅ 结构体(struct)是值类型(Value Type)和类(class)不同,结构体在赋值和传参时是复制值本身,而不是引用地址。✅ 一、结构体的基本使用示例:using System;struct Point {…

MacBook Air M4 安装 VMware Fusion Pro

VMware Fusion Pro已经对消费者免费了,在Windows系统上的安装和使用教程比较多,Mac上竟然没多少,还充斥着大量的广告以及付费软件,所以趁着今天要安装虚拟机,记录一下完整过程。 1,注册博通账号与登录 首…

vue的优缺点

Vue的优点轻量级框架 Vue的核心库仅关注视图层,体积小巧(约20KB),加载速度快,适合快速开发小型到中型项目。易于上手 文档清晰且中文友好,API设计简洁,学习曲线平缓。熟悉HTML、CSS和JavaScript…

闲庭信步使用图像验证平台加速FPGA的开发:第七课——获取RAW图像

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程…

在前端项目中是如何解决跨域的

📘 前端项目中跨域问题及解决方式详解(Vite 项目)一、🌐 什么是跨域?跨域(Cross-Origin) 指的是在浏览器中,前端页面与服务器之间的协议、域名或端口不一致而引发的安全限制。✅ 浏览…

代码审计-Struts2漏洞分析

一、Struts2介绍 Struts2 是一个基于 MVC(Model-View-Controller) 设计模式的开源 Java Web 应用框架,由 Apache 软件基金会维护。它是 Struts1 和 WebWork 框架的整合产物,以 WebWork 为核心,通过拦截器机制实现业务逻…

三、神经网络——网络优化方法

三、网络优化方法 1.梯度下降算法梯段下降算法是一种寻找使损失函数最小化的方法,从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向,所以有WijnewWijold−η∂E∂WijW_{ij}^{new} …

HTML/JOSN复习总结

HTML 基础 什么是 HTML? 1.HTML是一门语言,所有的网页都是用HTML这门语言编写出来的 2.HTML(HyperText Markup Language):超文本标记语言。 >超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内…

Golang中的内置类型

A. int B. string C. struct D. array 首先,内置类型是指不需要引入任何关于这些数据类型的包,就可以引用的数据类型。那么,内置类型主要包括基本类型,复合类型,控制并发,高级抽象,特殊类型。…

通过命名空间引用了 Application 类,php不会自动包含路径文件吗?

示例代码:报错提示找不到Application类 use mvc\core\Application;$app new Application(); // 定义路由 $app->get(/, HomeControllerindex); $app->get(/user, UserControllershow); $app->post(/user, UserControllercreate);// 运行应用 $app->run…

PlantUML 基础使用技术文档

目录 摘要 1. 什么是 PlantUML 2. 安装与环境配置 2.1 本地使用 2.2 在线使用 3. 基本语法 3.1 示例:系统架构图 3.2 常用元素 4. 渲染方式 4.1 VSCode 4.2 在线渲染 4.3 生成图片 5. 推荐实践 6. 常见图类型 7. 进阶功能 8. 典型应用场景 摘要 Pl…

Android Notification 通过增加addAction 跳转回Service重新执行逻辑

1.场景描述在App内升级过程中,apk下载过程中网络波动导致连接超时,下载失败后Service生命周期结束。前台通知也被清除。2.解决思路在通知栏中增加重试按钮重启下载服务。3.代码NotificationManager mNotificationManager (NotificationManager) getSy…

带货视频评论的用户洞察 科大讯飞AI算法赛 Datawhale AI夏令营

赛题 2025 iFLYTEK AI开发者大赛https://challenge.xfyun.cn/topic/info?typevideo-comment-insight 一、赛事背景 在电商直播爆发式增长的数字化浪潮下,短视频平台积累了海量带货视频及用户互动数据。这些数据不仅是消费者对商品体验的直接反馈,更蕴…

JAVA生成PDF(itextpdf)

java生成PDF有多种方式&#xff0c;比如itextpdf、 Apache PDFBox、Flying Saucer (XHTMLRenderer)、 OpenPDF等。今天要介绍的是itextpdf&#xff0c;及在开发过程中处理的问题。1. 引入POM<!--PDF导出POM--><dependency><groupId>com.itextpdf</groupId…

[爬虫知识] 深入理解多进程/多线程/协程的异步逻辑

相关爬虫实战案例&#xff1a;[爬虫实战] 多进程/多线程/协程-异步爬取豆瓣Top250 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 逆向知识点合集 前言&#xff1a; 面对海量的目标数据&#xff0c;传统单线程、同步的爬取方式往往效率低下&#x…