文章目录
- 1.浏览器输入一个 url 中间经历的过程
- 2.TCP,UDP 的区别
- 3.HTTP 协议
- HTTP 协议有哪些部分组成?
- 响应
- 状态码
- GET 和 POST 的区别
- 什么是幂等的
- 什么是 HTTP 的长链接
- cookie 和 session 的区别
- TCP socket 编程原理
- 4.IO 多路复用
- 五种 IO 模型
- 如何提升服务器的并发能力
- 什么是 IO 多路复用?
- python 如何实现 IO 多路复用
- python 并发网络库?
1.浏览器输入一个 url 中间经历的过程
DNS 缓存 -> DNS 查询 -> TCP 握手 -> HTTP 请求 ——> 反向代理 Nginx ->uwsgi、gunicom -> web app 响应 -> TCP 挥手
2.TCP,UDP 的区别
- TCP 面向链接,可靠的,基于字节流
- UDP 无链接,不可靠,面向报文
3.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 是基于文本的协议
4.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 实现一个异步爬虫类