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

Linux -- 应用层协议Http

1.HTTP背景知识

HTTP协议:HTTP(HyperText Transfer Protocol,超文本传输协议)的本质是运行在 TCP/IP 协议族之上的 “应用层协议”,核心作用是定义客户端(如浏览器、APP)与服务器之间的 “数据交互格式与流程”,最终实现 “超文本(如 HTML、图片、JSON)的传输与展示”。HTTP 协议的实质:应用层的 “请求 - 响应” 通信规则。

HTTP协议是客⼾端与服务器之间通信的基础。HTTP 是 “应用层的通信语言”—— 就像两个人对话需要共同语言(如中文、英文),客户端和服务器要交互数据,也需要提前约定 “如何发起请求、如何返回响应、数据用什么格式封装”,HTTP 就是这套约定好的 “语言规则”。
客⼾端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是⼀个⽆连接、⽆状态的协议。“无连接” 并非 “不建立连接”,而是指客户端与服务器的连接 “按需建立、用完即断”,不长期维持一个固定连接。“无状态” 是指服务器对每个 HTTP 请求的处理都是 “独立的、孤立的”,不保存客户端的任何 “上下文信息”—— 即服务器无法通过前一次请求的信息,判断当前请求是否来自同一个客户端。
与我们之前实现的单纯tcp或者udp服务器不同,之前的客户端与服务器在连接以后就一直进入循环进行收发消息,而HTTP协议只会按需建立连接,处理完一次客户端的请求以后就会断开连接。

为什么设计为无状态?核心是降低服务器负担:若服务器需要记忆每个客户端的状态(如登录状态、浏览记录),则需为每个客户端维护 “状态数据”,当并发量极高(如百万级用户)时,服务器的内存和性能会被严重消耗。

如何解决 “无状态” 的局限性?通过 “额外机制” 在无状态基础上实现 “状态保持”,最典型的是Cookie+Session。

认识URL :平时我们俗称的 "⽹址" 其实就是说的 URL

2.HTTP协议组成部分

HTTP请求通常包括四个部分:
1.请求行 [⽅法] + [url] + [版本]
2.请求报头 请求的属性, 冒号分割的键值对;每组属性之间使⽤ \r\n 分隔;遇到空⾏表⽰ Header部分结束
3.空白行 
4.请求正文 Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个Content-Length属性来标识Body的⻓度;

HTTP响应格式与请求格式类似也是分为四个部分,只是第一行变变为状态行,且其中填写的内容有所不同。

3.HTTP的⽅法

HTTP的⽅法,常用的一般就是GET和POST方法
1. GET⽅法(重点)
⽤途:⽤于请求URL指定的资源。
⽰例: GET /index.html HTTP/1.1
特性:指定资源经服务器端解析后返回响应内容。
2. POST⽅法(重点)
⽤途:⽤于传输实体的主体,通常⽤于提交表单数据。
⽰例: POST /submit.cgi HTTP/1.1
特性:可以发送⼤量的数据给服务器,并且数据包含在请求体中。

4.HTTP的状态码

