• 爬虫_小结03



    1、tcp和udp的区别?
      1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
      2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,
      且按序到达;UDP尽最大努力交付,即不保证可靠交付
      3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
      UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
      4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
      5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
      6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

    TCP三次握手过程:
      第一次握手:客户端(client)发送SYN包到服务器(server),
      客户端(client)状态机进入SYN_SEND状态,等待服务器确认;
      第二次握手:服务器(server)接收到SYN包,必须发送ACK包到客户端,
      同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态;
      第三次握手:客户端(client)接收到服务器发送的SYN+ACK包,
      必须向服务器发送确认包ACK,此包发送成功,则客户端和服务器同时进入ESTABLISHED状态。

    3次握手的特点:
      没有应用层的数据
      SYN这个标志位只有在TCP建产连接时才会被置1
      握手完成后SYN标志位被置0

    TCP建立连接要进行3次握手,而断开连接要进行4次

    四次挥手:
      假设客户端发起断开连接请求,
      第一次挥手:客户端(client)发送FIN报文到Server端
      第二次挥手:服务器(server)收到客户端发送的FIN包之后,发送ACK包到客户端,
      客户端收到服务器发送的ACK之后,进入FIN_WAIT状态,等待server端发送FIN报文
      第三次挥手:服务器(server)发送FIN报文到客户端
      第四次挥手:客户端收到服务器发送的FIN报文之后,发送ACK包到服务器,
      服务器收到ACK之后即断开连接,等待一段时间TIME_WAIT之后,
      客户端发现服务器没有再发FIN过来,就知道服务器已经断开连接,此时客户端也进入断开连接状态。

    名词解释:
       ACK TCP报头的控制位之一,对数据进行确认.确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了.
    比如,确认号为X,则表示前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性.
      SYN 同步序列号,TCP建立连接时将这设置为1   
      FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这设置为1

    2、对内存中栈和堆的了解?
      栈(stacks):栈的特点是后进先出。只能通过访问一端来实现数据的储存和检索的线性数据结构。
      a、栈的伸长和伸缩就是函数压入或者推出局部变量。
      b、我们不用自己去管理内存,变量创建和释放都是自动的。
      c、栈中的变量只有在函数创建运行时存在。
      堆:
      堆也是我们的计算机内存中的一个区域,但是他不是自动管理的。而且也不是被CPU密切的管理着。
      它是一片更加自由的内存区域(很大)。要想在堆上创建内存,我们必须使用malloc() 或者calloc(),
      他们都是C语言编译的。一旦你在堆上分配内存,当你不在需要的时候你必须用free()去销毁。如果你不销毁或者销毁失败,
      你的程序就会有内存泄露。换句话说就是堆内存会一直在,其他进程无法使用。
      不像栈,堆没有变量大小的限制(除了你电脑的物理限制条件外)。堆内存读出和写入都比较慢,因为它必须使用指针图访问堆内存。
      

      栈和堆的优缺点:
      栈:
      a、快速访问。
      b、没有必要明确的创建分类变量,因为它是自动管理的。
      c、空间被CPU高效地管理着,内存不会变成碎片。
      d、只有局部变量
      e、受限于栈大小(取决于操作系统)
      f、变量不能调整大小。
      堆:
      a、变量可以被全局访问
      b、没有内存大小限制
      c、(相对)访问比较慢
      d、没有高效地使用空间,随着块内存的创建和销毁,内存可能会变成碎片。
      e、你必须管理内存(变量的创建和销毁你必须要负责)
      f、变量大小可以用realloc( )调整

    3.字典、列表查询时的时间复杂度是怎样的?  
      列表是序列,可以理解为数据结构中的数组,字典可以理解为数据结构中的hashmap,python中list对象的存储结构采用的是线性表,
      因此其查询复杂度为O(n),而dict对象的存储结构采用的是散列表(hash表),其在最优情况下查询复杂度为O(1)。dict的占用内存稍比list大,
      会在1.5倍左右。

    4、递归中如果没有终止条件会怎样?
      递归如果没有终止条件会导致递归调用成为死循环而不能正常结束,并且会造成栈溢出

    5.去除列表中的重复元素
      list1 = [12,12,13,14,15,6,7,6,8,9,3,3,13]

      # list1 = list(set(list1))
      # print(list1)

    def distinct_list(list):
      d_l = []
      for i in list1:
        if i not in d_l:
        d_l.append(i)
      return d_l

    ret = distinct_list(list1)
    print(ret)

     

  • 相关阅读:
    【总结】java 后台文件上传整理
    【很重要】优秀的常用的js库
    封装常用的跨浏览器的事件对象EventUtil
    [H5表单]一些html5表单知识及EventUtil对象完善
    [H5表单]html5自带表单验证体验优化及提示气泡修改
    html5的audio实现高仿微信语音播放效果
    pcre
    tony_nginx_01_如何在linux系统下安装nginx、pcre、zlib、openssl工具
    Linux中编译、安装nginx
    Linux在本地使用yum安装软件
  • 原文地址:https://www.cnblogs.com/MR-allen/p/10841397.html
Copyright © 2020-2023  润新知