网编面试题

第一部分 必答题

  1. 简述 OSI 7层模型及其作用?(2分)

    • 应用层:要发送的数据 HTTP/https协议

    • 表示层

    • 会话层

    • 传输层:定义端口,TCP/UDP协议,四层交换机,四层路由器

    • 网络层:IP协议,路由器,三层交换机

    • 数据链路层:mac arp协议,网卡,交换机(二层交换机)

    • 物理层:建立,维护,断开物理连接

  2. 简述 TCP三次握手、四次回收的流程。(3分)

    • 三次握手

      • client端将标志位SYN置为1,随机产生一个值sqe=J,并将该数据包发给server端,client端进入SYN_SENT状态,等待server端确认

      • server端收到数据包后,由SYN=1得知client要建立连接,server将标志位和ACK都置为1,确认client端的SYN(ack=j+1,ack是确认数据),随机产生一个值seq=K,将该数据包发给client端以确认连接请求,server端进入SYN_RECV状态

      • client端收到后,检查ack是否为J+1,ACK是否为1,如果正确,则将标志位ACK置为1,ack=k+1,并将数据包发送给server,server检查ack是否为K+1,ACK是否为1,如果正确则建立连接

    • 四次挥手

      • client向server发送fin的标记报文,请求断开

      • server收到后,可能正在处理数据,此时向client发送ack报文

      • server端处理完数据后,再次向client端发送fin报文,此时可以断开连接

      • client端收到后,向server端发送ack报文,确认可以断开连接

  3. TCP和UDP的区别?(3分)

    • TCP需要连接才能收发消息

      • 可靠

      • 速度慢

      • 面向连接

      • 全双工

      • 流式传输

      • 可传输大文件

      • 适用于:文件传输,实时通信,邮件等

    • UDP不需要连接就可收发消息

      • 不可靠

      • 速度快

      • 无链接

      • 面向数据报

      • 传输数据大小受限

      • 可多次发送消息

      • 多人通信

      • 适用于:即时通讯工具

  4. 什么是黏包?(2分)

    • TCP协议特有

    • 由于数据与数据之间是没有边界的,所以可能多个数据合在一起,叫做黏包

    • 可能发生在:

      • 客户端:client端处理/接收数据慢,造成多条数据黏包,或者接收的长度小于一次发送的长度

      • 服务端:server端发送两条数据间隔时间太短,造成两条数据黏在一起

  5. 什么 B/S 和 C/S 架构?(2分)

    • 浏览器/服务器架构:有浏览器就可以使用

      • 也是C/S架构的一种

      • 节省资源

      • 不用更新

      • 不依赖环境

    • 客户端/服务器架构:需要下载客户端才可使用

      • 安全性高

      • 程序一般较大

  6. 请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)

     # server
     import socket
     
     sk = socket.socket()
     sk.bind(("127.0.0.1",8888))
     sk.listen()
     
     conn,addr = sk.accept()
     msg = conn.recv(1024).decode("utf-8")
     print(msg)
     conn.close()
     sk.close()
     
     # client
     import socket
     
     sk = socket.socket()
     sk.connect(("127.0.0.1",8888))
     sk.send("你好!".encode("utf-8"))
     sk.close()

     

  7. 简述进程、线程、协程的区别?(3分)

    • 进程是计算机分配资源的最小单位

    • 线程是能被cpu调度的最小单位

    • 协程是不存在的,是程序员基于代码实现的

    • 进程之间不能共享资源,但可以通过文件/队列/网络实现资源共享

    • 一个进程中至少有一个线程

    • 一个进程中可以有多个线程,同一进程中的线程可以资源共享

    • 一个线程中可以有多个协程

    • 计算密集型用多进程

    • io密集型用多协程/多线程

  8. 什么是GIL锁?(2分)

    • 全局解释器锁

    • 同一时刻一个进程中只有一个线程可以被cpu调度

  9. 进程之间如何进行通信?(2分)

    • 通过文件/网络/队列实现通信

  10. Python如何使用线程池、进程池?(2分)

     from concurrent.futures import ThreadPoolExecutor
     
     pool = ThreadPoolExecutor(10)
     
     def func():
      print(11)
     
     for i in range(10):
      pool.submit(func)
     pool.shutdown(True)
     from concurrent.futures import ProcessPoolExecutor
     
     pool = ProcessPoolExecutor(10)
     
     def func():
      print(22)
     
     for i in range(10):
      pool.submit(func)
     
     pool.shutdown(True)

猜你喜欢

转载自www.cnblogs.com/hrose/p/12371385.html