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

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…...

建筑兔零基础自学python记录29|实战词云可视化项目——分人物阵营词云(上)7

我们在上次情感分析的基础上,不分积极消极,按文本中人物的阵营分为3队。可以猜想按照积极消极分类是有现成的feeling可以分析,但人物阵营却是没有现成资料,需要额外给出信息的。 图1 图2 上面两图的文字大小和数量有区别&#xf…...

Vi 编辑器基本使用指南

一、Vi 编辑器的启动与退出 启动 Vi 编辑器 在终端中,输入vi加上要编辑的文件名,如vi example.txt,如果example.txt存在,Vi 编辑器会打开该文件;若不存在,则会创建一个新的空文件并打开。如果只输入vi&am…...

22、《Spring Boot消息队列:RabbitMQ延迟队列与死信队列深度解析》

Spring Boot消息队列实战:RabbitMQ延迟队列与死信队列深度解析 引言 在现代分布式系统中,消息队列承担着解耦、削峰填谷和异步通信的重要职责。本文将深入探讨Spring Boot与RabbitMQ的整合应用,重点解析延迟队列与死信队列的实现原理及实战…...

linux 命令+相关配置记录(持续更新...)

linux 命令记录相关配置记录 磁盘切换 cd D:#这里表示切换到D盘查看wsl 安装的linux 子系统 wsl --list -vwsl 卸载 linux 子系统 wsl --unregister -xxx # xxx 表示子系统的名字备份Linux 子系统 导出 wsl --export xxx yyy # xxx 表示子系统的名字 yyy 表示压…...

ssh工具

文章目录 ssh简介ssh远程连接Linux下使用SSH安装安装ssh服务端安装ssh客户端 命令启动重启查看ssh的状态 ssh 配置文件ssh连接地址 配置文件基本配置注意通配符心跳和密钥ssh的Include跳板 ProxyJump内网穿透 Windows下使用SSH安装ssh 配置文件ssh连接地址 配置文件 ssh简介 s…...

LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师

背景 前面的文章通过 Ollama 私有化部署了 Qwen2.5 (7B) 模型,然后使用 Docker Compose 一键部署了 Dify 社区版平台。 LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库:在 Dify 平台上,通过普通编排的方式,创建了基于…...

Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(二)

在 GPU0 和 GPU1 之间共享数据 在某些情况下,也许可以在某些时候带来更好的用户体验: GPU0 和 GPU1 来自同一个 IHV。GPU0 可以将操作系统无法解读的显示配置相关信息传递给 GPU1。 数据 Blob 由 GUID 描述,如果 GPU1 的驱动程序能理解数据…...

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…...

软考教材重点内容 信息安全工程师 第17章 网络安全应急响应技术原理与应用

17.1 网络安全应急响应概述 网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。 17.1.1 网络安全应急响应概念 网络安全应急响应是指为应对网络安全事件,相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作。 17.2.3 网络安…...

使用 DeepSeek + OmniParser v2 + UIAutomation 实现 GUI 应用自动化测试的探索

一、背景 UI 自动化测试一直是软件开发中的难点之一。尽管有许多工具和技术(如 Selenium、Appium 等)可以帮助我们实现自动化测试,但这些工具在面对复杂的 UI 变化时,往往需要大量的维护工作。随着人工智能技术的进步,尤其是自然语言处理(NLP)和计算机视觉(CV)技术的…...

Spring Security面试题

Spring Security面试题 基础概念 Q1: Spring Security的核心功能有哪些? public class SecurityBasicDemo {// 1. 基本配置public class SecurityConfigExample {public void configDemo() {ConfigurationEnableWebSecuritypublic class SecurityConfig extends …...

从零开始构建基于DeepSeek的智能客服系统

在当今的数字化时代,智能客服系统已经成为企业与客户沟通的重要桥梁。它不仅能够提升客户体验,还能大幅降低企业的运营成本。本文将带领你从零开始,使用PHP和DeepSeek技术构建一个功能强大的智能客服系统。我们将通过具体的案例和代码示例,深入探讨如何实现这一目标。 1. …...

Linux故障排查和性能优化面试题及参考答案

目录 如何查看 Linux 系统中的 CPU、内存、磁盘等资源使用情况? 什么是 Linux 中的负载(Load Average)?如何解读它? 如何通过 top 和 htop 命令监控系统性能? 如何使用 mpstat 命令来查看 CPU 的利用情况? 如何分析系统 CPU 瓶颈? 如何分析 CPU 瓶颈?如何优化 CP…...

【无人集群系列---大疆无人集群技术进展、技术路线与未来发展方向】

大疆无人集群技术进展、技术路线与未来发展方向 一、技术进展1. 核心技术创新(1)集群协同控制技术(2)感知与能源系统升级 2. 行业应用落地(1)智慧城市与安防(2)应急救援(…...

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示,在编辑器内显示成img标签,二次保存视频被替换问题 问题1&#xff1…...

ubuntu windows双系统踩坑

我有个台式机,先安装的ubuntu,本来想专门用来做开发,后面儿子长大了,给他看了一下星际争霸、魔兽争霸,立马就迷上了。还有一台windows的笔记本,想着可以和他联局域网一起玩,在ubuntu上用wine跑魔…...

嵌入式八股文(五)硬件电路篇

一、名词概念 1. 整流和逆变 (1)整流:整流是将交流电(AC)转变为直流电(DC)。常见的整流电路包括单向整流(二极管)、桥式整流等。 半波整流:只使用交流电的正…...

flink使用demo

1、添加不同数据源 package com.baidu.keyue.deepsight.memory.test;import com.baidu.keyue.deepsight.memory.WordCount; import com.baidu.keyue.deepsight.memory.WordCountData; import org.apache.flink.api.common.RuntimeExecutionMode; import org.apache.flink.api.…...

OpenCV(8):图像直方图

在图像处理中,直方图是一种非常重要的工具,它可以帮助我们了解图像的像素分布情况。通过分析图像的直方图,我们可以进行图像增强、对比度调整、图像分割等操作。 1 什么是图像直方图? 图像直方图是图像像素强度分布的图形表示&am…...

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下&#xf…...