web服务

HTTP协议

  • 用途 : 网页获取,数据的传输
  • 应用层协议,使用tcp进行数据传输
  • 简单,灵活,很多语言都有HTTP专门接口
  • 有丰富的请求类型
  • 可以传输的数据类型众多

网页访问流程

  1. 客户端(浏览器)通过tcp传输,发送http请求给服务端
  2. 服务端接收到http请求后进行解析
  3. 服务端处理请求内容,组织响应内容
  4. 服务端将响应内容以http响应格式发送给浏览器
  5. 浏览器接收到响应内容,解析展示

2_wzfw.png

HTTP请求

  • 请求行 : 具体的请求类别和请求内容
GET         /        HTTP/1.1
请求类别   请求内容     协议版本

请求类别:每个请求类别表示要做不同的事情 

    GET : 获取网络资源
    POST :提交一定的信息,得到反馈
    HEAD : 只获取网络资源的响应头
    PUT : 更新服务器资源
    DELETE : 删除服务器资源
  • 请求头:对请求的进一步解释和描述
Accept-Encoding: gzip
  • 请求体: 请求参数或者提交内容

request.jpg

HTTP响应

  • 响应行 : 反馈基本的响应情况
HTTP/1.1     200       OK
版本信息    响应码   附加信息

响应码 : 
    1xx  提示信息,表示请求被接收
    2xx  响应成功
    3xx  响应需要进一步操作,重定向
    4xx  客户端错误
    5xx  服务器错误
  • 响应头:对响应内容的描述
Content-Type: text/html
  • 响应体:响应的主体内容信息

response.png

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处理方法。

25.jpg