当前位置: 首页 > article >正文

Python常见面试题的详解16

1. 如何强行关闭客户端和服务器之间的连接?

在网络编程中,有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接,由于其面向连接的特性,需要采取特定的步骤来确保连接被正确关闭;而 UDP 是无连接协议,处理方式相对简单。

服务器端(TCP)

python

import socket# 创建 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_socket.bind(('localhost', 8888))
# 开始监听
server_socket.listen(1)print("Waiting for a connection...")
# 接受客户端连接
conn, addr = server_socket.accept()
print(f"Connected by {addr}")try:# 强制关闭连接# 先禁用读写conn.shutdown(socket.SHUT_RDWR)# 关闭连接conn.close()print("Connection closed.")
except Exception as e:print(f"Error closing connection: {e}")

客户端(TCP)

python

import socket# 创建 TCP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
client_socket.connect(('localhost', 8888))try:# 强制关闭连接client_socket.shutdown(socket.SHUT_RDWR)client_socket.close()print("Connection closed.")
except Exception as e:print(f"Error closing connection: {e}")

服务器端(UDP)

python

import socket# 创建 UDP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定地址和端口
server_socket.bind(('localhost', 8888))try:# 停止接收数据并关闭套接字server_socket.close()print("UDP socket closed.")
except Exception as e:print(f"Error closing UDP socket: {e}")
  • 要点
  1. TCP 连接关闭需要先使用 shutdown 方法禁用读写,再调用 close 方法关闭连接。
  2. UDP 连接直接调用 close 方法关闭套接字。
  3. 在实际应用中,强行关闭连接可能会导致数据丢失或未完成的操作中断。因此,在关闭连接之前,最好确保所有必要的数据已经传输完成。另外,对于 TCP 连接,shutdown 方法可以指定不同的参数,如 socket.SHUT_RD 表示关闭读通道,socket.SHUT_WR 表示关闭写通道。

2. 说明 TCP 和 UDP 的区别以及优缺点

TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是两种常见的传输层协议,它们在连接性、可靠性、有序性、传输效率和首部开销等方面存在明显差异。

python

import socket# TCP 服务器示例
def tcp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('localhost', 8888))server_socket.listen(1)print("TCP server is listening...")conn, addr = server_socket.accept()data = conn.recv(1024)print(f"Received from {addr}: {data.decode()}")conn.close()# UDP 服务器示例
def udp_server():server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)server_socket.bind(('localhost', 8889))print("UDP server is listening...")data, addr = server_socket.recvfrom(1024)print(f"Received from {addr}: {data.decode()}")server_socket.close()if __name__ == "__main__":import threadingtcp_thread = threading.Thread(target=tcp_server)udp_thread = threading.Thread(target=udp_server)tcp_thread.start()udp_thread.start()
  • 要点

对比项

TCP

UDP

连接性

面向连接,需三次握手建立连接,四次挥手断开连接

无连接,直接发送数据

可靠性

提供可靠传输,有确认、重传、滑动窗口机制

不可靠,可能丢包、乱序

有序性

保证数据有序接收

不保证数据有序

传输效率

相对较低,有连接建立和断开开销

相对较高,无连接开销

首部开销

一般为 20 字节

固定为 8 字节

优点

可靠、有序,适用于文件传输、网页浏览

高效、开销小,适用于实时性要求高的场景

缺点

效率低、资源占用多

不可靠、不保证有序

在选择使用 TCP 还是 UDP 时,需要根据具体的应用场景来决定。例如,对于视频会议、在线游戏等对实时性要求较高的应用,即使可能会有少量数据丢失,也更适合使用 UDP;而对于文件下载、电子邮件等对数据准确性要求较高的应用,则应选择 TCP。

3. 简述浏览器通过 WSGI 请求动态资源的过程

