tcp/ip四层协议;tcp三次握手,四次分手;http请求;django,flask,tornado框架;orm;migrate,migrations;django请求生命周期
一.TCP/IP四层协议与模型:
TCP/IP------>Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议
是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、
TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传
输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
TCP/IP协议是Internet最基本的协议,其中应用层的主要协议有Telnet、FTP、SMTP等,是用来接收来自传输层的数据或者按不同
应用要求与方式将数据传输至传输层;传输层的主要协议有UDP、TCP,是使用者使用平台和计算机信息网内部数据结合的通
道,可以实现数据传输与数据共享;网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等;而网络访问层,
也叫网路接口层或数据链路层,主要协议有ARP、RARP,主要功能是提供链路管理错误检测、对不同通信媒介有关信息细节问
题进行有效处理等。
1.应用层:
数据链路层、网络层和传输层负责处理网络通信细节,这部分必须既稳定又高效,因此它们都在内核空间中实现。而应用层则在
用户空间实现,因为它负责处理众多逻辑,比如文件传输、名称查询和网络管理等。如果应用层也在内核中实现,则会使内核变
得非常庞大。当然,也有少数服务器程序是在内核中实现的,这样代码就无须在用户空间和内核空间来回切换(主要是数据的复
制),极大地提高了工作效率。不过这种代码实现起来较复杂,不够灵活,且不便于移植。
telnet协议是一种远程登录协议,它使我们能在本地完成远程任务。
应用层协议(或程序)可能跳过传输层直接使用网络层提供的服务,应用层协议(或程序)通常既可以使用TCP服务,又可以使
用UDP服务,比如DNS协议。我们可以通过/etc/services文件查看所有知名的应用层协议,以及它们都能使用哪些传输层服务。
2.运输层传输层:
传输层为两台主机上的应用程序提供端到端的通信。与网络层使用的逐跳通信方式不同,传输层只关心通信的起始端和目的端,
而不在乎数据包的中转过程。
传输层协议:TCP协议、UDP协议。
(1)TCP协议(Transmission Control Protocol,传输控制协议)为应用层提供可靠的、面向连接的和基于流的服务。TCP协议
使用超时重传、数据确认等方式来确保数据包被正确地发送至目的端,因此TCP服务是可靠的。使用TCP协议通信的双方必须先
建立TCP连接,并在内核中为该连接维持一些必要的数据结构,比如连接的状态、读写缓冲区,以及诸多定时器等。当通信结束
时,双方必须关闭连接以释放这些内核数据。TCP服务是基于流的。基于流的数据没有边界(长度)限制,它源源不断地从通信
的一端流入另一端。发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地将它们读出。
(2)UDP协议(User Datagram Protocol,用户数据报协议)则与TCP协议完全相反,它为应用层提供不可靠、无连接和基于数
据报的服务。“不可靠”意味着UDP协议无法保证数据从发送端正确地传送到目的端。如果数据在中途丢失,或者目的端通过数据
校验发现数据错误而将其丢弃,则UDP协议只是单地通知应用程序发送失败。因此,使用UDP协议的应用程序通常要自己处理数
据确认、超时重传等逻辑。UDP协议是无连接的,即通信双方不保持一个长久的联系,因此应用程序每次发送数据都要明确指定
接收端的地址(IP地址等信息)。基于数据报的服务,是相对基于流的服务而言的。每个UDP数据报都有一个长度,接收端必须
以该长度为最小单位将其所有内容一次性读出,否则数据将被截断。
3.网络层
通信的两台主机一般不是直接相连的,而是通过多个中间节点(路由器)连接的。网络层的任务就是选择这些中间节点,以确定
两台主机之间的通信路径。同时,网络层对上层协议隐藏了网络拓扑连接的细节,使得在传输层和网络应用程序看来,通信的双
方是直接相连的。
网络层最核心的协议是IP协议(Internet Protocol,因特网协议)。IP协议根据数据包的目的IP地址来决定如何投递它。如果数据
包不能直接发送给目标主机,那么IP协议就为它寻找一个合适的下一跳(next hop)路由器,并将数据包交付给该路由器来转
发。多次重复这一过程,数据包最终到达目标主机,或者由于发送失败而被丢弃。可见,IP协议使用逐跳(hop by hop)的方式
确定通信路径。
网络层另外一个重要的协议是ICMP协议(Internet Control Message Protocol,因特网控制报文协议)。它是IP协议的重要补
充,主要用于检测网络连接。ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,
它对于网络安全具有极其重要的意义。 [3] 它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交
换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP
消息。
4.数据链路层
数据链路层实现了网卡接口的网络驱动程序,以处理数据在物理媒介上的传输。
数据链路层两个常用的协议是ARP协议(Address Resolve Protocol,地址解析协议)和RARP协议(ReverseAddress Resolve
Protocol,逆地址解析协议)。它们实现了IP地址和机器物理地址之间的相互转换。
ARP,是根据IP地址获取物理地址的一个TCP/IP协议。诸暨发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主
机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,
下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以
自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某
一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗,ARP命令可用
于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。
RARP协议仅用于网络上的某些无盘工作站。因为缺乏存储设备,无盘工作站无法记住自己的IP地址,但它们可以利用网卡上的
物理地址来向网络管理者(服务器或网络管理软件)查询自身的IP地址。运行RARP服务的网络管理者通常存有该网络上所有机
器的物理地址到IP地址的映射。
二.TCP三次握手,四次分手:
三次握手:
第一步:客户端发送一个特殊的报文段给服务器端,该报文段叫SYN报文段(报文段首部仅SYN标志位被置1),不含任何应用
层数据。另外,客户端会随机选择一个初始序号x,并将此编号放置于该起始的TCP SYN报文段的序号段中,然后被封装在一个
IP数据报中,并发送给服务器。
第二步:包含TCP SYN报文段的IP数据报到达服务器主机,服务器会从该数据报中提取SYN报文段,并为该TCP连接分配TCP缓
存和变量,同时向客户端发送允许连接的报文段,这个报文段称为SYNACK报文段,也不包含应用层数据,但其首部包含3个重
要的信息。首先SYN标志位被置1,其次,确认号Ack被置为x+1,最后服务器选择自己的初始序号y,并将其放置到TCP报文段首
部的序号字段中。
这个允许连接的报文段实际上表明了:“我收到了你发起建立连接的SYN分组,该分组带有初始序号x。我同意建立该连接,我自
己的序号是y”。
第三步:客户端在收到SYNACK报文段之后,客户端也要给该TCP连接分配缓存和变量。客户端向服务器发送另外一个报文段,
表示对服务器的允许连接进行了确认,由于已经建立了连接,所以SYN置0(此时可以携带有效数据了)。三次握手的第三个阶
段可以在报文段负载中携带客户到服务器的数据。
四次分手:
第一步:客户应用进程发出一个关闭连接命令,这会引起客户TCP想服务器进程发送一个特殊的TCP报文段,称为FIN报文段
(首部只有一个标志位FIN置1)。
第二步:服务器收到FIN报文段后就向客户端会送一个确认报文段;
第三步:服务器发送自己的终止报文段,FIN置为1;
第四步:最后,客户端对这个服务器的终止报文段进行确认,此时,两台主机上用于该连接的所有资源都被释放了
问题:为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用
来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告
诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。
故需要四步握手。
三. HTTP的请求方式GET和POST有什么区别?
1.get是从服务器上获取数据,post是向服务器传送数据。
2.get在浏览器回退时是无害的,而post会再次提交请求。
3.get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段对应,在url中可以看到。post是
通过http post机制,将表单内各个字段与其内容放置在html header内一起传送到action属性所指的URL地址。用户看不到
这个过程。
4.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
5.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
6.对参数数据的限制:get只接受ascll字符,post没有限制
7.get请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留。
8.get安全性非常低,post安全性较高
四. Django框架,Flask框架和Tornado框架各有什么优缺点?
1.Django:Python 界最全能的 web 开发框架,battery-include 各种功能完备,可维护性和开发速度一级棒。常有人说 Django
慢,其实主要慢在 Django ORM 与数据库的交互上,所以是否选用 Django,取决于项目对数据库交互的要求以及各种优化。而
对于 Django 的同步特性导致吞吐量小的问题,其实可以通过 Celery 等解决,倒不是一个根本问题。Django 的项目代表
Instagram,Guardian。
2.Flask:微框架的典范,号称 Python 代码写得最好的项目之一。Flask 的灵活性,也是双刃剑:能用好 Flask 的,可以做成
Pinterest,用不好就是灾难(显然对任何框架都是这样)。Flask 虽然是微框架,但是也可以做成规模化的 Flask。加上 Flask 可
以自由选择自己的数据库交互组件(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等异步特性以后,Flask 的性能相对
Tornado 也不逞多让,也许Flask 的灵活性可能是某些团队更需要的。
3.Tornado:天生异步,性能强悍,然而 Tornado 相比 Django 是较为原始的框架,诸多内容需要自己去处理。当然,随着项目
越来越大,框架能够提供的功能占比越来越小,更多的内容需要团队自己去实现,而大项目往往需要性能的保证,这时候
Tornado 就是比较好的选择。Tornado项目代表:知乎。
五.什么是orm?有什么优势?
对象关系映射(Object Relational Mapping,简称ORM)
是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据
从一种形式转换到另外一种形式。 这也同时暗示着额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做
优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写
的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打
交道,只要像平时操作对象一样操作它就可以了 。
六. migrations和migrate有什么区别?
1.makemigration:
是用模型里面的模型和当前的迁移代码里面的模型做对比,如果有新的修改,就生成新的迁移代码。
2.migrate:
指令是用于迁移目录中间代码文件和Django的数据库django_migrations表中的代码文件做对比如果表中没有那就对这些文件按顺
序和依赖关系做迁移应用然后再把代码文件名加进迁移表中。
在改动models.py的内容之后执行: python manger.py makemigrations 先生成迁移代码会在该应用下会建立migrations目录,并
记录modes.py的改动,但是这个改动还没有作用到数据库文件,执行:python manager.py migrate命令后才会改动数据库。
七. Django的请求生命周期是什么?mi
首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串.在Django中,当我们访问一个的url时,会通过路由匹配进入相
应的html网页中.
Django的请求生命周期是指当用户在浏览器上输入url到用户看到网页的这个时间段内,Django后台所发生的事情