本篇摘要

  • 本篇将介绍何为HTTP协议,以及它的请求与答复信息的格式(请求行请求包头正文等),对一些比较重要的部分来展开讲解,其他不常用的即一概而过,从静态网页到动态网页的过渡,最后底层基于TCP实现简单的HTTP服务器的代码编写构建一个简单的网页(包含对应的跳转重定向动态交互等功能),采取边讲解http结构边用代码形成效果展示的形式进行讲解,望有助!
    在这里插入图片描述在这里插入图片描述

欢迎拜访: 点击进入博主主页

本篇主题: 探秘HTTP应用层那些事儿!

制作日期: 2025.07.21

隶属专栏: 点击进入所属Linux专栏

本文将要介绍的内容的大致流程图如下:

在这里插入图片描述

一· 认识HTTP

  • 在互联网世界中, HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一个至关重要的协议。 它定义了客户端(如浏览器) 与服务器之间如何通信, 以交换或传输超文本(如 HTML 文档) 。

  • HTTP 协议是客户端与服务器之间通信的基础。

  • 客户端通过 HTTP 协议向服务器发送请求, 服务器收到请求后处理并返回响应。 HTTP 协议是一个无连接、 无状态的协议, 即每次请求都需要建立新的连接, 且服务器不会保存客户端的状态信息(后面我们详细讲解)。

我们要明白

  • 我们上网要么从远端拿数据,要么上传数据到远端(数据:短视频,视频,网页,图片,音频)。

本质

  • 访问远端linux服务器的某个文件等(底层走的还是TCP那套逻辑)。

1.1认识URL

  • 其实就是我们平时说的网址

下面就拿我的博客的URL为例说明:

https://blog.csdn.net/2401_82648291?spm=1010.2135.3001.5343

详细解释如图

在这里插入图片描述

  • 解释:我们输入网址进行访问(http协议)就是拿着指定ip+port连接到具体主机的具进程(类似我们之前写的服务器)﹔然后浏览器把路径按照规定进行编码(特殊字符)然后这个符合要求的uri(路径)发送给指定进程;再由这个进程执行完(找到对应内容或者进行对应方法执行)把结果返回来!

陪一张标准的介绍

在这里插入图片描述

1.2urlencode与urldecode

  • 这里有些字符不能随意出现.比如, 某个参数中需要带有这些特殊字符(/ 或者?), 就必须先对特殊字符进行转义

  • 将需要转码的字符转为 16 进制, 然后从右到左, 取 4 位(不足 4 位直接处理), 每 2 位做一位, 前面加上%, 编码成%XY 格式

比如
在这里插入图片描述

1.3 HTTP 协议请求与响应格式

下面简单认识下http结构:

在这里插入图片描述

  • 注意:http协议,序列和反序列化用的是特殊字符进行子串拼接,且不依赖任何第三方库

下面形象看一下
在这里插入图片描述

  • http请求,携带的数据(可选,不是所有的http请求,都会携带数据)。

  • 我们之后拆解进行解析的时候,把它看做一个长的字符串

认识 http的请求以及回复

先放图

在这里插入图片描述
原理解释

  • 首先浏览器把对应的域名进行转化成ip然后–>对应的ip+port就可以找到对应的服务器端进程了;接着把后面跟的具体路径(uri)内容(也可以空)等进行填充请求报头;是get还是post(请求方法);然后按照上面的request的格式打包之后成一个长的字符串;然后发送给服务端;服务端就要进行解析;根据uri具体位置把内容拿出来放到自己的响应正文里(html);最后序列化发回去;剩下就是浏览器提取进行先关转化!!!

粗力度说一下如何序列化和反序列化

解析request

在这里插入图片描述

  • 这段字符串由浏览器构建。
  • 报头就是利用哈希表的K-V结构储存。