WSGI(Web Server Gateway Interface)是 Python Web 应用程序和 Web 服务器之间的标准接口,它定义了 Web 服务器如何与 Python 应用程序进行通信。浏览器通过 WSGI 请求动态资源的过程涉及多个环节。

python

def simple_app(environ, start_response):"""简单的 WSGI 应用"""status = '200 OK'headers = [('Content-type', 'text/plain; charset=utf-8')]start_response(status, headers)return [b'Hello, World!']if __name__ == '__main__':from wsgiref.simple_server import make_serverhttpd = make_server('localhost', 8000, simple_app)print("Serving on port 8000...")httpd.serve_forever()
  • 要点
  1. 浏览器发起 HTTP 请求。

  2. Web 服务器(如 Apache、Nginx)接收请求。

  3. Web 服务器将请求信息封装成符合 WSGI 规范的环境变量和可调用对象,调用 WSGI 应用程序。

  4. WSGI 应用程序处理请求,可能访问数据库、调用其他服务。

  5. WSGI 应用程序返回响应信息。

  6. Web 服务器将响应信息封装成 HTTP 响应,发送给浏览器。

  7. 浏览器解析渲染页面。

WSGI 使得 Python Web 应用程序可以在不同的 Web 服务器上运行,提高了代码的可移植性。常见的 Python Web 框架如 Flask、Django 都遵循 WSGI 规范。

4. 说明浏览器访问 www.baidu.com 的过程

当用户在浏览器中输入 www.baidu.com 并回车后,浏览器会经历一系列步骤来获取并显示百度的网页。

python

import sockettry:ip = socket.gethostbyname('www.baidu.com')print(f"The IP address of www.baidu.com is {ip}")
except socket.gaierror as e:print(f"DNS resolution error: {e}")
  • 要点
  1. DNS 解析:浏览器先检查本地 DNS 缓存,若没有则向本地 DNS 服务器查询,本地 DNS 服务器若没有则逐级向根 DNS 服务器、顶级域名 DNS 服务器、权威 DNS 服务器查询,最终获取目标网站的 IP 地址。

  2. TCP 连接:使用获取到的 IP 地址和端口号(通常是 80 或 443),通过三次握手与服务器建立 TCP 连接。

  3. HTTP 请求:浏览器向服务器发送 HTTP 请求,包含请求方法、URL、请求头和请求体。

  4. 服务器处理请求:服务器根据请求内容进行处理,可能涉及数据库查询、应用程序调用等。

  5. HTTP 响应:服务器处理完请求后,向浏览器发送 HTTP 响应,包含响应状态码、响应头和响应体。

  6. 浏览器解析渲染页面:浏览器解析响应内容,构建 DOM 树、CSSOM 树,合并成渲染树,进行布局和绘制。

  7. TCP 连接关闭:页面渲染完成后,通过四次挥手关闭 TCP 连接。

在实际过程中,还可能涉及到 HTTPS 协议的加密和解密过程,以及缓存策略的应用,以提高访问速度和性能。

5. 说明Post 和 Get 请求的区别

Post 和 Get 是 HTTP 协议中常用的两种请求方法,它们在参数传递方式、安全性、数据长度限制、缓存和使用场景等方面存在差异。

python

import requests# Get 请求示例
response_get = requests.get('https://www.example.com', params={'key': 'value'})
print(f"Get response status code: {response_get.status_code}")# Post 请求示例
data = {'key': 'value'}
response_post = requests.post('https://www.example.com', data=data)
print(f"Post response status code: {response_post.status_code}")
  • 要点

对比项

Get

Post

参数传递方式

参数附加在 URL 后面

参数放在请求体中

安全性

参数暴露在 URL 中,不安全

参数在请求体中,相对安全

数据长度限制

URL 长度有限制

无数据长度限制

缓存

会被浏览器缓存

一般不会被缓存

使用场景

适用于获取数据

适用于提交数据

在实际开发中,需要根据具体的需求选择合适的请求方法。同时,对于敏感信息的传递,即使使用 Post 请求,也建议采用 HTTPS 协议进行加密传输。

