爬虫_练习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)

 

猜你喜欢

转载自www.cnblogs.com/MR-allen/p/10841397.html