python学习总结及要点

TCP/IP四层协议模型

开放式系统互联(osi)是把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议
应用程序通常使用应用层,而下三层交给内核处理
在这里插入图片描述

应用层:负责处理特定的应用程序细节。简单网络管理SNMP协议,简单网络传输SMTP,域名解析DNS,文件下载FTP协议,远程协助
Telnet协议,超文本传输HTTP等等。
1)HTTP:超文本传输协议,基于TCP,是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。
2)SMTP:简单邮件传输协议,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
3)SNMP:简单网络管理协议,由一组网络管理的标准组成,包含一个应用层协议、数据库模型和一组资源对象。
4)FTP:文件传输协议,用于Internet上的控制文件的双向传输。同时也是一个应用程序。
5)Telnet:是Internet远程登陆服务的标准协议和主要方式。为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。
6)SSH:安全外壳协议,为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
7)NFS:网络文件系统,是FreeBSD支持的文件系统中的一种,允许网络中的计算机之间通过TCP/IP网络共享资源。
运输层:主要为两台主机上的应用提供端到端的通信。TCP协议和UDP协议。
网络层:处理分组在网络中的活动,比如分组的选路。IP协议等。
数据链路层:包括操作系统中的设备驱动程序、计算机中对应的网络接口卡。

TCP

三次握手

三次握手是tcp 服务器与客户端建立连接的手段:
在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递

  • 第一次
    第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
  • 第二次
    第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
  • 第三次
    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手
    在这里插入图片描述

为什么要三次握手

TCP 需要 seq 序列号来做可靠重传或接收,而避免连接复用时无法分辨出 seq 是延迟或者是旧链接的 seq,因此需要三次握手来约定确定双方的 ISN(初始 seq 序列号)
TCP 设计中一个基本设定就是,通过TCP 连接发送的每一个包,都有一个sequence number。而因为每个包都是有序列号的,所以都能被确认收到这些包。确认机制是累计的,所以一个对sequence number X 的确认,意味着 X 序列号之前(不包括 X) 包都是被确认接收到的。
由于通信过程的不可靠性,传输的数据不可避免的会出现丢失、延迟、错误、重复等各种状况,TCP协议为解决这些问题设计了一系列机制。这个机制的核心,就是发送方向接收方发送数据后,接收方要向发送方发送ACK(回执)。如果发送方没接收到正确的ACK,就会重新发送数据直到接收到ACK为止。比如:发送方发送的数据序号是seq,那么接收方会发送seq + 1作为ACK,这样发送方就知道接下来要发送序号为seq + 1的数据给接收方了。
如果要:
发送方确认接收方能收发数据
接收方确认发送方能收发数据
三次握手时必须的

    1. A --> B SYN my sequence number is X
    1. A <-- B ACK your sequence number is X
    1. A <-- B SYN my sequence number is Y
    1. A --> B ACK your sequence number is Y

2与3都是 B 发送给 A,因此可以合并在一起,因此成为three way (or three message) handshake(其实翻译为三步握手,或者是三次通信握手更为准确)
因此最终可以得出,三次握手是必须的:
三次握手才可以阻止重复历史连接的初始化(主要原因)
三次握手才可以同步双方的初始序列号
三次握手才可以避免资源浪费

四次挥手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  • 1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
  • 2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。同时告诉应用程序关闭连接
  • 3) 服务器关闭客户端的连接,发送一个FIN给客户端。
  • 4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
    HTTP协议是四层协议中的应用层,作为程序员必须了解的协议
    HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求,默认端口80。
    在这里插入图片描述

为什么要四次挥手

关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理
和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般
都会分开发送,从而比三次握手导致多了一次

HTTP的三个特点:
  • 1)HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 2)HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • 3)HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
    我们通过一个实验来说明HTTP
exec 4<> /dev/tcp/www.baidu.com/80
# 在Linux中 everything is file Linux把tcp通道抽象成一个文件
# 这条命令是打开Linux中的tcp通道
echo -e 'GET / HTTP/1.0\n' 1>& 4
# 这条命令是向通道发送请求,实际上GET / HTTP/1.0\n是HTTP请求行的格式
#使用标准输出1输出要发送的内容到socket对象4,向www.baidu.com:80端口发送请求,\n换行符表示本条消息结束,-e表示处理特殊字符
cat 0<& 4
# 查看HTTP答复

在这里插入图片描述

HTTP的请求方式GET和POST

表单提交中get和post方式的区别有5点

  • 1.get是从服务器上获取数据,post是向服务器传送数据。
  • 2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  • 3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
  • 4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。(这里有看到其他文章介绍get和post的传送数据大小跟各个浏览器、操作系统以及服务器的限制有关)
  • 5.get安全性非常低,post安全性较高。

Django框架,Flask框架和Tornado框架各有什么优缺点?为什么你的项目会选择使用Django框架?