6. 说明cookie 和 session 的区别

Cookie 和 Session 是 Web 开发中用于跟踪用户状态的两种机制,它们在存储位置、安全性、数据大小、有效期和应用场景等方面有所不同。

python

from flask import Flask, request, make_response, sessionapp = Flask(__name__)
app.secret_key = 'your_secret_key'@app.route('/set_cookie')
def set_cookie():resp = make_response('Setting cookie...')resp.set_cookie('username', 'John')return resp@app.route('/get_cookie')
def get_cookie():username = request.cookies.get('username')return f'Cookie username: {username}'@app.route('/set_session')
def set_session():session['user'] = 'John'return 'Setting session...'@app.route('/get_session')
def get_session():user = session.get('user')return f'Session user: {user}'if __name__ == '__main__':app.run(debug=True)
  • 要点

对比项

Cookie

Session

存储位置

客户端浏览器

服务器端

安全性

不安全,可能被分析和欺骗

相对安全,数据在服务器端

数据大小

单个 Cookie 不超过 4K,一个站点最多保存 20 个

无数据大小限制

有效期

可通过 ExpiresMax - Age 控制

默认浏览器关闭失效,可设置延长

应用场景

保存基本信息,如用户名、偏好设置

保存登录状态、购物车信息

在使用 Cookie 和 Session 时,需要注意安全性问题。对于 Cookie,可以设置 HttpOnlySecure 属性来提高安全性;对于 Session,需要对会话 ID 进行加密和管理,防止会话劫持。

7.  HTTP 协议有哪些状态码

HTTP 状态码是服务器返回给客户端的三位数字代码,用于表示请求的结果。常见的状态码可以分为五类。

python

import requestsresponse = requests.get('https://www.example.com')
print(f"Response status code: {response.status_code}")
  • 要点

状态码分类

含义

常见状态码及说明

1xx(信息性状态码)

表示临时响应,用于通知客户端部分请求已被接收

100 Continue:客户端应继续发送请求

2xx(成功状态码)

表示请求成功

200 OK:请求成功;201 Created:资源已创建;204 No Content:请求成功但无返回内容

3xx(重定向状态码)

表示需要进一步操作以完成请求

301 Moved Permanently:资源永久移动;302 Found:资源临时移动;304 Not Modified:资源未修改,可使用缓存

4xx(客户端错误状态码)

表示客户端请求有错误

400 Bad Request:请求语法错误;401 Unauthorized:未授权;403 Forbidden:服务器拒绝执行;404 Not Found:资源不存在

5xx(服务器错误状态码)

表示服务器处理请求时出现错误

500 Internal Server Error:服务器内部错误;502 Bad Gateway:网关或代理接收到无效响应;503 Service Unavailable:服务器临时不可用

在实际开发中,根据不同的状态码可以进行相应的处理。例如,当返回 404 状态码时,可以显示自定义的错误页面;当返回 500 状态码时,需要记录错误日志以便排查问题。

8. 什么是三次握手和四次挥手

三次握手是 TCP 建立连接的过程,确保双方都有发送和接收数据的能力;四次挥手是 TCP 断开连接的过程,确保双方都能正确关闭连接。

python

# 模拟三次握手
def three_way_handshake():print("Client: SYN, seq=x")print("Server: SYN+ACK, seq=y, ack=x+1")print("Client: ACK, ack=y+1")print("Connection established.")# 模拟四次挥手
def four_way_wave():print("Client: FIN, seq=u")print("Server: ACK, ack=u+1")print("Server: FIN, seq=v")print("Client: ACK, ack=v+1")print("Connection closed.")if __name__ == "__main__":print("Three-way handshake:")three_way_handshake()print("\nFour-way wave:")four_way_wave()
  • 要点

