web服务
HTTP协议
- 用途 : 网页获取,数据的传输
- 应用层协议,使用tcp进行数据传输
- 简单,灵活,很多语言都有HTTP专门接口
- 有丰富的请求类型
- 可以传输的数据类型众多
网页访问流程
- 客户端(浏览器)通过tcp传输,发送http请求给服务端
- 服务端接收到http请求后进行解析
- 服务端处理请求内容,组织响应内容
- 服务端将响应内容以http响应格式发送给浏览器
- 浏览器接收到响应内容,解析展示
HTTP请求
- 请求行 : 具体的请求类别和请求内容
GET / HTTP/1.1
请求类别 请求内容 协议版本
请求类别:每个请求类别表示要做不同的事情
GET : 获取网络资源
POST :提交一定的信息,得到反馈
HEAD : 只获取网络资源的响应头
PUT : 更新服务器资源
DELETE : 删除服务器资源
- 请求头:对请求的进一步解释和描述
Accept-Encoding: gzip
- 请求体: 请求参数或者提交内容
HTTP响应
- 响应行 : 反馈基本的响应情况
HTTP/1.1 200 OK
版本信息 响应码 附加信息
响应码 :
1xx 提示信息,表示请求被接收
2xx 响应成功
3xx 响应需要进一步操作,重定向
4xx 客户端错误
5xx 服务器错误
- 响应头:对响应内容的描述
Content-Type: text/html
- 响应体:响应的主体内容信息
HTTP协议示例:
"""
http请求和响应 演示
"""
from socket import *
sock = socket()
sock.bind(("0.0.0.0",8000))
sock.listen(5)
# 等待浏览器连接
connfd,addr = sock.accept()
print("Connect from",addr)
# 接收HTTP请求
request = connfd.recv(1024)
print(request.decode())
# 组织响应
response = """HTTP/1.1 200 OK
Content-Type:text/html
hello world
"""
connfd.send(response.encode())
connfd.close()
sock.close()
高并发技术探讨
高并发问题
衡量高并发的关键指标
- 响应时间(Response Time) : 接收请求后处理的时间
- 同时在线用户数量:同时连接服务器的用户的数量
- 每秒查询率QPS(Query Per Second): 每秒接收请求的次数
- 每秒事务处理量TPS(Transaction Per Second):每秒处理请求的次数(包含接收,处理,响应)
- 吞吐量(Throughput): 响应时间+QPS+同时在线用户数量
C10K问题
- 早先服务器都是单纯基于进程/线程模型的,新到来一个TCP连接,就需要分配1个进程(或者线程)。而进程占用操作系统资源多,一台机器无法创建很多进程。如果是C10K就要创建1万个进程,那么单机而言操作系统是无法承受的,这就是著名的C10k问题。创建的进程线程多了,数据拷贝频繁, 进程/线程切换消耗大, 导致操作系统崩溃,这就是C10K问题的本质!
更高并发的实现
-
为了解决C10K问题,现在高并发的实现已经是一个更加综合的架构艺术。涉及到进程线程编程,IO处理,数据库处理,缓存,队列,负载均衡等等,这些我们在后面的阶段还会学习。此外还有硬件的设计,服务器集群的部署,服务器负载,网络流量的处理等。
-
实际工作中,应对更庞大的任务场景,网络并发模型的使用有时也并不单一。比如多进程网络并发中每个进程再开辟线程,或者在每个进程中也可以使用多路复用的IO处理方法。
最后一次更新于2022-12-14 14:05
0 条评论