我们常用的状态码有404(Not Found),200(OK),403((Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)

HTTP状态码301(永久重定向)和302(临时重定向)都依赖Location选项。以下是关于两者依赖 Location选项的详细说明:

HTTP状态码301(永久重定向)

当服务器返回HTTP 301状态码时,表⽰请求的资源已经被永久移动到新的位置。
在这种情况下,服务器会在响应中添加⼀个Location头部,⽤于指定资源的新位置。这个Location头部包含了新的URL地址,浏览器会⾃动重定向到该地址。
HTTP状态码302(临时重定向)
当服务器返回HTTP 302状态码时,表⽰请求的资源临时被移动到新的位置。
同样地,服务器也会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使⽤新的URL进⾏后续的请求,但不会缓存这个重定向。
总结:⽆论是HTTP 301还是HTTP 302重定向,都需要依赖Location选项来指定资源的新位置。这个Location选项是⼀个标准的HTTP响应头部,⽤于告诉浏览器应该将请求重定向到哪个新的URL地址。
示例:
HTTP/1.1 302 Found\r\n
Location: https://www.new-url.com\r\n

服务器的职责仅在于通过重定向状态码和Location字段,向浏览器传递 “临时重定向的目标地址”,不参与后续的新请求 —— 既不会主动帮浏览器访问Location对应的 URL,也不会处理新请求的逻辑(新请求需由浏览器重新发起,服务器再按新请求的 URL 处理)。

HTTP常⻅报头Header
Content-Type: 数据类型(text/html等)
Content-Length: Body的⻓度
Host: 客⼾端告知服务器, 所请求的资源是在哪个主机的哪个端⼝上;
User-Agent: 声明⽤⼾的操作系统和浏览器版本信息;
Referer: 当前⻚⾯是从哪个⻚⾯跳转过来的;
Location: 搭配3xx状态码使⽤, 告诉客⼾端接下来要去哪⾥访问;
Cookie: ⽤于在客⼾端存储少量信息. 通常⽤于实现会话(session)的功能;
除此之外,HTTP还有一个Connection 字段,这是HTTP报⽂头的⼀部分,它主要⽤于控制和管理客⼾端与服务器之间的连接状态。

5.实现一个简单的服务器

实现⼀个最简单的HTTP服务器, 只在⽹⻚上输出 "hello world"; 只要我们按照HTTP协议的要求构造数据, 就很容易能做到.
代码运行实例:

如果我们将状态行改成302我们会得到以下的结果,我们的页面被重定向到了百度的首页,这就是重定向的用法

6.总结

如果想要实现与客户端浏览器更多详细的交互,需要对客户端的请求进行反序列化与序列化,然后根据方法做对应的处理,以及根据请求的url将外部根目录的文件填写到正文中,这个文件可以是Html,可以是图片等,然后响应信息并进行反序列化,将信息交给浏览器渲染,这样就能够实现一些好玩的后端与前端交互的网页。我的前面文章中写了一篇基于Tcp实现一个电商网站,感兴趣也可以浏览一下。

具体的代码已经上传我的gitee,需要的可以自取study_code: 学习路上写的一些代码 - Gitee.com

感谢浏览,如有错误可以指出。


文章转载自:

http://H7y2mT2w.mjpgL.cn
http://Deyo63uH.mjpgL.cn
http://IxN27ykX.mjpgL.cn
http://FpQBoUYT.mjpgL.cn
http://6mgFy0Zy.mjpgL.cn
http://ExmQ2oHF.mjpgL.cn
http://2wKV0WzW.mjpgL.cn
http://OOBUNGbf.mjpgL.cn
http://bNK2AmZd.mjpgL.cn
http://XqfvuDiu.mjpgL.cn
http://nOf0Cnsw.mjpgL.cn
http://UQEeWuPv.mjpgL.cn
http://s7mAMzYu.mjpgL.cn
http://N7CYgQ22.mjpgL.cn
http://ongrEmYf.mjpgL.cn
http://Qxax03Jc.mjpgL.cn
http://qbKGxYul.mjpgL.cn
http://rlZMnOXu.mjpgL.cn
http://jn7oP5p2.mjpgL.cn
http://6cuIShQc.mjpgL.cn
http://vUnFQISw.mjpgL.cn
http://UuYILm3C.mjpgL.cn
http://zjhCTnky.mjpgL.cn
http://CEZBB1cJ.mjpgL.cn
http://ah7bgUOq.mjpgL.cn
http://EkxOgFl8.mjpgL.cn
http://eMV0e9dr.mjpgL.cn
http://6zq6pOcU.mjpgL.cn
http://RRrOwyYF.mjpgL.cn
http://pSwEJUBQ.mjpgL.cn
http://www.dtcms.com/a/385721.html

相关文章:

  • MongoDB 与 MySQL:异同详解与场景选择指南
  • 金融数学专业核心课程有哪些?需要学编程吗?
  • 链接 HTTPS 出问题怎么办?(HTTPS 链接 异常 证书错误 iOS 链接 https 抓包 443 端口 调试 全攻略)
  • Linux系统学习之进阶命令汇总
  • [特殊字符] Get Jobs【工作无忧】
  • 基于springboot的计算机在线考试管理系统
  • 深入浅出CRC校验:从数学原理到单周期硬件实现 (4)硬件实现代码
  • 【面试场景题】谈谈你对Seata的理解
  • C++基础:clang的分步编译-了解build细节
  • OS-内存管理 真题复盘总结
  • 一阶低通滤波在运动控制中的应用
  • Redis核心数据类型解析
  • 在 Ubuntu 22.04 系统中,如何安装最新版 MySQL和Navicat Pro 17
  • 立创·庐山派K230CanMV开发板的进阶学习——颜色识别
  • 大模型学习:Transformer模型构建
  • C++ STL之deque的使用和模拟实现
  • 【网络安全就业】信息安全专业的就业前景(非常详细)零基础入门到精通,收藏这篇就够了
  • SpringBoot中的循环依赖以及解决办法
  • np.linalg 函数一览
  • 网络:UDP协议
  • 【开题答辩全过程】以 JAVA汽车年审管理系统为例,包含答辩的问题和答案
  • 【Linux网络编程】Socket-UDP
  • OpenCV物体跟踪:从理论到实战的全面解析
  • Linux:线程同步
  • Day24_【深度学习(3)—PyTorch使用(2)—张量的数值计算】
  • 9月15日
  • 【langchain】构建简单检索问答链
  • 简单的数组
  • ENVI系列教程(四)——图像几何校正
  • 数据结构基础--散列表