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

Linux——HTTP协议理解

1. 初步认识HTTP协议

全称:HyperText Transfer Protocol , 超文本传输协议,属于应用层协议

:图片、音乐、视频都是超文本

网址含义

 域名:对于用户而言,是要访问哪一家公司,本质是访问ip,访问服务器

:为什么要用域名而不直接用ip?

:为了更好的可读性

注1:域名服务器→域名和ip地址的映射关系,浏览器先查域名服务器,找到对应ip,再访问ip地址。

:那么端口号呢?

:成熟协议的端口号是确定的。 https:443  http: 80

注2:因此本质也是基于socket通信

注3:图片视频网页音频这些资源会存储在服务器内部存储着,以文件方式存在。


1.1 HTTP协议的请求部分

服务端只做反序列化操作,而不做序列化操作

构成:请求行、请求报头、空行、请求正文


1.2 HTTP协议的回应部分

服务端只做序列化操作,而不做反序列操作

构成:状态行、报头、空行、响应正文

举个现实例子:

状态码:404

状态码描述:Not Found


1.3 问题

:请求方法是什么?

:GET(获取)、 POST(上传),对应了上述说的上网的两种目的

问:  为什么要传HTTP版本?

答:不同的版本功能不同,客户端的版本可能不同,服务端需要根据客户端请求时对应的版本提供对应的服务

:URI是什么?

:客户端想要访问资源的资源标识 

:报头有哪些内容?

:报头是哈希桶结构,报头内存储着 Content-Length(正文数据长度)、Content-Type(正文数据内容)......


2. 实现HTTP协议通信(只做概述)

客户端:这里的客户端是浏览器,不需要自己实现,未来在搭建好自己的服务器时,在浏览器通过客户端 ip + port 进行访问

因此,只需要设计服务端的实现思路,根据浏览器的请求,做出对应回应即可


2.1 服务端的搭建(设计思路)

大致分为三部

 1:因为HTTP底层是基于TCP协议通信的,因此需要先建立连接!

    套接字_listenfd、 bind、 设置为监听套接字(揽客)listen

 2:accept阻塞等待客户端(浏览器与服务端建立通信连接,客户端connect发起通信请求)。通信连接一旦建立,服务端返回一个套接字来处理业务

        :可以自己处理,现实中显然不可能,于是乎①.分进程处理 ②.分线程处理

主进程/线程继续阻塞等待客户端发起通信连接

 3:新的进程/线程执行回调方法来处理业务 

认知:客户端发送的是大字符串,结构如1.1所示。

👉: 服务端将请求反序列化

涉及操作解析请求行,获取 请求方法、URI资源标识、版本

关键点:得到 _version (版本) 、 URI(用来读取正文)

👉: 服务端根据反序列化的结果,做出相应回应

涉及操作:服务端根据得到URI资源标识,以二进制方式读取正文(缓冲区一定要足够大!)

        ①. 读取失败(假设当前资源标识不存在),删除正文内容,将当前资源标识修改为404.html,重新读取正文

        ②. 读取成功,则不执行上述操作。

无论成功与否,后续操作都是一样的 → 设置报头(正文部分数据长度、数据类型)

关键点:获得正文 _text、Content-Length、Content-Type报头

👉: 将响应序列化

涉及操作:根据1.2中响应部分的格式(状态行+报头+空行+正文),将结构体数据转为字符串数据,发送数据

:当前服务器内,资源标识是存储在本地服务器内的 html网址 and 图片,所有的正文内容都保存在本地。


2.2 服务端其他需要注意的细节

2.2.1 报头

• Content-Length:正文长度

• Content-Type:正文数据类型

Host:由客户端告知服务器,所请求的资源在哪个主机的哪个端口上的,如果当前服务器非目标服务器,当前服务器会进行相应处理(去请求目标服务器) , 当前服务器被称为代理服务器

• User-Agent:客户端的相关属性,比如 电脑 or 手机的系统 and 版本

• Referer:从哪个页面跳转到此页面的

• Location:重定向

• Connection:连接方式

 Set-Cookie


2.2.2 Location 报头

重定向分为:1. 临时重定向; 2. 永久重定向

1.临时重定向

状态码:302/307  (HTTP/1.0 和 HTTP/1.1)

应用场景:网页登录成功时,会返回到原来网站 or 页面临时跳转

2. 永久重定向()

状态码:301

应用场景:网站域名更换

:有了上述对重定向的认识,作为服务器的设计者,如果客户端想要请求的本地 or 动态资源不在,我们则可以将输出重定向至 404.html 界面


2.2.3 Connection 报头

• 功能:客户端告知服务端,客户端支持怎么样的连接 or 服务端告知客户端,服务端支持怎么样的连接

• Connection:keep-alive 支持长连接   

• Connection:close 不支持长连接

• 短连接:客户端发送一个请求,服务端处理请求并发送一个回应,服务端关闭连接,叫做短连接,这是 http/1.0的工作方式

• :如果网页中存在多份资源,假设有三张图片,那么客户端就会向服务端发送四次请求,第一次获得网页,第二、三、四获取网页中的图片,这个过程会进行四次:三次握手,accept,fork

• 缺陷:随着互联网技术发展,一张网页会有几百张图片 + 其他视频资源,所以上述短连接是存在缺陷的

• 长连接

HTTP/1.1 客户端与服务端建立连接时,客户端根据网页一共需要请求资源的数量,一次性发送所有请求,服务端处理完客户端的所有请求,再将应答发送给客户端,当所有应答全部回复时,再关闭连接

认知:HTTP是无连接、无状态的协议,每次请求都要建立新的连接