三次握手

  1. 客户端发送 SYN 包,请求建立连接。

  2. 服务器发送 SYN+ACK 包,同意建立连接并确认客户端请求。

  3. 客户端发送 ACK 包,确认服务器请求,连接建立。

四次挥手

  1. 客户端发送 FIN 包,请求关闭连接。

  2. 服务器发送 ACK 包,确认客户端关闭请求。

  3. 服务器发送 FIN 包,请求关闭连接。

  4. 客户端发送 ACK 包,确认服务器关闭请求,连接断开。

三次握手和四次挥手是 TCP 协议保证连接可靠性的重要机制。在实际网络环境中,可能会出现丢包、超时等情况,需要通过重传机制来确保连接的正常建立和关闭。

9. 什么是 TCP 的 2MSL

MSL(Maximum Segment Lifetime)是指一个 TCP 分段在网络中最大的生存时间。2MSL 即两倍的 MSL 时间。在 TCP 连接关闭过程中,主动关闭连接的一方在发送最后一个 ACK 包后,会进入 TIME - WAIT 状态并保持 2MSL 时间。

python

# 模拟 TCP 连接关闭进入 TIME - WAIT 状态
def tcp_connection_close():print("Client sends FIN to close connection.")print("Server sends ACK.")print("Server sends FIN.")print("Client sends ACK and enters TIME - WAIT state for 2MSL.")if __name__ == "__main__":tcp_connection_close()
  • 要点
  1. MSL 是 TCP 分段在网络中的最大生存时间。

  2. 2MSL 是主动关闭连接方在 TIME - WAIT 状态的停留时间。

不同的操作系统对 MSL 的定义可能不同,一般来说,MSL 的值在 30 秒到 2 分钟之间。2MSL 时间的设置是为了保证 TCP 连接的可靠



友情提示:本文已经整理成文档,可以到如下链接免积分下载阅读

https://download.csdn.net/download/ylfhpy/90411385

相关文章:

Python常见面试题的详解16

1. 如何强行关闭客户端和服务器之间的连接? 在网络编程中,有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接,由于其面向连接的特性,需要采取特定的步骤来确保连接被正确关闭;而 UDP 是无连接协议&a…...

BUU41 [GYCTF2020]FlaskApp1【SSTI】

题目: 加密处没啥事,但是解密的地方提交{{7*7}}就会返回报错界面,顺便把代码也爆出来了 text_decode base64.b64decode(text.encode()) 先将字符串 text编码为字节对象,然后使用 base64.b64decode 函数对这个字节对象进行 Base…...

今日运维之-Mac笔记本python环境问题

1. 问题:MAC升级系统后git报错? Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…...

Vue进阶之AI智能助手项目(五)——ChatGPT的调用和开发

AI智能助手项目 前端页面Layout布局页面-viewssrc/views/chat/layout/Permission.vuesrc/views/chat/layout/sider/index.vuesrc/views/chat/layout/sider/List.vuesrc/views/chat/layout/sider/Footer.vueComponents 组件Header/index.vueMessage/index.vue前端页面 Layout布…...

PYTHONPATH

‌PYTHONPATH‌是一个环境变量,用于告诉Python解释器在哪里查找模块和包。它是一个目录的搜索路径,用于导入Python代码‌。 PYTHONPATH的作用 ‌导入自定义模块‌:如果您有自己的Python模块,可以将它们添加到PYTHONPATH中&#…...

运维Ansible面试题及参考答案

目录 简述 Ansible 的工作原理,它是如何实现对远程主机管理的? Ansible 是基于什么语言开发的?这门语言的特性对 Ansible 的功能实现有哪些帮助? 解释 Agentless 在 Ansible 中的含义,与基于 Agent 的自动化工具相比,优势体现在哪? Ansible 中的 Inventory 文件是什…...

01.Zabbix 概述

