PythonWeb服务器(HTTP协议)

一、HTTP协议与实现原理

        HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础,通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的方式分为非持续连接和持续连接。

        它是一种无状态的协议,意味着每个HTTP请求都是独立的,服务器不会记住之前的请求。

HTTP的实现原理可以概括为以下几个步骤:

  1. 建立连接:客户端通过TCP/IP协议与服务器建立连接。HTTP使用默认的端口号80进行通信,但也可以使用其他端口号。

  2. 发送请求:客户端向服务器发送HTTP请求。请求由请求行、请求头和请求体组成。请求行包含请求方法(GET、POST等)、请求的URL和协议版本。请求头包含关于请求的附加信息,例如用户代理、Cookies等。请求体包含请求所需的数据,例如表单数据或上传的文件。

  3. 处理请求:服务器接收到请求后,根据请求的URL和方法,处理请求并生成响应。处理请求的方式可以是执行脚本、读取文件、查询数据库等。

  4. 发送响应:服务器生成HTTP响应,并将其发送回客户端。响应由响应行、响应头和响应体组成。响应行包含响应的状态码和状态消息。响应头包含关于响应的附加信息,例如内容类型、缓存控制等。响应体包含响应的实际内容,例如HTML页面、图片等。

  5. 关闭连接:一旦响应发送完毕,服务器关闭与客户端的连接。如果客户端需要更多资源,它可以再次发起新的HTTP请求。

        HTTP的实现依赖于底层的TCP/IP协议,它负责在网络上可靠地传输数据。HTTP使用明文传输数据,因此不适合传输敏感信息。为了增加安全性,可以使用HTTPS(HTTP Secure)协议,它在HTTP和TCP/IP之间添加了SSL/TLS加密层。

        在HTTP协议中连接客户与服务器的方式分为非持续连接持续连接

1.1  非持续连接

        客户向服务器发出的一系列请求以有规律的间隔性地或间断性地一个接一个发出,这种连接服务器的方式称之为非持续连接。

例:

       现在有一个客户访问一个网页,假设该网页由1个HTML文件和10个JPEC图形组成,并且这十一个对象在同一台服务器上。进一步假设HTML文件的URL为http://www.someSchool.edu/someDepartment/home.index

访问的过程中由以下流程组成:

(1)HTTP客户进程在端口号80(默认端口)发起一个到服务器www.somSchool.edu的TCP连接

(2)HTTP客户经它的套接字(socket)向服务器发送一个HTTP请求报文

(3)HTTP服务器进程经它的套接字接受该请求报文,从其存储器(RAW或磁盘)中检索出对象someDepartment/home.index,在一个HTTP响应报文中封装对象,并通过其套接字向用户发送响应报文。

(4)HTTP客户接收到响应报文,TCP关闭。

以上操作产生11个TCP连接才能返回一个完整的网页。

1.2 持续连接

        非持续连接有一些缺点:(1)必须为每一个请求的对象创建一个全新的TCP连接,给web服务器带来了巨大的负担(2)需要经受两倍RTT的交付时延(一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象)

        针对以上两个缺点,开发人员对HTTP的连接方式进行了改进。即每一个请求/响应都通过同一个TCP连接进行发送。

        在非持续连接的例子中表现为没有步骤(4)中的“ TCP关闭 ”,后续的请求和响应仍然通过这个TCP进行发送。

1.3 HTTP报文格式

以下是两个典型的HTTP报文实例:

1.请求报文

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

求的目标是/index.html页面。请求头部字段包括HostUser-AgentAcceptAccept-EncodingAccept-Language等。

2.响应报文

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1274
Date: Mon, 24 May 2021 10:00:00 GMT
Server: Apache/2.4.18 (Ubuntu)<!DOCTYPE html>
<html>
<head><title>Example Page</title>
</head>
<body><h1>Welcome to the Example Page</h1><p>This is a sample HTML page.</p>
</body>
</html>

这是一个状态码为200的响应报文,表示请求成功。响应头部字段包括Content-TypeContent-LengthDateServer等。响应体是一个HTML页面,包含标题和段落内容。

上面提到的头部字段用于提供请求或响应的附加信息。

常见的请求报文头部字段包括:

  1. 请求行:包括请求方法(GET、POST等)、请求的URL以及HTTP协议的版本号。
  2. Host:指定请求的主机名,用于虚拟主机的识别。
  3. User-Agent:发送请求的用户代理标识,用于标识客户端的软件、硬件和操作系统信息。
  4. Accept:指定客户端可接受的媒体类型(MIME类型)。
  5. Accept-Encoding:指定客户端可接受的内容编码方式,如gzip、deflate等。
  6. Accept-Language:指定客户端可接受的自然语言。
  7. Connection:指定是否保持连接。
  8. Content-Type:指定请求体的媒体类型。

