网络编程总结

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 实现一个异步爬虫类

相关推荐

  1. 网络编程!

    2024-03-10 14:08:01       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 14:08:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 14:08:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 14:08:01       82 阅读
  4. Python语言-面向对象

    2024-03-10 14:08:01       91 阅读

热门阅读

  1. node.js中path.join() 和 path.resolve()

    2024-03-10 14:08:01       45 阅读
  2. Git常用命令

    2024-03-10 14:08:01       35 阅读
  3. llama2c(4)之forward、sample、decode

    2024-03-10 14:08:01       47 阅读
  4. 安全运营方案的基本框架和关键要素

    2024-03-10 14:08:01       50 阅读
  5. html2canvas+jsPDF实现前端导出pdf

    2024-03-10 14:08:01       44 阅读
  6. python使用pdfkit把html文本转换成pdf非常慢

    2024-03-10 14:08:01       36 阅读
  7. urllib.error.HTTPError: HTTP Error 400: Bad Request

    2024-03-10 14:08:01       38 阅读
  8. 【DevOps实战篇】原生Docker集群项目向Kubernetes移行

    2024-03-10 14:08:01       34 阅读
  9. 事务(transaction)

    2024-03-10 14:08:01       46 阅读
  10. 清除Mac OS上Xcode占用的空间

    2024-03-10 14:08:01       44 阅读