Zabbix 概述 Zabbix 概述1. Zabbix 功能2. Zabbix 架构3. Zabbix Server 启动进程4. Zabbix 术语 Zabbix 概述 运维行业有句话: “无监控、不运维”,监控俗称“第三只眼”。没了监控,基础运维,业务运维都是“瞎子”。 所以说监控是运维这个职…...

MongoDB 数据库简介

MongoDB 数据库简介 引言 随着互联网技术的飞速发展,数据已经成为企业的重要资产。为了高效地管理和处理这些数据,数据库技术应运而生。MongoDB作为一种流行的NoSQL数据库,因其灵活的数据模型和高效的数据处理能力,受到了广泛的关注。本文将为您详细介绍MongoDB的基本概念…...

易基因:RNA甲基化修饰和R-loop的交叉调控:从分子机制到临床意义|深度综述

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 R-loop(RNA-DNA杂合结构)是转录调控、DNA复制和修复等关键细胞过程的重要组成部分。但R-loop异常积累可能会破坏基因组完整性,从而导致多种疾病的发生…...

八、Spring Boot:RESTful API 应用

创建第一个 Spring Boot RESTful API 应用 在现代 Web 开发中,RESTful API 是一种非常流行的设计风格,它基于 HTTP 协议,提供了简单、灵活的方式来构建网络应用。Spring Boot 作为一款强大的微服务框架,提供了丰富的工具和支持&a…...

NLP的预处理数据

处理文本数据的主要工具是Tokenizer。Tokenizer根据一组规则将文本拆分为tokens。然后将这些tokens转换为数字,然后转换为张量,成为模型的输入。模型所需的任何附加输入都由Tokenizer添加。 如果您计划使用预训练模型,重要的是使用与之关联的…...

取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票

在做航班智能客服问答系统时会遇到取消票证的场景,这里涉及数据库的操作时会把指定的票证从数据库中删除,同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前,需要先检查当前用户是否拥有这张票,只有票主才有权限取…...

Linux相关知识(文件系统、目录树、权限管理)和Shell相关知识(字符串、数组)

仅供自学,请去支持javaGuide原版书籍。 1.Linux 1.1.概述 Linux是一种类Unix系统。 严格来讲,Linux 这个词本身只表示 Linux内核,单独的 Linux 内核并不能成为一个可以正常工作的操作系统。所以,就有了各种 Linux 发行版&#…...

7种内外网数据交换方案全解析 哪种安全、高效、合规?

内外网数据交换方案主要解决了企业跨网络数据传输中的安全、效率与合规性问题。通过采用先进的加密技术、高效的数据传输协议以及严格的审批和审计机制,该方案确保了数据在内外网之间的安全交换,同时提高了传输效率,并满足了企业对数据合规性…...

深入解析React useEffect与useLayoutEffect:区别、原理与实践

🌌 ‌深入解析React useEffect与useLayoutEffect:区别、原理与实践 在React函数组件中,useEffect和useLayoutEffect是处理副作用的两个核心Hook。它们看似相似,但在执行时机和应用场景上有本质区别。本文将通过‌原理剖析‌、‌对…...

VMware中的linux常用指令

常用 Linux 基础命令 文件与目录操作 ls:查看当前目录的文件和子目录,ls -a显示所有文件,包括隐藏文件。cd:切换目录,如 **cd ~** 切换到个人家目录。pwd:查看当前目录。mkdir:创建文件夹&#…...

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中,有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统,能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…...

【论文学习】DeepSeek-R1 总结

文章目录 Abstract1. Introduction2. Approach2.1. Overview2.2. DeepSeek-R1-Zero: Reinforcement Learning on the Base Model2.3. DeepSeek-R1: Reinforcement Learning with Cold Start2.4. Distillation: Empower Small Models with Reasoning Capability 3. Experiment3.…...

在linux中利用conda安装blast

在 Linux 中使用 conda 安装 BLAST 非常简单。conda 是一个流行的包管理工具,可以轻松安装和管理生物信息学工具,包括 BLAST。以下是具体步骤: 1. 确保已安装 Conda 如果你还没有安装 conda,可以参考以下步骤安装 Miniconda&…...

