python网络编程

浏览器输入一个url中间经历的过程

DNS 缓存 -> DNS查询 -> TCP握手 -> HTTP请求 ——> 反向代理Nginx ->uwsgi、gunicom -> web app响应 -> TCP挥手

TCP、UDP的区别

  • TCP 面向链接,可靠的,基于字节流
  • UDP 无链接,不可靠,面向报文

HTTP协议

HTTP协议有哪些部分组成?
  • 状态行
  • 请求头
  • 消息主体
  • curl 和 pip3 install httpie http 请求网页
响应
  • 状态行
  • 响应头
  • 响应主体
状态码
  • 1×× 信息 服务器收到请求,需要请求者继续操做
  • 2×× 成功 操作操作被成功接受并处理
  • 3×× 重定向 需要进一步操作完成请求
  • 4×× 客户端错误 请求有语法错误或者无法完成请求
  • 5×× 服务器错误 服务器在处理请求的过程中发生错误
GET 和 POST 的区别
  • restful语义上一个是获取一个是创建
  • GET是幂等的,POST非幂等的
  • GET请求参数放在明文中,长度限制,POST放在请求体中比较安全
什么是幂等的
  • 幂等方法是无论调用多少次都得到相同结果的HTTP方法
  • 例如:a=4是幂等的,a+=4 就是非幂等的
  • 幂等的方法客户端可以安全的重发请求

什么是HTTP的长链接
  • 短连接: 建立链接 数据传输 关闭链接(链接的建立和关闭)
  • 长连接: Connection:keep-alive 保持TCP链接不断开
  • 如何区分不同的HTTP请求呢?
    • Content-Length
    • Transfer-Encoding chunked
  • session一般是服务器生成之后给客户端(通过URL参数或者Cookie)
  • Cookie是实现Session的一种机制,通过http 的cookie字段实现
  • Session通过在服务器保存sessionid来识别用户,cookie存储在客户端
TCP socket 编程原理
  • 使用socket 接口发送http请求.
  • HTTP建立在TCP基础之上
  • HTTP是基于文本的协议

IO多路复用

五种IO模型
  • 阻塞式IO
  • 非阻塞式IO
  • IO多路复用
  • 信号式IO
  • 异步IO
如何提升服务器的并发能力

一些常见的提升并发能力的方式

  • 多线程模型,创建新的线程处理请求
  • 多进程模型,创建新的进程处理请求
    • 开销大 可以使用线程池和进程池解决
    • 资源占用比较多 难以创建太多
  • IO多路复用,实现单进程同时处理多个socket请求
什么是IO多路复用?
  • 操作系统提供的同时监听多个sockt的机制
  • 为实现高并发需要一种机制并发处理多个socket
  • LINUX常见的是select poll epoll
  • 可以使用单线程 单进程 处理多个socket

python如何实现IO多路复用
  • python的IO多路复用基于操作系统实现(select poll epoll
  • python2 select模块
  • python3 selectors 模块
python并发网络库?

tornado Gevent Asyncio

Tornado 框架

  • Tornado 适用于微服务,实现Restful接口
  • 底层基于Linux 多路复用
  • 可以通过协程或者回调实现异步编程
  • 不过生态不完善,响应的异步框架比如ORM不完善

Gevent 高性能的并发网络库

  • 基于轻量级绿色线程(greenlet) 实现并发
  • 需要注意monkey patch ,gevent修改了内置socket为非阻塞的
  • 配合gunicorn 和gevent 部署作为wsgi server 推荐:《Gevent 程序员指南》

Asyncio

  • 基于协程实现的内置并发网络库
  • python引入到内置库,协程+事件循环
  • 生态不够完善,没有大规模的生产环境检验
  • 目前应用不够广泛,基于Aiohttp可以实现一些小的服务

问题: 使用asyncio实现一个异步爬虫类