Django:Python 界最全能的 web 开发框架,battery-include 各种功能完备,可维护性和开发速度一级棒。常有人说 Django 慢,其实主要慢在 Django ORM 与数据库的交互上,所以是否选用 Django,取决于项目对数据库交互的要求以及各种优化。而对于 Django 的同步特性导致吞吐量小的问题,其实可以通过 Celery 等解决,倒不是一个根本问题。Django 的项目代表:Instagram,Guardian。
Tornado:天生异步,性能强悍是 Tornado 的名片,然而 Tornado 相比 Django 是较为原始的框架,诸多内容需要自己去处理。当然,随着项目越来越大,框架能够提供的功能占比越来越小,更多的内容需要团队自己去实现,而大项目往往需要性能的保证,这时候 Tornado 就是比较好的选择。Tornado项目代表:知乎。
Flask:微框架的典范,号称 Python 代码写得最好的项目之一。Flask 的灵活性,也是双刃剑:能用好 Flask 的,可以做成 Pinterest,用不好就是灾难(显然对任何框架都是这样)。Flask 虽然是微框架,但是也可以做成规模化的 Flask。加上 Flask 可以自由选择自己的数据库交互组件(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等异步特性以后,Flask 的性能相对 Tornado 也不逞多让,也许Flask 的灵活性可能是某些团队更需要的。

一、Django
主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架
优点:
大和全(重量级框架)
自带orm,template,view
需要的功能也可以去找第三方的app
注重高效开发
全自动化的管理后台(只需要使用起ORM,做简单的定义,就能自动生成数据库结构,全功能的管理后台)
session功能
缺点:
template不怎么好用(来自自身的缺点)
数据库用nosql不方便(来自自身的缺点)
如果功能不多,容易臃肿
二、Torando
主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架
优点:
少而精(轻量级框架)
注重性能优越,速度快
解决高并发(请求处理是基于回调的非阻塞调用)
异步非阻塞
websockets 长连接
内嵌了HTTP服务器
单线程的异步网络程序,默认启动时根据CPU数量运行多个实例;利用CPU多核的优势
自定义模块
缺点:
模板和数据库部分有很多第三方的模块可供选择,这样不利于封装为一个功能模块
三、Flask
主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考Django 非常全面,属于短小精悍型框架
优点:
简单,Flask的路由以及路由函数由修饰器设定,开发人员不需要借助其他文件匹配;
配置灵活,有多种方法配置,不同环境的配置也非常方便;环境部署简单,Flask运行不需要借助其他任何软件,只需要安装了Python的IDE,在命令行运行即可。只需要在Python中导入相应包即可满足所有需求;
入门简单,通过官方指南便可以清楚的了解Flask的运行流程;
低耦合,Flask可以兼容多种数据库、模板。
缺点:
对于大型网站开发,需要设计路由映射的规则,否则导致代码混乱

ORM是什么?有什么优缺点?

一、ORM简介
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。
这种方案存在以下不足:
1.持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,毒药修改持久化曾的相关程序代码,增加了软件的维护难度。
ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java典型的ORM中间件有:Hibernate,ibatis,speedframework。
ORM的方法论基于三个核心原则:
  · 简单:以最基本的形式建模数据。
  · 传达性:数据库结构被任何人都能理解的语言文档化。
  · 精确性:基于数据模型创建正确标准化了的结构。

migrations和migrate有什么区别?

makemigrations:根据检测到的模型创建新的迁移。迁移的作用,更多的是将数据库的操作,以文件的形式记录下来,方便以后检查、调用、重做等等。
migrate:使数据库状态与当前模型集和迁移集同步。说白了,就是将对数据库的更改,主要是数据表设计的更改,在数据库中真实执行。例如,新建、修改、删除数据表,新增、修改、删除某数据表内的字段等等。

Django的请求生命周期是什么?

在这里插入图片描述

  1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
    请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中.
  2. url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配,
    一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了.
  3. 视图函数根据客户端的请求查询相应的数据.返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端.
  4. 客户端浏览器接收到返回的数据,经过渲染后显示给用户.

使用python完成快速排序算法

def quick_sort(unsorted_list, head, tail):
    """
    :param unsorted_list: 传入的是一个列表
    :param head: 列表的头
    :param tail: 列表的尾
    :return:
    """
    if head >= tail:
        return unsorted_list
    pivot = unsorted_list[head]
    low = head
    high = tail
    while low != high:
        while low < high and unsorted_list[high] >= pivot:
            high -= 1
        unsorted_list[low] = unsorted_list[high]

        while low < high and unsorted_list[low] < pivot:
            low += 1
        unsorted_list[high] = unsorted_list[low]

    unsorted_list[low] = pivot

    quick_sort(unsorted_list, head, low - 1)

    quick_sort(unsorted_list, low + 1, tail)

    return unsorted_list


if __name__ == '__main__':
    unsorted_list = [9, 8, 5, 4, 6, 7, 2, 3, 1, 10, 9]

    sorted_list = quick_sort(unsorted_list, 0, len(unsorted_list) - 1)

    print(sorted_list)

思路时通过一个标记点把整个数组分成2部分,左边都比pivot小,右边都比pivot大,递归到只有一个元素,就完成排序了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值