Siddon算法参数说明及通俗解释

Siddon算法是一种用于快速精确计算三维CT数组中射线路径的算法。以下是该算法中每个参数的含义说明以及整个过程的通俗解释。 一、参数说明 参数含义X1​,Y1​,Z1​射线的起点坐标。X2​,Y2​,Z2​射线的终点坐标。X(a), Y(a), Z(a)射线的参数化表示,其中a是参数&…...

在 Windows 下的 Docker 中安装 R语言

以下是在 Windows 系统的 Docker 中安装 R 语言的详细教程,包括 Docker 的安装、配置以及如何在容器中运行 R 语言的步骤。 步骤 1:安装 Docker 下载 Docker Desktop 访问 Docker 官方网站:Docker Desktop: The #1 Containerization Tool for…...

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况:本科就读于电科软院,24年2月开始了解考研,24年3月开始数学,9月决定考本院(开始全天候图书馆学习)并开始专业课学习,11月底开始政治学习,最后…...

python 引用父目录:层级的模块

from pathlib import Path import sys 获取 project 目录 project_dir Path(file).resolve().parent.parent 将 project 目录添加到 sys.path 中 sys.path.append(str(project_dir)) 导入 support 模块 import support support.print_func(“Runoob”)...

git 查询包含某个文件夹的步骤

步骤 1:拉取最新的远程分支信息 确保本地缓存的远程分支信息是最新的: bash 复制 git fetch --all 步骤 2:遍历所有远程分支并检查目标文件夹 使用 git ls-tree 检查每个分支是否包含目标文件夹。以下脚本会列出所有包含 your_folder_pa…...

Linux中的查看命令

路径分为相对路径(行相对当前工作目录开始的路径)和绝对路径(不管是)#:命令提示符,从这个位置可以开始输入命令,另一个提示符为$,如果是root,则提示为#;如果是…...

DeepSeek技术提升,Linux本地部署全攻略

文章目录 1.Ollama部署1.1 安装Ollama1.2 配置Ollama1.3 下载deepseek模型 2.安装MaxKB可视化页面2.1 下载镜像2.2 运行容器2.3 配置MaxKB 3.配置Chatbox AI可视化页面 1.Ollama部署 Ollama下载地址 根据自己需求选择版本下载 1.1 安装Ollama 下载安装脚本并执行 curl -fs…...

在 Mac mini M2 上 MaxKb配置ollama,API域名无效的解决方案

环境说明 docker方案安装与使用的maxkb 本地ollama安装deekseek r1 解决方案 参考https://bbs.fit2cloud.com/t/topic/4165 mac m1用户,根据github的以下回复,成功绑定域名api 如果你想调用本地的ollama 中的大模型,域名试试:…...

使用torch.compile进行CPU优化

在PyTorch中,使用torch.compile可以自动地将模型转换成优化的执行代码,这对于提升模型在CPU上的运行效率尤其有用。torch.compile是基于TorchDynamo实现的,它可以将Python代码转换为高效的TorchScript代码。这对于那些在CPU上运行的大型模型尤…...

Java进阶(vue基础)

目录 1.vue简单入门 ?1.1.创建一个vue程序 1.2.使用Component模板(组件) 1.3.引入AXOIS ?1.4.vue的Methods(方法) 和?compoted(计算) 1.5.插槽slot 1.6.创建自定义事件? 2.Vue脚手架安装? 3.Element-UI的…...

B站pwn教程笔记-3

栈知识、部分保护措施 GDB显示的栈地址有时候并不是可靠的地址,gdb也是用特殊的进程映像来拿地址的。且gdb默认关闭栈地址随机化。但是,偏移量是没有错误的。目前还没学到咋解决 第一个栈帧是main函数栈帧,之前的一些系统函数什么的没有栈帧…...