常见的响应报文头部字段包括:

  1. 状态行:包括HTTP协议的版本号、状态码以及状态消息。
  2. Server:指定响应的服务器软件信息。
  3. Content-Type:指定响应体的媒体类型。
  4. Content-Length:指定响应体的长度。
  5. Content-Encoding:指定响应体的内容编码方式。
  6. Set-Cookie:设置响应的Cookie信息。
  7. Location:指定重定向的URL。
  8. Cache-Control:指定缓存控制策略。

1.4 cookie

        用户与服务器交互中,cookie是一种用于存储用户信息的小文件。当用户访问一个网站时,服务器会通过HTTP响应的头部将一个cookie发送给用户的浏览器。浏览器将cookie保存起来,并在用户下次访问该网站时,将cookie发送给服务

Cookie技术中有4大组件:

  1. Cookie Manager:负责管理和维护浏览器中存储的Cookie。它可以允许用户查看、添加、编辑和删除Cookie,并提供一些高级功能,如导出和导入Cookie数据。

  2. Cookie Parser:负责解析HTTP请求中的Cookie。它将请求头中的Cookie字段解析为Cookie对象,使服务器能够轻松地提取和使用Cookie数据。

  3. Cookie Serializer:负责将服务器上的Cookie序列化为HTTP响应头中的Cookie字段。它将Cookie对象转换符合HTTP协议规范的格式,以便浏览器能够正确地处理和存储Cookie。

  4. Cookie Storage:负责实际存储和管理Cookie数据。可以将Cookie数据保存在浏览器的本地存储中,以便在后续的请求中使用。Cookie Storage还可以提供一些额外的功能,如设置Cookie的过期时间、域名和路径等。

二、python实现WEB服务器

在python中可以通过http.server模块实现简单的WEB服务器:

rom http.server import HTTPServer, BaseHTTPRequestHandler# 创建一个自定义的请求处理类,继承自BaseHTTPRequestHandler
class MyRequestHandler(BaseHTTPRequestHandler):# 处理GET请求def do_GET(self):# 设置响应状态码为200(表示成功)self.send_response(200)# 设置响应头self.send_header('Content-type', 'text/html')self.end_headers()# 构造响应内容response = '<h1>Hello, World!</h1>'# 发送响内容self.wfile.write(response.encode())# 创建一个HTTP服务器实例,并指定请求处理类
server = HTTPServer(('localhost', 8000), MyRequestHandler)
# 启动服务器
server.serve_forever()

以上代码会创建一个简单的WEB服务器,监听本地8000端口,收到GET请求时会返回一个包含<h1>Hello, World!</h1>的HTML响应。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Tomcat】Tomcat 运行原理

Tomcat 运行原理 一. Servlet 运行原理1. 接收请求2. 根据请求计算响应3. 返回响应 二. Tomcat 的伪代码1. Tomcat 初始化流程2. Tomcat 处理请求流程3. Servlet 的 service 方法的实现 一. Servlet 运行原理 在 Servlet 的代码中我们并没有写 main 方法, 那么对应的 doGet 代…

Oracle for Windows安装和配置——Oracle for Windows数据库创建及测试

2.2. Oracle for Windows数据库创建及测试 2.2.1. 创建数据库 1&#xff09;启动数据库创建助手&#xff08;DBCA&#xff09; 进入%ORACLE_HOME%\bin\目录并找到“dbca”批处理程序&#xff0c;双击该程序。具体如图2.1.3-1所示。 图2.1.3-1 双击“%ORACLE_HOME%\bin\dbca”…

Python之网络编程

一、网络编程 互联网时代,现在基本上所有的程序都是网络程序,很少有单机版的程序了。 网络编程就是如何在程序中实现两台计算机的通信。 Python语言中,提供了大量的内置模块和第三方模块用于支持各种网络访问,而且Python语言在网络通信方面的优点特别突出,远远领先其他语…

Spring学习笔记7 Bean的生命周期

Spring其实就是一个管理Bean对象的工厂.它负责对象的创建,对象的销毁. 这样我们才可以知道在哪个时间节点上调用了哪个类的哪个方法,知道代码该写在哪里 Bean的生命周期之粗略5步 Bean生命周期的管理可以参考Spring的源码: AbstractAutowireCapableBeanFactory Bean的生命周期…

ardupilot的编译过程

环境 树莓派4b ubuntu20.04 git 2.25.1 python3.8.10 pixhawk2.4.8 下载源码 &#xff08;已经配置好git环境和ssh&#xff09; git clone --recurse-submodules gitgithub.com:ArduPilot/ardupilot.gitcd ardupilotgit status使用git status检查是否下载完整 如果不完整&a…

自主研究,开发并产业化的一套UWB精确定位系统源码 UWB源码