如何进行解析出来

  • 我们直接对这个长串进行找\r\n(第一个)来成功提取请求行,把请求方法/版本/uri解析出来(第一个都找不到就是无效的http请求了)。
  • 然后依次一行行读取,发现是空行,然后找到对应的Content-Length的长度,对应读取下一行(千万不要再继续按照上面要求读取因为最后一行无\r\n
构建response

在这里插入图片描述

  • 查找uri获得对应的响应正文
  • 根据相关信息填写请求行以及报头。
  • 拼接成长字符串

剩下的就交给浏览器自己转义即可!

1.4 剖析request与response的组成部分

认识请求方法

在这里插入图片描述
这里我们主要介绍的是POSTGET方法,代码演示也是用他俩。

GET
  • 用途: 用于请求 URL 指定的资源。
  • 示例: GET /index.html HTTP/1.1。
  • 特性: 指定资源经服务器端解析后返回响应内容。
  • form 表单: https://www.runoob.com/html/html-forms.html。

代码书写也是先以get为例,简单来说就是获取对应资源!

POST
  • 用途: 用于传输实体的主体, 通常用于提交表单数据。
  • 示例: POST /submit.cgi HTTP/1.1。
  • 特性: 可以发送大量的数据给服务器, 并且数据包含在请求体中。
  • form 表单: https://www.runoob.com/html/html-forms.html。

当然了,还有PUT(推送数据到服务端) HEAD(只返回相应头) DELETE (删除服务端数据)OPTIONS(查询URL指定资源)等,这些不常用,这里就不讲解了。

陪一张图

在这里插入图片描述

认识URI

下面我们利用图片通俗易懂来认识下:

在这里插入图片描述
输入对应的web根目录(/)

在这里插入图片描述

这个路径就是uri,然后服务端就会对应位置找到资源,返回给我们

在这里插入图片描述

  • 注意:'/ '不是Linux 根目录,是Linux服务器的一个web目录(wwwroot),资源都放在这个目录下(如果路径不是/,服务器自动拼接首页)。

因此

  • 我们在浏览器段请求的时候,首页作为站点的入口,一个网站就是一颗多叉树,点击链接的时候,浏览器会形成新的访问地址,发起二次请求

下面我们来验证下:

  • 我们先输入网址进入网页:
    在这里插入图片描述
  • 然后我们进行点击,他就会访问到我们web目录(wwwroot)的home.html内容发给浏览器进行转义,浏览器自动识别点击处封装的链接然后自动发送请求

在这里插入图片描述

然后比如点击了主页

在这里插入图片描述
总结下

  • uri就是对应服务器的某一web目录下的一个路径;当发起一定请求;服务端就会根据uri(特定)配合request的正文进行内容提取;然后构成响应正文最后发给浏览器进行转义!

认识HTTP版本

  • 这里就简单理解成你是什么版本然后告诉服务端给你提供什么版本的服务。

  • 比如你是微信低版本的客户端;然后给服务端发起请求:服务端识别到你的http的版本是低的就提供给你低版本服务(这里对于一些app应用也可以理解成是被限制的浏览器,其实也是发送http的网页请求)。

认识状态码描述

HTTP状态码

在这里插入图片描述

详细版

状态码英文名称含义解释
200OK请求成功,服务器返回对应数据
201Created请求成功且创建了新资源
204No Content请求成功,但无内容返回
301Moved Permanently资源永久重定向到新地址
302Found资源临时重定向到新地址
304Not Modified资源未修改,可直接使用缓存
400Bad Request客户端请求语法错误
401Unauthorized请求需要身份认证,未授权
403Forbidden服务器拒绝请求,无访问权限
404Not Found服务器找不到请求的资源
500Internal Server Error服务器内部错误,处理请求失败
502Bad Gateway网关错误,代理服务器获取响应失败
503Service Unavailable服务器暂时不可用,可能因维护或过载
  • 最常见的状态码:
    比如200(OK),404(NotFound),403(Forbidden),302(Redirect重定向), 504(Bad Gateway),我们暂时只需要了解这些即可。

认识HTTP 常见 Header

首先我们先认识下客户端收到答复是如何解析的:

在这里插入图片描述
如何提取相应正文

  • 响应文也可以是无内容的,如果是有内容那么一定会在Content-length加上长度再给用户的;因此用户就找空格然后看对应的Content-length大小进行提取响应正文进行转义即可。

陪一张header表

字段名含义
Content-Type数据类型(如 text/html 等)
Content-LengthBody 的长度(单位为比特)
Host客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
User-Agent声明用户的操作系统和浏览器版本信息
referer当前页面是从哪个页面跳转过来的
Location搭配 3xx 状态码使用,告诉客户端接下来要去哪里访问
Cookie用于在客户端存储少量信息,通常用于实现会话(session)的功能

下面我们就先来认识Content-Length,Content-type,Connection这几个报头为主来讲解:

  1. Content-Type:数据类型(text/html等)对应的后缀比如png mp4等都对应的有不同类型(这里我们直接截取后缀进行判断添加即可)。
  2. Content-Length: Body 的长度这里可以考虑读取文件的时候调用:1·c++文件操作/2·系统自带的stat函数

那么下面我们根据这俩个报头给我们之前写的http答复添加上

大致思路

  • 服务端收到答复通过解析获得的路径去读取文件:如果读到就构建响应正文+正确码以及解释+报头之长度,正文类型等;如果失败就把路径修改成对应的404所在的文件,让它作为正文被返回,同理报头等那些也都是404对应相关的了。

注意

  • 读文件的时候(有可能不都是文本,比如二进制的图片之类的)进行二进制读取,一口气读完。
 // 读取对应路径下的html:static bool readfile(std::string &text, std::string tar){ // 1·文本读取(比如读取图片等可能会遇到\n等符号导致读取中断直接换行等当前行后面内容就无法读到,导致错误)://  std::ifstream in(tar.c_str());//  if (!in.is_open())//       return false;//  std::string line;//  while (std::getline(in, line))//  { // 使用getline读取的时候每次会将line情况在读取//       text += line;//  }//  in.close();//  return true;// 2·二进制读取:std::ifstream in(tar.c_str());if (!in.is_open())return false;int size=filesize(tar);text.resize(size);in.read((char*)text.c_str(),size);//这里string不能强转char*因此可先调用c_strreturn true;}
  • 判断文件大小的两种方式:
 static int filesize(string file){  //c++文件io方法:// ifstream in(file);// if (!in.is_open())//      return 0;// in.seekg(0, in.end);// int size = in.tellg();// in.seekg(0, in.beg);// in.close();// return size;//系统调用:struct stat buff;int s = stat(file.c_str(), &buff);return buff.st_size;}
  • 重点来了:有个非常阴险的bug:

就是每次浏览器开一个新页面就会先向对应的服务端请求(/favicon.ico 一个文件)里面是那个小图标。

在这里插入图片描述

我们必须对它进行忽略处理:

在这里插入图片描述

比如我么我们第一次连接到主页的时候:

在这里插入图片描述

此外还建议,读取的时候数组开大一点(因为这里我们是默认它可以把请求都读上来的,忽略了其他情况)

在这里插入图片描述

解释下原理

浏览器会请求这个图标也就是会也就是Accept请求头会有对应的关于/favicon.ico对应的类型;然后如果我们还是上面的逻辑找不到就404的话(之前就可以,但是现在我们报头会返回类型这样就导致类型不匹配了,因此会出现问题)那么请求如果是它,此时我们在答复的时候就必须返回对应的类型的响应正文以及对应的Content-type是image/x-icon这个类型,否则浏览器就会爆出类型不匹配从而出错,因此问题就在于这个请求头的Accept与答复的Content-type及响应正文之间的不匹配问题,故对于这个图标的请求我们采取忽略不处理,“不理这个请求图标的进程了!”

因此

  • 我们对服务端收到的uri为这个路径的请求直接忽略即可(这里浏览器多个请求访问其实是多个多个不同进程去访问的,也就是ip同port不同,因此服务端直接对发它的进程忽略不回复;接着对其他进程的请求再做答复即可)。

根据此处小结一下

  • 对于客户端(浏览器)请求如果对应的报头比如content-type等;是空的那么服务端返回的如果不是空是可以匹配的(客户端默认)﹔但是如果客户端发送的正文已知一些报头的类型;但是服务端返回来的是不匹配的;客户端直接报错(浏览器无法解释)。

下面我们根据我们制作的基于http的小网站的请求验证一下:

在这里插入图片描述

  1. 下面再说一下Connection报头:
  • HTTP 中的 connection 字段是 HTTP 报文头的一部分,它主要用于控制和管理客户端与服务器之间的连接状态

  • HTTP/1.1:在 HTTP/1.1协议中,默认使用持久连接。当客户端和服务器都不明确指定关闭连接时,连接将保持打开状态,以便后续的请求和响应可以复用同一个连接。

  • HTTP/1.0:在 HTTP/1.0 协议中,默认连接是非持久的。如果希望在HTTP/1.0上实现持久连接,需要在请求头中显式设置Connection:keep-alive。

  • 如何使用的 :Connection:keep-alive:表示希望保持连接以复用TCP 连接,Connection:close:表示请求/响应完成后,应该关闭TCP 连接。

这里就涉及到长短连接了:

  • 长连接:就是只需要connect和accept一次,客户端和服务端就直接收发消息即可。
    在这里插入图片描述

  • 短连接:就是每次都要connect和accept(比如我们自己实现的那个简单http服务器)。
    在这里插入图片描述

下面我们举些例子来看一下:

我们自己写的http服务器它就是短连接。

请求

在这里插入图片描述
在这里插入图片描述

可以看到每次都要重新连接,故最后还是短连接

  • 访问qq新闻官网,使用1.0版本,就不支持长连接而且失败,因为telnet只支持http但是访问你的它是支持https:

在这里插入图片描述

  • 这里比如百度就支持了http;而且发送的1.1默认就是长连接,双方达成协议:

在这里插入图片描述

总结下

发送请求的时候,前提是客户端(浏览器)要支持长连接,然后发送1.1,告诉服务端要进行长连接,最后协商后才是长连接,否则就默认短连接了(这里注意互相支持的协议应该相同)。

基于我们模拟实现的简单的http服务器访问与应答原理分析:

  • 首先我们访问对应的ip+8080默认进入我们的/:web的首页也就是index:
    在这里插入图片描述
  • 下面看一下首页对应的html:

在这里插入图片描述

  • 我们点击就自然会进行一下页面跳转;比如点击登录,此时浏览器就会识别到然后重新给服务端发送对应的href对应的请求,访问对应文件:

在这里插入图片描述

video页面

  • 下面比如说我们点击了 自动打款这个选项:浏览器就会自动找对应web首页的1文件;服务端解析后发现找不到就直接构建404文件返回给浏览器然后被它转义,于是我们就看到了:

在这里插入图片描述

不过,目前我们访问的资源全是以静态资源形式呈现的(文件)。

小结一下

给我们之前的http服务器简单添加了两个报头分别是Content-type和Content-length;其次就是对于那个小图标特判一下,接著裁是理解不同htm文件里的的转关系:其实就是浏优差再次选一个进程向同一个服务端访间;有的是直接在当前页面展现出来,有的就是直接刷新当前页面进行显示(比如a标签),还有的是跳转新页面进行展示–>归根结底,还是浏览器重新构建请求发送给服务器而已! ! !

telnet与wget指令

telnet

使用telent前提是安装后,把自己对应服务器的端口开放,防火墙关闭!
首先,我们需要知道

  • 首先如果没有开放云服务器的端口的话拿公网的话,访向云服务器会被拒绝;因此之前tcp/udp模拟拿的比如是本地环回就是本地通信不涉及网络;如果是子网ip的话;是云服务器下发的ip(云服务器所在局域对应的内部ip),云服务器默认是接收的。

  • 如果自己的云服务器开通端口后就允许外部的设备拿着对应的公网ip+port(对应自己云服务器主机标志)进行访问,由于存在风险;故需要对应的云服务器开放对应端口来支持访问才行。

  • 因为我们开放了云服务器端口,因此被允许了,然后发送请求找到云服务器内执行的main程序,进行底层的tcp连接:成功后就可以进行发送请求,即基于tcp的通信了。

进行安装telnet

sudo apt install telnet
  • 使用注意事项:使用的时候就是telent ip port然后ctrl+]然后再回车即输入访问的网址或者请求即可,q为退出

在这里插入图片描述

  • 这里我们就用telnet进行连接我们的http服务器了。
  • 进行访问首页:

client界面 :

在这里插入图片描述

server界面:

在这里插入图片描述

  • 下面我们试着访问下百度的网页:

在这里插入图片描述

在这里插入图片描述

wget
  • 解释:获取对应的网址对应的云服务器内的web首页里对应文件内容+名称,下载到本地(爬虫)一些网站有反爬机制明确禁止。

  • 安装指令:

sudo apt-get update
sudo apt-get install wget
  • 演示效果:

下面我们抓取-下qq新闻页面:

在这里插入图片描述

  • 进行爬取

在这里插入图片描述

  • 爬取结果

在这里插入图片描述

再探状态码: 重定向之永久重定向(301)+临时重定向(302)

  • 举个通俗易懂的例子:

比如学校南门开了个超市,但是超市临时搬到了北门,因此就会在原来南门的位置搞个告示,这样学生们就看到了直接去北门了–>(临时重定向)302+location!但是如果超市由于北门生意好,就搬到北门不回来了,因此它就会在原来南门的地方贴个告示说永久到北门–>(永久重定向)301+location!

  • 下面我们画个client-server图形象理解下:

在这里插入图片描述

  • 这里就是客户(浏览器)给服务端发送访问s1的请求;但是原先的位置的内容不存在(被服务端重定向了);因此当client访问s1资源的时候,服务端判断重定向返回对应的s2地址给client(然后client拿到后就去访问),这样就完成了重定向!

这里永久重定向主要是针对搜索引擎的,因为它要保证拿到对应公司网址的是最新的,因此需要记录下来之前被重定向的资源的新地址!!!

  • 比如这里我们汉语搜索qq新闻,浏览器搜索引擎要能保证上面的这点,及时抓取对应的网址:

在这里插入图片描述

下面那我们实现的http网站演示下效果

  • 这里只要我们搜索这个路径的资源就会被永久重定向:301
 if (_route == "./wwwroot/redirect"){setcode(301); // 永久重定向:第一次被浏览器记录保存,剩下的再访问就直接到location目的网址访问setheader("Location", "https://blog.csdn.net/2401_82648291?type=lately");return true;}
  • 对于301的永久重定向也是一样的,只不过这个浏览器不会记录,但是永久的会记录,到时候直接去那个地方即可(我们的属于短连接,每次请求完毕都会断开)效果不明显。

效果:

在这里插入图片描述

被永久重定向了:

在这里插入图片描述

  • telnet一下也发现被返回的location,然后浏览器拿着这个location的新地址去访问新的地方

在这里插入图片描述

  • 测试下302:
if (!ans){             setcode(302); // 临时重定向,每次访问到指定网址就拿到对应的location里的网址进行访问,浏览器不进行保存!setheader("Location""http://123.249.104.207:8080/404.html");}
  • 我们访问的我们自己服务端没有的路径文件,就会被返回302重定向:

在这里插入图片描述

  • 被临时重定向到404文件了:

在这里插入图片描述

  • telent查看

在这里插入图片描述

因此总结下:

重定向就是在response的Location处放上对应的网址,还有些其他操作等等,没有响应正文

重识请求方法之GET与POST

在这里插入图片描述

  • GET:获取资源(图片,视频,音频,网页… 静态资源),这里也可以上传类似post功能但是,uri是含参数的!
  • POST: 上传资源,比如登录的时候上传账号+密码;然后服务端对应根据它进行相应的服务–>动态的(进行了交互)!

举个例子:
在这里插入图片描述

在这里插入图片描述

  • 这里就是我们登录的首页,我们输入账号和密码就是上传数据就会和服务端进行交互,这里用的是post请求,服务端通过对应的正文拿到账号和密码,后执行login服务(服务端自己定义的),比如访问对应账号密码下的资源。

1· 下面我们看一下利用post的请求与应答

请求:

在这里插入图片描述

应答:

在这里插入图片描述

  • 此时,浏览器会自动识别我们的输入然后进行转化成正文,构建请求发送,接着服务端收到后会执行login对应的服务然后返回正文。

下面看下我们的效果:

  • 我们设置的这个服务是只要密码正确就会进行视频播放贡面,因此我们判断到是post请求后直接提取正文把密码拿到,然后进行对应login服务(RESTful风格的网络接口!)进行匹配构建应答即可!

  • 输入密码:
    在这里插入图片描述

  • 进行跳转:
    在这里插入图片描述

GET请求与应答验证:

  • 这里之前我们用的get都是静态的(没有交互的),也就是直接访问对应路径下的文件,但是下面我们就要给它对应的uri加上参数!

这里修改成get那么浏览器识别输入后就会按照get请求构建请求:

在这里插入图片描述

  • 这里也是同理我们从uri的参数中提取对应的账号密码传给login服务,让它匹配进行构建答复即可:

效果:

在这里插入图片描述
应答:在这里插入图片描述

  • 看一下我们抓包的结果

请求:

在这里插入图片描述

应答:在这里插入图片描述

GET与POST特点总结

GET

  • 获得静态网页或者资源,加上参数可以获取动态资源。
  • 提交参数以uri形式提交。
  • GET提交参数,不能过程,一般有长度限制。
  • 参数会回显(比如账号密码)。

POST

  • 获得动态资源。
  • 提交参数以正文形式提交。
  • 正文传递,意味着长度可以很长。
  • 不回显,比较私密。

但是,它俩都不是安全的,以明文形式在网络中传递,抓包就能获取,其中,https(有加密)>post动态交互安全>get动态交互

fiddler使用验证GET与POST的不安全性

  • fiddler:一个抓取构建好的报文的软件,fiddler抓到的报文,是已经被浏览器构建完毕的http请求,就是将来要发送到网络中的。

  • 下面我们模拟下这个过程:

在这里插入图片描述

  • 说自了就是这个fiddler带着浏览器的请求以及服务器对应的应答在网络中传输(相当于浏览器和服务器之间通信的“信使”)

它的存在不就暴露了某些信息吗(尤其是post的比如登录功能等)

使用流程

  • 首先,我们在官网安装好fiddler软件,然后启动:
  • 先进行清空,然后默认是可以抓取http的包的!
    在这里插入图片描述
    在这里插入图片描述
  • 我们可以看到虽然post不会在网址栏回显但是这样一抓取不就暴露密码了吗,因此说get和post都是不安全的(对http而言)!

一般这种密码登录类似功能在网络中传播都是被加密的–>用的是https,下面我们抓取下:

fiddler默认是只抓取http,对于https我们要自己设置:

在这里插入图片描述

在这里插入图片描述

  • 我们用用一个使用https协议发送请求的登录页面验证下:

在这里插入图片描述

  • 显示抓包结果:
    在这里插入图片描述
    因此可以发现https是更加安全的!

重新认识HTTP

我们在上面说了这样一句话:

HTTP 协议是一个无连接、 无状态的协议, 即每次请求都需要建立新的连接, 且服务器不会保存客户端的状态信息
1· 为什么说http是无连接?

可以理解成http位于应用层,是一个应用层协议,底层的网络层是基于tcp实现的,也就是tcp负责accept和connect,即对于长短连接是其底层tcp的说法,而它是只负责response和request的,即是没有连接而言。

2· 为什么说http无状态?

http本质就是一种“文件”的服务器,比如每次我们请求它就是分析处理给我们找到对应文件然后发回来,自身是不会记录任何数据的,更不会记录客户端的信息(比如登录账号访问,那么你每次访问都要登录,但是这样就造成了麻烦)。

浅浅认识cookie和session

  1. cookie

比如每次我们访问网站看视频都需要登录,此时我们第一次登录后,就可以看视频了,但是下一次希望不在登录就可以看,因此这就是cookie机制(第一次登录后,服务器验证成功后,把对应的账号密码cookie返回浏览器储存,然后下次继续访问网站看视频,浏览器默认发送上对应的cookie,浏览器验证后成功就直接重定向到视频页面而不是登录页面)!

如图

在这里插入图片描述
如何edge查找cookie信息:这里是储存在文件里

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 点开就能看到对应信息:
    在这里插入图片描述
    小结下:

  • 一般储存在浏览器的文件或者内存中,但是文件中的可能性更大!

  • 但是这样有可能就会出现黑客盗取对应浏览器中的cookie信息,导致账号密码被盗!

  • 因此下面session出现了

  1. session
    在这里插入图片描述
  • 同理,再次访问,浏览器会带上sessionid 去访问某资源,当服务端看到这一资源的id或者没有和对应cookie匹配,此时就重新登陆否则直接拿资源给它!

  • 此时就是,客户端第一次请求服务端,服务端把客户对应的账号和密码和一些其他信息进行一定编码,然后得到一个id,服务端拿着这个id给对应的用户建立一个记录(用户访问的一些资源),然后发给浏览器作为它的cookie,当下一次浏览器访问这个服务器的时候,就会自动带上这个id,然后服务器收到这个id就能找到对应的资源记录了!

  • 比如用其他浏览器访问这个服务器,cookie中没有id就会自然重新建立了,但是如果是被黑客盗取了,然后把这个id发给服务器,这样它就能访问之前用户访问的资源了,但是我们确实避免了黑客通过单纯cookie盗号行为

  • 这样解决了黑客盗号问题,但是黑客还是可以访问的,因此就是服务端的保护措施了:比如过期时间,异常检测,ip溯源,地址变更等!

-因此http引入的cookiesession就减低了它的无连接,无状态的弊端!
如果想更深入了解cookie与session,有机会博主后再次更新专门一篇讲解它俩!

二· 基于所学http相关概念实现简单的http服务器

2.1 视频效果展示

下面我们基于上面所叙述的http方面的知识来简单实现的http版服务器,具有跳转,重定向,动态交互等功能,然后在登录页面密码只要是666就能正确登录并跳转视频播放页面否则就404页面

简单HTTP服务器功能测试效果

2.2 源码

在这里插入图片描述

点击这里进入my-gitee获取对应源码

三· 本篇小结

  • 本篇学习了相关http协议的内容,明白了它的概念,结构等等,以及自己手搓实现了简单版的http服务器,当然前提还得是对http相关知识掌握牢固,其次就是考验代码能力了,博主在学习http专题时候历经一个星期多,从学习到编写对应代码,也陷入过对应的几个小时找bug环节,但是最终由于那份坚持还是完成了任务,此篇,博主通过自己整理的笔记再一次书写成博客耗时半天,重温了一遍知识就是很爽~,也希望对大家学习http有帮助!

苦尽甘来时,再讲来时路!

冲冲冲!!!

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

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

相关文章

QT的项目pro qmake编译

使用qmake管理Qt库的子工程示例-CSDN博客 top_srcdir top_builddir

语音交互系统意图识别介绍和构建

一、意图识别简介**意图识别(Intent Recognition)**是语音交互系统的核心组件,用于理解用户语音输入背后的真实目的(如查询天气、播放音乐等)。输入:语音转文本(ASR输出)的语句输出&…

DINOv3 重磅发布

2025年8月14日 Meta 发布了 DINOv3 。 主页:https://ai.meta.com/dinov3/ 论文:DINOv3 HuggingFace地址:https://huggingface.co/collections/facebook/dinov3-68924841bd6b561778e31009 官方博客:https://ai.meta.com/blog/d…

ansible playbook 实战案例roles | 实现基于firewalld添加端口

文章目录一、核心功能描述二、roles内容2.1 文件结构2.2 主配置文件2.3 tasks文件内容免费个人运维知识库,欢迎您的订阅:literator_ray.flowus.cn 一、核心功能描述 这个 Ansible Role (firewalld) 的核心功能是:动态地、安全地配置 firewal…

【深度学习实战(55)】记录一次在新服务器上使用docker的流程

使用docker:apt-get install dockersudo usermod -aG docker sliu (将用户 sliu 添加到 docker 用户组)newgrp docker (刷新)docker imagessudo docker load --input /home/sliu/workspace/env/shuai_docker.tar &…

面试后的跟进策略:如何提高录用几率并留下专业印象

面试结束后,许多求职者认为自己的任务已经完成,只需等待结果通知。然而,面试后的跟进策略同样是求职过程中的关键环节,它不仅能提高你的录用几率,还能展示你的专业素养和持续兴趣。本文将结合酷酷面试平台的专业建议&a…

深入解析RAGFlow六阶段架构

下面用“流程图 六阶段拆解”的方式,把 RAGFlow 的完整流程逐层剖开,力求把每一步的输入、输出、可选策略、内部机制都讲清楚。 ──────────────────────── 一、总览图(先建立体感) 用户提问 │ ├─→【…

Go语言中的迭代器模式与安全访问实践

Go语言中的迭代器模式与安全访问实践 1. 迭代器模式在Go中的演进 1.1 传统迭代器模式回顾 在传统面向对象语言中,迭代器模式通常涉及三个核心组件:可迭代集合接口(Iterable)迭代器接口(Iterator)具体实现类// 传统迭代器模式示例 type Iterator interfac…

从零开始:JDK 在 Windows、macOS 和 Linux 上的下载、安装与环境变量配置

前言 在进入 Java 世界之前,搭建一个稳定、可用的开发环境是每个开发者必须迈过的第一道门槛。JDK(Java Development Kit)作为 Java 程序开发的核心工具包,其正确安装与环境变量配置直接关系到后续编译、运行、调试等所有开发流程…

【音视频】芯片、方案、市场信息收集

系统级芯片安霸(Ambarella)Ambarella H22/H32:高端方案,支持8K/4K高帧率录制,低功耗,广泛用于GoPro Hero 11/12、Insta360等旗舰机型。 Ambarella A12/A10:早期主流方案,支持4K60fps…

中科米堆CASAIM提供机加工件来料自动化测量尺寸方案

机加工行业面临日益严格的质量追溯要求,来料质量的稳定性直接影响着后续生产效率与成品合格率。传统人工检测方式受限于接触式工具的测量精度与操作效率,难以应对小批量、多品种的现代生产需求。传统机加工件来料检测长期面临这些问题:其一&a…

MySQL只操作同一条记录也会死锁吗?

大家好,我是锋哥。今天分享关于【MySQL只操作同一条记录也会死锁吗?】面试题。希望对大家有帮助; MySQL只操作同一条记录也会死锁吗? 超硬核AI学习资料,现在永久免费了! 在 MySQL 中,死锁通常是由于多个事务对不同…

知识蒸馏 Knowledge Distillation 论文 Generalized Knowledge Distillation (GKD) 乘法法则、全概率公式、贝叶斯定理

知识蒸馏 Knowledge Distillation 论文 Generalized Knowledge Distillation (GKD) 乘法法则、全概率公式、贝叶斯定理 flyfish 代码实践 On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes 设定(方便算数)&#x…

Fastjson 2.x踩坑——序列化Java字段为null值默认输出

先上无法实现效果的代码,我的目的是序列化时如果数字型字段为null则填0,尽可能保证数据整齐。 Data NoArgsConstructor AllArgsConstructor ToString JSONType(serializeFeatures {JSONWriter.Feature.WriteNulls,JSONWriter.Feature.WriteMapNullValue…

4G高负荷解决方案

4G高负荷解决方案 一、网络优化手段(低成本优先)参数优化 调整功率控制、负荷均衡参数。优化小区重选与切换参数,避免高负荷小区拥塞。负荷均衡 开启 MLB(Mobility Load Balancing,移动负荷均衡)。引导用户…

K8S 安装部署 Rocky Linux 10.0 + Docker + Containerd + Calico

Docker Containerd Flannel 安装部署K8S 系统环境准备 # 1. 设置主机名 hostnamectl set-hostname k8s-n1 && bash# hostnamectl set-hostname k8s-n2 && bash # hostnamectl set-hostname k8s-n3 && bash# 2. 删除系统自带的容器软件(可…

新华三H3CNE网络工程师认证—等价路由

等价路由就是“去同一个地方有多条路,时间一样近,快递站聪明地分拨送货”的技术!(网络不堵车,速度翻倍爽!)路由表中存在等价路由之后,前往该目的网段的IP报文路由器辉通过所有有效的…

DBLens 业界首创AI表结构变更审查,智能评估影响,助力开发效率跃升。

智能守护每一次变更:dblens AI 审查流程详解 在快速迭代的软件开发过程中,数据库结构变更是常见却高风险的操作。一次不经意的字段调整,可能引发线上故障、数据不一致甚至业务中断。为应对这一挑战,dblens 率先引入AI驱动的表结构…

窗口看门狗(WWDG)

窗口看门狗(WWDG)1. WWDG 简介作用:在应用跑飞、死循环、长时间被中断占用等异常时,强制复位 MCU,提高系统可靠性。时钟来源:来自 APB1 时钟 (PCLK1) 的分频(与 IWDG 的 LSI 独立时钟不同&#…

PyTorch API 6

文章目录torch.onnx概述基于 TorchDynamo 的 ONNX 导出器基于TorchScript的ONNX导出器贡献与开发torch.optim如何使用优化器构建优化器每个参数的选项执行优化步骤optimizer.step()optimizer.step(closure)基类算法如何调整学习率如何利用命名参数加载优化器状态字典权重平均法…