:刚才不都说了HTTP分长连接和短连接,为啥又说是无连接的?

:上述的长连接的让TCP保持长/短连接,HTTP只关心request 和 response

HTTP属于应用层,只处理request和response,连接部分由TCP即网络层处理

:对于短连接而言,客户端是怎么再次请求建立连接的?对于长连接而言,又是怎么样建立长连接的?

:对于短连接客户端(浏览器)边解析 HTML边发现资源的过程中,就立刻对每个需要加载的外部 URL(脚本、样式、图片、XHR/Fetch、字体……)发起网络请求

        对于长连接,如果我写了一个基于http协议的自定义服务器,HTTP协议在处理请求时,通过循环recv报文(请求),就可以实现长连接的过程

:HTTP协议中存在空行,保证能够读到完整报头,报头中有正文的content-length长度,能够保证读取完整的报文,从而得到一次完整的请求,只要能得到一次,就能得到多次,同时处理多次请求

:无状态是什么?

:每次请求都是独立的,不会因为刚才请求过而拒绝请求。

:无状态的缺陷 → 某网站需要登录访问,而当你访问网址内的其他资源时,需要重新登录

比如B站首页需要登录访问,登陆后点开视频又需要重新登录。


2.2.4 Set-Cookie 报头

为了解决无状态的缺陷 → 需要用到cookie

浏览器是个聪明的软件,首次时,浏览器会将对应信息保存到cookie文件里,

后续每次请求时会自动携带cookie文件进行自动认证,认证报错就会重定向到重新认证的界面

比如登录错误,会跳转到重新登录界面,看vip视频你没有vip会跳转到购买界面

cookie内容

账号、密码、cookie过期时间等

cookie种类

内存级 or 文件级,大部分都能都是文件级的,如果把浏览器关了,再启动cookie过期就是内存级的

cookie缺陷:个人隐私泄漏

如果是黑客植入了木马程序去盗用浏览器的cookie 或者 应用程序的cookie呢? 黑客将cookie信息拷贝到自己的浏览器中目标网址的cookie文件夹,也能成功访问目标服务器,这就是盗号,应用程序也是如此,将个人信息拷贝到应用程序的cookie文件夹中

sessin → 缓解cookie的缺陷

session是服务端维护的自定义类,用于保存个人隐私信息,通过session id 和 session建立映射关系

客户端未来请求时,set-cookie 保存的是session id ,服务端根据session id 找到对应的session

:如果黑客拿到了这个session id呢? 怎么办?

:私密信息放在服务器端,私密信息没有泄漏,但是盗号问题还是解决不了。

但是可以增加许多辅助方案避免盗号,比如短时间内ip改变,服务端就可以把这个session free掉,强制要求用户重新登录,黑客没有拿到私密信息就无法登录,再比如验证一些非法行为,会直接让session失效,强制重新登录


2.2.5 GET / POST 方法

GET功能

1.获取静态网页 or 资源

2.提交参数,以uri方式提交

认知:服务端出了提供资源外,还得有动态处理服务的能力!因此服务器在创建之初,就可以将对应服务登记入路由表中,本质是:unordered_map<string,http_func_t> ,建立字符串与相应函数的映射关系,key的格式:"./wwwroot" + hander_name;

:服务端根据客户端的请求,解析浏览器发来的请求行,得到URI(例如:./wwwroot/login?username=zhangsan&password=123456),然后判断本地是否存在该资源,如果不存在,将URI根据 问号 进行分割 

👉: 问号前为新的URI → ./wwwroot/login

👉: 问号后为参数 → username=zhangsan&password=123456 

服务端以新的URI查路由表,存在则执行相应方法。

问号后的参数会被浏览器获取,构成键值对

POST功能

提交参数,以正文进行提交

:对于HTTP协议,无论是POST,还是GET,登录和注册时都是不安全的,因此需要HTTPS协议,HTTPS协议最大的特点就是对个人信息进行加密处理。

http://www.xdnf.cn/news/224965.html

相关文章:

  • 7.计算机网络相关术语
  • Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)
  • 使用PyTorch进行热狗图像分类模型微调
  • 第四部分:实用应用开发
  • libevent详解
  • 深⼊理解指针(7)
  • Python网络爬虫核心技术拆解:架构设计与工程化实战深度解析
  • 【数据通信完全指南】从物理层到协议栈的深度解析
  • 鸿蒙移动应用开发--ArkTS语法进阶实验
  • 【MongoDB篇】MongoDB的索引操作!
  • Spring Boot 中集成 Kafka 并实现延迟消息队列
  • 腾讯云服务器性能提升全栈指南(2025版)
  • C# 类成员的访问:内部与外部
  • 练习001
  • Java进阶--设计模式
  • 汽车OTA在线升级法规分析
  • 搭建基于 ChatGPT 的问答系统
  • Linux Quota 显示空间占用远大于实际数据的问题排查记录
  • Java写数据结构:队列
  • 基于大模型的膀胱肿瘤全周期诊疗方案研究报告
  • 【KWDB 创作者计划】_KWDB能帮我的项目解决什么问题
  • Golang - 实现文件管理服务器
  • scGPT方法解读
  • 突发-2小时前DeepSeek发布了新模型-不是R2
  • 中小企业如何借助智能海关系统降低跨境运输成本?
  • day006-实战练习题-参考答案
  • 基于 IAR Embedded Workbench 的自研 MCU 芯片软件函数与变量内存布局优化精控方法
  • LeetCode 2905 找出满足差值条件的下标II 题解
  • AI驱动的决策智能系统(AIDP)和自然语言交互式分析
  • ArcGIS+GPT:多领域地理分析与决策新方案