当前位置 博文首页 > 拿着锄头,坐在地头,抽着烟斗,摸着秃头。的博客:面试知识点

    拿着锄头,坐在地头,抽着烟斗,摸着秃头。的博客:面试知识点

    作者:[db:作者] 时间:2021-07-28 15:26

    1. http返回码: 1> 1xx:处理信息,服务器收到请求,需要用户继续执行。

      ? 2> 2xx:请求成功。

      ? 3> 3xx:请求重定向

      ? 4> 4xx:客户端错误

      ? 5> 5xx:服务器端错误

    2. 二叉树节点遍历:

      1. 前序遍历: 先访问根节点,然后访问左节点,最后访问右节点(从上到下)
      2. 中序遍历: 先访问左节点,然后访问根节点,最后访问右节点(从左到右)
      3. 后序遍历: 先访问左节点,然后访问右节点,最后访问根节点(先访问叶子节点)
    3. 排序算法时间复杂度:

      1. O(n^2): 1> 冒泡排序 2>选择排序3>插入排序
      2. O(nlogn): 1>快速排序2>堆排序3>归并排序

      空间复杂度:

      ? 1.O(1): 插入、选择、冒泡、堆排序

      1. O(n): 归并排序

        1. O(nlogn): 快速排序
          1. O(n+m): 桶排序
    4. ip地址的分类:

      1. A类地址:地址范围1.0.0.1到127.255.255.254 A类IP地址的子网掩码为255.0.0.0
      2. B类地址:地址范围128.0.0.1-191.255.255.254 B类IP地址的子网掩码为255.255.0.0
      3. C类地址:192.0.0.1-223.255.255.254 C类IP地址的子网掩码为255.255.255.0
      4. D类地址:224.0.0.0到239.255.255.255
      5. E类地址: 以1111开头,保留地址。

    python基础知识点

    1. python常用内置函数

    1. abs(x): 返回数字x的绝对值或复数x的模
    2. ascii(obj): 把对象转换成ASCII码形式
    3. chr(x): 返回unicode编码为x的字符
    4. enumerate(iterable[,start]): 返回包含元素形式为(start,iterable[0]),(start+1,interable[1])....的迭代器对象,start表示索引的起始值
    5. frozentset([x]): 创建不可变的集合对象
    6. hasatter(obj,name): 测试对象obj是否有name的成员
    7. hex(x): 把整数x转换成十六进制串
    8. isinstance(obj,class-or-type-or-tuple): 测试对象obj是否属于指定类型
    9. iter(...): 返回指定对象的可迭代对象
    10. map(func,*iterables): 返回包含若干函数值的map对象,函数func的参数来自interables中指定的一个或多个对象
    11. oct(x): 把整数x转换成八进制串
    12. pow(x,y,z=None): 返回x的y次方,等价于x**y或(x**y)%z
    13. reversed(seq): 返回seq(可是列表,元组,字符串,range等对象)中所有元素的逆序后的迭代器对象
    14. round(x,[,小数位数]): 对x进行四舍五入,若不指定小数位数,则返回整数
    15. sorted(iterable,key=None,reverse=False): 进行排序,key指定排序规则,reverse指定是否倒序
    16. sum(x,start=0): 返回序列x中的所有元素之和,可指定起始值start,返回start+sum(x)
    17. zip(seq1,[,seq2[...]]): 返回zip对象,其中元素为(seq1[i],seq2[i],...)形式的元组,最终结果中包含的元素个数取决于所有参数序列或可迭代对象中最短的那个
    
    

    2. python中修饰器(装饰器)

    1. 装饰器(Decoration):
    	    - 装饰器是一种设计模式,经常用来实现"面向切面的编程"(AOP: 实现在不修改源代码的情况下,给程序动态添加功能的一种技术)
    2. 装饰器的作用:
    	    - 装饰器允许向一个现有的对象(函数)添加新的功能,同时又不改变其结构
    	    - 可以抽离出大量的函数中的和业务无关的功能 提高代码复用
    3. 应用场景:
    		- 插入日志、性能测试、事务处理、缓存、中间件、权限控制等
    闭包的三个条件: 
    	1. 一个函数中定义另一个函数
    	2. 内层函数需要引用外层函数的局部变量
        3. 外函数返回内函数的引用
    

    3. 容器

    # 容器(Container)
    
    1. 容器是一种把多个元素组成在一起的一种数据结构
    
    2. 容器中的元素是可以逐个迭代获取(Python自带)
    
    3. 可以使用成员关系操作符来判断元素是否在容器中 in / not in
    
    4. 容器在Python中并不是一个真实存在的类型,它是抽象的概念,不能直接实例化一个Container对象
    
    5. Python中常见的容器类型:
    	list、tuple、dict、str、set、frozenset(可以作为字典的Key)
    

    4. 可迭代对象(实现了__iter__方法)

    # 可迭代对象(iterable)
    
    1. 很多容器都是可迭代对象
        -  for i in 对象: 该对象就是一个可迭代对象
        -  实现__iter__方法
        
    2. 可以使用iter(iterable)返回一个迭代器     
      	-  一个对象可迭代的本质是 通过迭代器来实现的
      	l = [2,4,6,8,22]
      	iterator = iter(l)  	
    

    5. 迭代器(实现了__iter____next__)方法

    # 迭代器(iterator)
    
    1. iter(可迭代对象)可以返回这个对象的迭代器
    
    2. 任何实现了__iter__和__next__方法的对象都是迭代器对象
       迭代器如何实现迭代元素操作:
       l = [2,4,6,8,22]
       iterator = iter(l) # 获取迭代器
       next(iterator) / iterator.__next__() # 获取下一个元素
       迭代器获取可迭代对象中的元素是使用了__next__方法
       
     
    3. 迭代器对象是一个带状态的对象 __index记录当前迭代的位置 
    
    4. 迭代器也是一个可迭代对象, 而可迭代对象不一定是一个迭代器(next)  
       for i in l:   # l->iterator->next
            print(i)
    
       for i in iterator:  # iterator->next
        	print(i)
    

    6. 生成器(yield)

    # 生成器(generator)
    
    a. 生成一个列表,列表中的所有元素都会存内存中,如果列表中的元素比较多,会大量占用内存空间,如果列表的后续元素可以按照某种算法推算出来,此时就可以使用生成器来完成
    
    b. 生成器是一个特殊的迭代器  所以可以next(生成器)来获取下一个元素 
    
    l = [i for i in range(100)]
    
    1. 列表推导式将[]改为()
    g = (i for i in range(100))  # 返回了生成器
    
    2. yield关键字
    如果一个函数中包含了yield关键字,此时该函数就不再是一个普通的函数,而是一个生成器,调用函数在本质是构造了一个生成器
    
    def getNumber():
        print('aaaaaaaaaaa')
        for i in range(5):
            print('bbbbbbb')
            yield i    
     # yield相当于return返回了一个值,并且它会记住这个代码的位置,下一次迭代时,代码从上一次的位置继续执行
    
    n = getNumber()
    print(n)
    
    print(next(n))
    print(next(n))
    

    7. 回调函数

    定义: 回调函数不是用来直接调用的,而是作为参数传递给另一个函数,当另一个函数出发某个条件之后自动调用这个回调函数。

    8. 魔法方法

    魔法方法含义
    __new__(cls[,...])1. 一个对象实例化的时候调用的第一个方法 2. 第一个参数是这个类,其他参数直接传递给__init__()方法 3. __new__()方法决定是否调用__init__()方法,返回实例对象则调用,否则不调用。
    __init__()构造器,当一个实例被创建的时候调用的初始化方法
    __del__()析构器,当一个对象被销毁的时候调用
    __call__()允许一个类的实例象函数一样被调用:x(a,b)调用x.__call__(a,b)
    __len__()定义当被len()调用时的行为
    __repr__()定义当被repr()调用或者直接执行对象时的行为
    __str__()定义当被str()调用或者直接被打印时的行为

    9. 正则表达式

    1. [] 表示一个字符集或字符范围
    		- [xyz] 表示查找x或y或z的字符
    		- [a-z] 表示 a-z范围内的所有字符
    		- [0-9] 表示 0-9 字符
    		- [^a-z] 不包含a-z的字符
    2. ^
    	    匹配行首 ^abc  表示是以abc开头的
    3. $
    		匹配行尾 d$ 表示以d结尾的
    4. \ (反斜杠)
    	反斜杠后面加不同的字符,表示不同的特殊含义
    		\d 匹配任何的十进制的数 等价于[0-9]
    		\D 匹配任何的非十进制的数 等价于[^0-9]
    		\s 匹配任何的空白字符 \t \n \r
    		\S 同上取反
    		\w 匹配任何的字母、数字、下划线 [a-zA-Z0-9_]
    		\W 同上取反
    		\ 可以转义 用于取消元字符变成普通字符
    5. {n}  匹配n次  \d{3}
       {n,}  至少匹配n次
       {n,m} 匹配n到m次
    6. *
    		指定一个字符可以匹配零次或多次
    7. +
    	    匹配一次或多次
    8. ?
    	    匹配一次或零次
    9. .
    	   	匹配除\n和\r之外的任意的单个字符 
    

    10. 多线程与多进程

    1. 程序:是完成特定任务的一系列的指令(代码)的集合,或者是打包好的二进制的可执行的文件.(程序本身是一个静态实体)
    
    2. 进程:是一个具有一定功能的程序在一个数据集上的一次动态执行过程,是操作系统进行资源分配和调度的一个独立单位(进程是动态实体)
    		- 一个应用程序的实例对应着一个进程
    		- 进程是操作系统动态执行的基本单元,它可以申请和拥有系统资源
    		- 进程有自己独立的空间(数据空间:文本域、数据域、堆栈域)
    	特征:
    		- 动态性:进程的实质是程序在操作系统中的一次执行过程,进程是动态产生的,动态消亡的+
             - 并发性:任何的进程都可以同其它的进程一起并发执行(多任务)
             - 独立性:进程是一个能独立运行的基本单位,同时也是操作系统分配资源和调度的独立单位.
          
    
    3. 线程:是操作系统能够进行运算调度的最小单位.
    		- 一个进程可以有多个线程,各个线程之间共享程序的空间(进程资源)    
    		- 一个进程中至少包含一个主线程  (一条河流至少有主流) 
    		- 线程与线程之间可以相互独立,但资源是共享的 
    		- 一个线程对应一个任务
    # 并行:
    	指在同一时刻,有多条指令在多个处理器上同时执行,所以无论是从微观还是宏观来看,二者都是一起执行的.
    # 并发:
    	指在同一时刻只能有一条指令执行,但是多个进程指令可以被快速的轮换着去执行,使得在宏观上具有多个进程同时执行的效果,但是在微观上并不是同时执行。(宏观并行微观串行)
    # 进程的三个状态:
    (1)运行状态:进程占用CPU,正在运行
    (2)就绪状态:进程具备运行条件,等待系统分配CPU资源以便运行
    (3)等待状态:又称为阻塞状态或睡眠状态,指进程不具备运行条件,正在等待某个事件完成 
    # 线程的五个状态:
    (1)创建状态:程序还没有开始运行线程中的代码,刚创建好线程
    (2)就绪状态:线程对象调用start()方法后启动了线程,然后进入就绪状态
    (3)运行状态:当线程获取到了CPU资源后,它才进入到运行状态
    (4)阻塞状态:线程中的任务暂停,不再占有CPU资源 sleep()、input
    (5)死亡状态:线程中的任务正常执行完毕或异常退出
    
    创建状态  ->  就绪状态  -> 运行状态 -> 死亡状态
                       阻塞状态
    

    11. GIL锁

    GIL:全局解释锁 Global Interpreter Lock
    
    1. GIL并不是Python语言的特性,Python不依赖于GIL,CPython中有GIL锁而JPython就没有
    
    2. GIL锁是为了解决多线程之间数据完整性和状态同步的问题(安全),设计为在任意时刻只有一个线程在解释器中运行. 
    
    3. GIL锁极大的影响了多线程的效率,让多线程几乎等同于单线程
    
    4. 由于GIL锁的存在,只有拥有GIL锁的线程才会拥有CPU资源,执行任务
    
    5. 对于计算密集型的任务(进行数学计算、矩阵运算、图像处理、视频编解码等),使用多线程(伪多线程)去处理,反而会由于多线程之间来回切换(获取锁和释放锁)导致效率很低(一个进程只有一个GIL锁) - 使用多进程解决
    
    6. 虽然存在GIL锁,但是Python的多线程切换速度很快,所在在宏观上依然是'并行',但是微观上是串行.   
    

    12. 猴子补丁

    定义: monkey patch 允许在运行期间动态修改一个类或模块。

    13.列表与元组的区别

    1.	元组和列表都属于序列
    2. 	列表属于可变序列,它的元素可以随时修改或者删除,而元组属于不可变序列,其中元素是不能修改的,除非整体赋值
    3. 	列表可以使用很多方法实现添加与修改元素,而元组没有办法,同样不能删除。
    4. 	列表可以使用切片方法访问和修改列表中的元素,元组也支持切片,但是只能通过切片访问,不支持修改。
    5. 	元组比列表的访问速度和处理速度快。
    6. 	列表不能作为字典类型中的建,而元组是可以的。
    总结: 列表:有序,可变
    	  元组: 有序,不可变
    

    14. 字典与集合的区别

    字典: 哈希表,无序可变,没有重复
    集合: 无序,可变。
    

    15.字典与JSON格式的区别

    从本质上讲,字典是一种数据结构,而JSON是一种格式;字典有许多内置函数,有多种调用方法,而json是数据打包的一种格式,并不像字典具备操作性,并且格式上有一些形式上的限制,比如,JSON格式必须要求只能使用双引号作为key或者值的边界符号,不能使用单引号,而字典无所谓。
    

    操作系统

    进程与线程

    线程间的通信是共享的,讲安全: 信号量,锁,原子操作。
    进程间的通信是独立的,讲通讯:管道,共享内存。
    
    

    计算机基础

    进制之间的转换

    https://jingyan.baidu.com/article/495ba84109665338b30ede98.html

    计算机网络

    https://blog.csdn.net/qq_39322743/article/details/79700863

    计算机网络体系结构

    # 计算机网络体系结构设计的基本思想:分而治之的思想就是我们熟知的分层思想,分层思想的内涵就是:每层在自己下层所提供的服务的基础上,通过自身内部功能实现一种特定的服务。
    1. 计算机网络体系结构的概念:
    		计算机网络体系结构必须包括三个内容,即分层结构与每层的功能,服务与层间接口 和 协议。所以计算机网络体系结构的定义为:在计算机网络中,层、层间接口及协议的集合被称为计算机网络体系结构。
    2. 计算机网络体系结构的标准: 
    		目前,由国际化标准组织ISO制定的网络体系结构国际标准市OSI七层模型,但实际上在应用中最广泛的是TCP/IP体系结构。换句话说,OSI七层模型知识理论上的、官方制定的国际标准,而TCP/IP体系结构才是事实上的国际标准。
    		需要指出的是五层体系结构虽然综合了OSI和TCP/IP的优点,但其只是为了学术学习研究而提出的,没有具体的实际意义。
    
    # OSI七层体系结构由低到高层为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
    # TCP/IP四层体系结构由低到高为:网络接口层、网际层、传输层、应用层。
    # 原理体系结构五层由低到高: 物理层、数据链路层、网络层、运输层、应用层。
    

    OSI网络体系结构与TCPIP协议模型.png-51.3kB

    一、OSI七层体系结构

    1. 物理层
    	简述: 在OSI参考模型中,物理层是参考模型的最底层,也是OSI模型的第一层。它实现了相邻计算机节点之间比特流的透明传送,并尽可能地屏掉具体传输介质和物理设备的差异,使其上层(数据链路层)不必关心网络的具体传输介质。“透明传送比特流” 的意思是经实际电路传送后比特流没有发生变化,对传送的比特流来说,这个电路好像看不见。
    (1) 任务:
    		在物理介质上正确的、透明的传送比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。
    (2) 协议(标准):
    		规定了物理接口的各种特性和物理设备的标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
    (3) 功能:
    		实现相邻计算机节点之间比特流的透明传输,尽可能的屏蔽掉具体传输介质和物理设备的差异,使数据链路层不必关心网络的具体传输介质。
    
    2. 数据链路层
    	简述: 数据链路层使OSI模型的第二层,负责建立和管理节点间的链路,控制网络层与物理层之间的通信。它完成了数据在不可靠的物理线路上的可靠传递。我们知道,在计算机网络中,由于各种干扰的存在,物理链路是不可靠的。为了保证数据的可靠传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来西东数据的结构包,它不仅包括原始数据,还包括发送方和接收方的物理地址以及纠错和控制信息。其中的物理地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错的传递。换句话说,这一层在物理层提供的比特流的基础上,通过差错控制、流量控制的方法,使有差错的物理线路变为无差错的数据链路,即提供可靠的通过物理介质传输数据的方法。
    (1) 任务:
    		通过各种数据链路层控制协议,实现数据在不可靠的物理线路上的可靠传递。
    (2) 协议:
    		负责提供物理地址寻址、数据的成帧、流量控制、差错控制等功能,确保数据的可靠传输。
    (3) 功能与服务:
    		接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。此外,该层还负责提供物理地址寻址、数据的成帧、流量控制、差错控制等功能。差错控制是指处理接收端发回的确认帧的信息(对等层通信),以便提供可靠的数据传输;流量控制是指抑制发送方的传输速率,使接收方来得及接收。
    
    3. 网络层
    	简述: 网络层使OSI模型的第三层,他是OSI参考模型中最发杂的一层,也是通信子网的最高一层,它在下两层的基础上向资源子网提供服务。网络层主要任务是将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。特别地,网络层将通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A到另一个网络中节点B的最佳路径。
    		网络层使可选的,它只用于当两个计算机系统处于不同的由路由器分隔开的网段这种情况,或者当通信应用要求某种网络层或传输层提供的服务、特性或者能力时。对于两台主机处于同一个LAN网段的直接相连这种情况,他们之间的通信只是用LAN的通信机制就可以了,即OSI参考模型的物理层和数据链路层。
    (1) 任务:
    		将网络地址翻译成对应的物理地址,并通过路由选择算法为分组通过通信子网选择最适当的路径。
    (2) 协议:
    		提供无连接数据报服务的IP协议
    (3) 产品:
    		路由器
    (4) 路由选择:
    		网络层最重要的一个功能就是:路由选择。网络层会依据速度、距离(步跳数)、价格和拥塞程度等因素在多条通信路径中找一条最佳路径。所谓路由,一般包括路由表和路由算法两个方面。事实上,每个路由器都必须建立和维护其路由表,一种时静态维护,也就是人工设置,只是用与小型网络;另一种是动态维护,是在运行过程中根据网络情况自动的动态维护路由表。
    (5) 数据链路层与网络层的差异:
    		一般地,数据链路层是解决同一网络内节点之间的通信,而网络层主要解决不同子网间的通信,例如,广域网间的通信。
    		· 寻址:数据链路层中使用的物理地址(如MAC地址)仅解决网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会分配一个唯一的地址。由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址);
    		·路由算法: 当源节点和目的节点之间存在多条路径时,网络层可以根据路由算法,通过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。
    		· 连接服务: 与数据链路层流量控制不同的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。
    

    数据链路层与网路层.png-58.4kB

    4. 传输层
     	简述: OSI下3层(物理层,数据链路层和网络层)的主要任务是数据通信,上3层(会话层,表示层和应用层)的任务是数据处理,而传输层恰好是OSI模型的第四层,是通信子网和资源子网的接口和桥梁,起到承上启下的作用。该层的作用是向高层屏蔽下层数据通信的细节,即向用户透明的传送报文。
     	传输协议同时进行流量控制,即基于接收方可接受数据的快慢程度规定适当的发送速率。除此之外,传输层按照网络能处理的最大尺寸将较大的数据进行强制分割(例如,以太网无法接收大于1500字节的数据包),发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,一边数据到达接收方节点的传输层,能以正确的顺序重组,这个过程也叫做排序。
    (1) 任务:
    		在源端与目的端之间提供可靠的透明数据传输,使上次服务用户不必关心通信子网的实现细节。
    (2) 协议:
    		TCP/IP中的TCP,UDP协议、Novell网络中是SPX协议和微软的NetBIOS/NetBEUI协议。其中,TCP(传输控制协议)具有传输效率低、可靠性强等等特点,用于传输可靠性要求高,数据量大的数据;UDP(用户数据包协议)用于传输可靠性要求不高,数据来小的数据,如QQ聊天数据就是通过这种方式传输的。
    (3) 功能与服务:
    		传输层提供会话层和网络层之间的传输服务,这种服务从会话层获得数据,并在必要时,对数据进行分割。然后,传输层将数据传递到网络层,并确保数据能正确无误的传到送网络层。因此,传输层负责提供两节点之间数据的可靠传送,当两节点的联系确定之后,传输层则负责监督工作。综上,传输层的主要功能如下:
    		·传输连接管理: 提供建立、维护和拆除传输连接的功能,传输层在网络层的基础上为高层提供”面向连接“和”面向无连接“的两种服务;
    		·处理传输差错: 提供可靠的”面向连接“和不太可靠的“面向无连接”的数据传输服务、差错控制和流量控制。在提供“面向连接”服务时,通过这一层传输的数据将由目标设备确认,如果在制定的时间内未收到确定信息,数据将被重发。
    (4) 传输层的特点: 
    		·传输层以上各层面向应用,本层及以下各层面向传输;
    		·实现源主机到目的主机“端到端” 的连接。
    (5) 传输层与网络层的区别:
    		在协议栈中,传输层位于网络层之上,传输层协议为不同主句上运行的进程提供逻辑通信,而网络层协议为不同主机提供逻辑通信。
    		实际上,网络层可以看作时传输层的一部分,其为传输层提供服务。但对于终端系统而言,网络层对他们而言是透明的,他们知道传输层的存在,也就是说,在逻辑上他们认为是传输层为他们提供了端对端的通信,这也是分层思想的妙处。
    

    img

    5. 会话层
    	简述: 会话层是OSI模型的第五层,是用户应用程序和网络之间的接口,负责在网络中的两节点之间建立、维持和终止通信。会话层的功能包括:建立通信连接,保持会话过程通信连接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。
    	有人把会话层称作网络通信的“交通警察”。当通过拨号向你的ISP(因特网服务提供商)请求连接到因特网时,ISP 服务器上的会话层向你与你的PC机上的会话层进行协商连接。若你的电话线偶然从墙上插孔脱落时,你终端机上的会话层将检测到连接中断并重新发起连接。
    
    6. 表示层
    	简述: 表示层是OSI模型的第六层,它对来自应用层的命令和数据进行解释,以确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如:PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。这时表示层会实现多种数据格式之间的转换。也就是说,表示层的主要功能是处理用户信息的表示问题,如编码、数据格式转换和加密解密等。表示层的具体功能如下:
    	·数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异;
    	·数据的编码:处理字符集和数字的转换。例如由于用户程序中的数据类型(整形或实型、有符号或无符号等)、用户标识等都可以由不同的表示方式,因此,在设备之间需要具有在不同字符集或格式之间转换的功能;
    	·压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与恢复;
    	·数据的加密和解密:可以提高网络的安全性。
    
    7. 应用层
    	简述: 应用层是OSI参考迷信的最高层,他是计算机用户以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务并完成用户希望在网络上完成的各种工作。应用层在其他六层工作的基础上,负责王城网络中应用程序和网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。
    	应用层为用户提供的服务和协议有: 文件服务、目录服务、文件传输服务(FTP)、远程登陆服务(TeInet)、电子邮件服务(E-mail)、打印服务、安全服务、网络管理服务、数据库服务、域名服务等。上述的各种网络服务由改成的不同应用协议和程序完成,不同的网络操作系统之间在功能、界面、实现及技术、对硬件的支持、安全可靠性以及既有的各种应用程序接口等各个方面的差异是很大的。
    (1) 任务:
    		为用户的应用进程提供网络通信服务。
    (2)	服务:
    		该层具有的各种应用程序可以完成和实现用户请求的各种服务。
    (3) 功能:
    		· 用户应用程序与网络间的接口
    		· 使用户的应用程序能够与网络进行交互式联系。
    (4) 协议:
    		OSI: VTP、MHS、FTAM、DS、....
    		TCP/IP: TeInet、SMTP、FTP、DNS、Http、...
    

    二、TCP/IP四层体系结构

    1.应用层
    	应用层决定了向用户提供应用服务时通信的活动。TCP.IP协议族内预存了各类通用的应用服务,比如FTP(文件传输协议)和DNS(域名系统)服务就是其中两类,HTTP协议也处于该层。
    
    2.传输层
    	传输层对于上层应用层提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(c传输控制协议)和UDP(用户数据报协议)。其中,TCP时面向连接的传输协议,也就是说,其在数据传输之前会建立连接,并把报文分解为多个段进行传输,在目的站再重新装配这些段,必要时重新传输没有收到或错误的,因此它是“可靠”的。而UDP时无连接的传输协议,其在数据传输之前不建立连接,并且对发送的段不行校验和确认,因此它是“不可靠”的。
    
    3.网络层
     	网络层用来处理再网络上流动的数据包,其中,数据包时网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是再总舵的选项内选择一条传输路线。也就是说,网络层主要功能是把数据包通过最佳路径送到目的端,其中,网际层的核心协议--IP,提供了无连接的数据包传输服务(不保证送达,不保序)。
    
    4.网络接口层
    	网络接口层用来处理连接网络的硬件部分,包括硬件的设备驱动、NIC(Network Interface Card,网卡)及光纤等物理可见部分,还包括连接器等一切传输媒介。也就是说,硬件上的范畴均在链路层的作用范围以内。
    

    总结

    这里写图片描述

    子网掩码

    定义: 子网掩码就是将一个ip地址划分为网络地址和主机地址。
    

    数据结构与算法

    算法:

    1.枚举法

    # 定义:所谓枚举法,指定是从可能的解集合中一一枚举各元素,用题目给定的检验条件判定哪些是无用的,哪些是有用的。能使命题成立的,即为其解。
    	解题步骤:
    		1. 对命题建立正确的数学模型
    		2. 根据命题确定的数据模型中各变量的变化范围(即可能解的范围)
    		3. 利用循环语句、条件判断语句逐步求解或证明
    		
    	特点: 算法简单,但有时运算较大。对于可能确定解的值域又一时找不到其他更好的算法时可以采用枚举法
    

    2.数据排序

    1. 选择排序:
    	# 基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最前,知道全部待排序的数据元素排完。
    2. 冒泡排序:
    	# 基本思想: 依次比较相邻的两个数,大数在前,小数在后,过程像冒泡,所以叫冒泡排序
    3. 插入排序:
    	# 基本思想: 1.设有n个数据已经在排好序的列表中 2.输入一个数后,将其放在恰当的位置。
    4. 希尔排序:
    	# 基本思想: 以八个元素为例子,开始时相隔4个成分,分别按组进行排序,这时每组2个成分,共4组;然后相隔两个成分,在安按组排序,每组2个,共4组.....最后,对所有相邻成分进行排序。
    5. 快速排序:
    	# 基本思想: 在无序区先找到一个基准,然后用此基准将当前无序区划分为两部分,一部分大于基准,一部分小于基准,先从左往右扫描,小于基准交换位置,然后从右往左,大于基准交换位置,直至无序区都排好序。
    6. 堆排序:
    	# 基本思想: 堆排序是一种树形排序,在排序过程中,将A[1..n]看成是完全二叉树的顺序存储结构,利用完全二叉树的双亲结点和孩子节点之间的内在关系来选择最小的元素。
    7. 归并排序:
    	# 基本思想:所谓归并排序是指将两个或两个以上有序的数列,合并成一个仍然有序的数列。
    

    3. 递推算法

    # 递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。一种特殊的迭代算法。
    

    4.递归算法

    # 递归特点是: 函数或过程中调用它自己本身。其中直接调用自己的是直接递归,而将A调用B,B以调用A的递归是间接递归。 (自顶向下)
    

    5.回溯算法

    # 为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。
    对于回溯算法的使用,首先要确定两个条件:
    	1.循环终止条件,即满足什么条件时,整个程序终止并输出结果
    	2.回溯条件,即满足什么条件时,回溯到上一个状态,否则继续进行循环
    

    6.贪心算法

    # 若在求解一个问题时,能根据每次所得到的局部最优解,推到出全局最优或最优目标。那么,我们可以根据这个策略,每次得到局部最优解答,逐步而推到出问题,这种策略叫做贪心法。
    

    7.分治算法

    # 所谓分治就是指分而治之,即将较大规模的问题分解成几个较小规模的问题,通过对较小规模问题的求解达到对整个问题的求解。当我们将问题分解成两个较小问题求解时的分治方法为二分法。
    分治的基本思想是将一个规模为 n 的问题分解为 k 个规模较小的子问题,这些子问题互相独立且与原问题相同。找出各部分的解,然后把各部分的解组合成整个问题的解。
    

    8. 深度优先搜索算法

    深度优先搜索所遵循的搜索策略是尽可能ì深?地搜索图。在深度优先搜索中,对于最新发现的节点,如果它还有以此为起点而未搜索的边,就沿此边继续搜索下去。当节点 v 的所有边都己被探寻过,搜索将回溯到发现节点 v 有那条边的始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被发现为止。即
    	⒈以给定的某个顶点 V0 为起始点,访问该顶点;
    	⒉选取一个与顶点 V0 相邻接且未被访问过的顶点 V1,用 V1 作为新的起始点,重复上述过程;
    	⒊当到达一个其所有邻接的顶点都已被访问过的顶点 Vi 时,就退回到新近被访问过的顶点 Vi-1,继续访问 Vi-1 尚未访问的邻接点,重复上述搜索过程;
     	⒋直到从任意一个已访问过的顶点出发,再也找不到未被访问过的顶点为止,遍历便告完成。
    这种搜索的次序体现了向纵深发展的趋势,所以称之为深度优先搜索。
    

    9. 广度优先搜索算法