浏览器输入一个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
cookie 和 session的区别
- 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实现一个异步爬虫类