UWB (ULTRA WIDE BAND) 技术是一种无线载波通讯技术&#xff0c;它不采用正弦载波&#xff0c;而是利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。UWB定位系统研发团队依托在移动通信&#xff0c;雷达&#xff0c;微波电路&#xff0c;云计算与大数…

黑马JVM总结(二十)

&#xff08;1&#xff09;GC_调优老年代 CMS是低响应时间的&#xff0c;并发的一个垃圾回收器 &#xff0c;有这样一个缺点&#xff0c;因为在垃圾回收的同时&#xff0c;其他的用户线程也在运行&#xff0c;就会产生新的垃圾这个新的垃圾称为浮动垃圾&#xff0c;如果浮动垃…

基于Xml方式Bean的配置-命名空间种类

Spring的标签 Spring的xml标签大体上分为两类&#xff0c;一种是默认标签&#xff0c;一种是自定义标签 默认标签&#xff1a;就是不用额外导入其它命名空间约束的标签&#xff0c;例如<bean>标签 标签作用 <beans> 一般作为xml配置根标签&#xff0c;其他标签都是…

网络防御--防火墙

拓扑 Cloud 1 作为电脑与ENSP的桥梁 防火墙配置 登录防火墙 配置IP地址及安全区域 添加地址对象 配置策略 1、内网可以访问服务器 结果 2、内网可以访问公网 结果 配置NAT策略 结果

uniapp中vue3使用uni.createSelectorQuery().in(this)报错

因为VUE3中使用setup没有this作用域&#xff0c;所以报错 解决办法&#xff1a;使用getCurrentInstance()方法获取组件实例 import { getCurrentInstance } from vue;const instance getCurrentInstance(); // 获取组件实例 const DOMArr uni.createSelectorQuery().in(ins…

在Idea中调试本地Docker

报错&#xff1a; Error running myApp: Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset" 原因&#xff1a; Docker配置里边没有配置环境变量JAVA_TOOL_OPTIONS. 解决&#xff1a; 在Docker下加入运行时的环境变量JAVA…

如何使用固态硬盘+硬盘盒子+U盘创造移动双系统

本文背景 这学期上了一节鸟水课《大数据实践》&#xff0c;老师要求扩展硬盘盒&#xff0c;以部署大数据工具进行 机器挖掘等大数据领域工作 参考视频链接&#xff1a;无需启动盘&#xff0c;用虚拟机将ubuntu安装到移动硬盘上_哔哩哔哩_bilibili 项目使用设备 1.绿联&#…

Linux 查看权限控制

1、认知权限信息 通过ls -l 可以以列表形式查看内容&#xff0c;并显示权限细节 序号1&#xff0c;表示文件、文件夹的权限控制信息 序号2&#xff0c;表示文件、文件夹所属用户 序号3&#xff0c;表示文件、文件夹所属用户组 2、权限细节 权限细节总共分为10个槽位 举例&…

NodeJs——npm

文章目录 写在前面一、dependencies、devDependencies和peerDependencies区别&#xff1a;二、需要牢记的npm命令2.1 npm2.2 npm config list2.3 npm配置镜像源 三、npm install 的原理四、package-lock.json的作用五、npm run 的原理六、npx6.1 npx是什么6.2 npx的优势6.3 npm…

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

Mysql002:(库和表)操作SQL语句

目录&#xff1a; 》SQL通用规则说明 SQL分类&#xff1a; 》DDL&#xff08;数据定义&#xff1a;用于操作数据库、表、字段&#xff09; 》DML&#xff08;数据编辑&#xff1a;用于对表中的数据进行增删改&#xff09; 》DQL&#xff08;数据查询&#xff1a;用于对表中的数…

idea更改java项目名

做了一个普通的java项目&#xff08;使用socket进行网络通信的练手项目&#xff09;&#xff0c;需要更改项目名&#xff0c;更改过程记录在这里。 修改项目名可能会出现很多错误&#xff0c;建议先备份当前项目 1.在idea里&#xff0c;右键项目名——》选择Refactor——》选择…

Nginx 设置禁用 OPTIONS 请求

1、修改 nginx 配置 在 nginx.conf 配置文件中&#xff0c;增加如下内容&#xff1a; if ($request_method ~* OPTIONS) {return 403; }效果如下&#xff1a; 2、重启 nginx 服务 systemctl restart nginx或者 service nginx restart3、功能验证 使用如下命令&#xff…

基于最近电平逼近的开环MMC逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型介绍&#xff1a; MATLAB21b版本 DC:12kV&#xff0c;N&#xff1d;12&#xff0c; 采用最近电平逼近调制&#xff0c;采用基于排序的均压方法&#xff0c;冒泡排序&#xff0b;桥臂电流方向判断。 连接…

STL-函数对象、谓词、常用算法

函数对象 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一个函数 函数对象使用…