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

【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.xdnf.cn/news/1124353.html

相关文章:

  • rk3588平台USB 3.0 -OAK深度相机适配方法
  • 网络编程(TCP连接)
  • 前端同学,你能不能别再往后端传一个巨大的JSON了?
  • 7.14练习案例总结
  • UE5多人MOBA+GAS 22、创建技能图标UI,实现显示蓝耗,冷却,以及数字显示的倒数计时还有雷达显示的倒数计时
  • C语言:20250714笔记
  • OFDM系统中关于信号同步的STO估计与CFO估计的MATLAB仿真
  • 学习笔记——农作物遥感识别与大范围农作物类别制图的若干关键问题
  • 网络编程(套接字)
  • HTML应用指南:利用GET请求获取河南省胖东来超市门店位置信息
  • win10安装Elasticsearch
  • iOS高级开发工程师面试——RunTime
  • 深度解读virtio:Linux IO虚拟化核心机制
  • 一种用于医学图像分割的使用了多尺寸注意力Transformer的混合模型: HyTransMA
  • 记录自己在将python文件变成可访问库文件是碰到的问题
  • Linux的相关学习
  • JavaScript进阶篇——第一章 作用域与垃圾回收机制
  • 2025 R3CTF
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(4):语法+单词+復習+发音
  • JS基础知识(上)
  • 设计模式(行为型)-迭代器模式
  • H2 与高斯数据库兼容性解决方案:虚拟表与类型处理
  • 前端开发中的常见问题及解决方案
  • 群晖Nas - Docker(ContainerManager)上安装SVN Server和库权限设置问题
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(下)
  • Redis作缓存时存在的问题及其解决方案
  • mysql 与redis缓存一致性,延时双删 和先更新数据库,再删除缓存,哪个方案好
  • 《Librosa :一个专为音频信号处理和音乐分析设计的Python库》
  • Pythonic:Python 语言习惯和哲学的代码风格
  • Kubernetes 高级调度01