面试题答案
一键面试1. 使用SSL/TLS
进行数据加密
设计思路:
在Python中,ssl
模块提供了对SSL/TLS
协议的支持。我们可以将普通的TCP套接字包装成SSL套接字,从而实现数据加密传输。
关键代码片段:
import socket
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('path/to/ca_cert.pem')
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(sock, server_hostname='example.com')
ssl_sock.connect(('example.com', 443))
2. 实现客户端对多个服务器的负载均衡
轮询算法
设计思路: 维护一个服务器列表,每次选择服务器时,按顺序依次选择。
关键代码片段:
servers = [('server1.com', 80), ('server2.com', 80), ('server3.com', 80)]
server_index = 0
def get_server():
global server_index
server = servers[server_index]
server_index = (server_index + 1) % len(servers)
return server
加权轮询算法
设计思路: 为每个服务器分配一个权重,根据权重来选择服务器,权重越高被选中的概率越大。
关键代码片段:
servers = [
('server1.com', 80, 3), # (host, port, weight)
('server2.com', 80, 2),
('server3.com', 80, 1)
]
total_weight = sum([server[2] for server in servers])
current_weight = 0
server_index = 0
def get_weighted_server():
global current_weight, server_index
while True:
server = servers[server_index]
current_weight += server[2]
if current_weight >= total_weight:
current_weight = 0
if current_weight >= server[2]:
server_index = (server_index + 1) % len(servers)
continue
return server
3. 处理网络抖动导致的连接中断和重连情况
设计思路:
在客户端代码中,捕获连接相关的异常(如ConnectionResetError
、ConnectionAbortedError
等),然后在异常处理中进行重连操作。
关键代码片段:
import time
max_retry = 5
retry_delay = 5
while True:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(sock, server_hostname='example.com')
server = get_server()
ssl_sock.connect(server)
# 正常通信逻辑
break
except (ConnectionResetError, ConnectionAbortedError) as e:
if max_retry <= 0:
raise
max_retry -= 1
time.sleep(retry_delay)