1、网络通信基础与网络协议
1.1 网络通信模型概述
网络通信是信息时代基石,它如同现实世界中的邮递系统,将数据从一处传递到另一处。其中,OSI七层模型与TCP/IP四层或五层模型是理解和构建网络通信的基础。
1.1.1 OSI七层模型与TCP/IP四层/五层模型
OSI(开放系统互连)参考模型提出了七层结构,从物理层到应用层,每一层都有其特定的功能和职责,例如物理层关注的是信号如何在介质上传输,而应用层则处理具体的应用程序交互。
相比之下,TCP/IP模型更为简洁实用,通常分为网络接口层、网络层、传输层和应用层四层(也有将其进一步划分为五层,增加会话层和表示层)。TCP/IP模型源于互联网的实际发展,其中IP协议负责网络层寻址和路由选择,TCP协议确保传输层的数据可靠传输。
例如,在发送电子邮件时,应用层(如SMTP协议)负责构造邮件内容,传输层的TCP保证邮件数据有序、无错地传输,而IP协议则负责邮件在全球互联网上的寻址和投递。
1.1.2 主要网络协议层次及其功能
物理层:定义了网络设备之间如何通过电信号、光信号等方式传输原始比特流。 示例代码(非真实代码,仅为示意):
# 假设有一个简单的模拟信号发生器
class SignalGenerator:
def transmit_bits(self, bits):
# 发送一组比特流到物理媒介
pass
数据链路层:封装成帧,错误检测,MAC地址识别等,如以太网协议。 网络层:IP协议在此层工作,主要负责寻址和路由选择,决定数据包从源到目的地的最佳路径。
import socket
# 创建一个IP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dest_ip = \’192.168.1.1\’ # 目标IP地址
传输层:TCP协议提供了面向连接、可靠的传输服务,UDP协议则提供了无连接、不可靠但速度快的数据传输服务。 应用层:HTTP、FTP、SMTP等各种应用程序使用的协议都位于这一层,它们决定了数据的具体形式和用途。 通过这些层层叠叠的协议栈,我们能够构建起丰富多彩的网络应用,无论是网页浏览、文件传输还是实时通讯,都离不开这些基础网络协议的支撑。
1.2 常见网络协议简介
1.2.1 IP协议与路由选择
IP协议如同邮政系统的邮编系统,为每台联网设备分配独一无二的IP地址,并使用路由表指导数据包在网络中寻找到达目的地的最佳路径。比如,当你在网上冲浪时,你的电脑就是通过IP协议将请求发送到全球各地的服务器。
# 获取本地主机IP地址
import socket
local_ip = socket.gethostbyname(socket.gethostname())
print(f\”本机IP地址: {
local_ip}\”)
1.2.2 TCP协议与可靠性传输
TCP协议像是一位严谨的快递员,他不仅确保每个包裹都能送达,还确保包裹按顺序到达,如有丢失或损坏,还会重新发送。TCP通过握手建立连接,通过序列号和确认应答保证数据可靠传输。
# Python中创建TCP服务器端
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind((\’localhost\’, 12345)) # 绑定本地IP和端口
server_sock.listen(5) # 开始监听连接请求
conn, addr = server_sock.accept() # 等待并接受客户端连接
...
# 客户端与服务器端之间的数据传输
data = conn.recv(1024) # 接收数据
conn.sendall(b\’ACK! Data received.\’) # 向服务器发送确认信息
1.2.3 UDP协议与无连接数据传输
UDP协议则更像一位急性子的投递员,一旦接收到数据就立即投递,不关心是否送达及顺序,因此速度更快,常用于对延迟敏感的应用,如在线视频会议、实时游戏等场景。
# Python中创建UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = b\’Hello, UDP world!\’
udp_socket.sendto(message, (\’localhost\’, 5005)) # 发送数据报文到指定地址
data, addr = udp_socket.recvfrom(1024) # 接收任意来源的数据报文
2、Python中的网络编程基础
2.1 Python socket模块介绍
2.1.1 socket对象的创建与属性
在Python中,socket模块是进行网络编程的核心工具,它提供了一种标准的方式来创建、配置并管理套接字。想象一下,套接字就像是一扇门,允许你的程序接入互联网这条大路,与其他远程主机进行交流。
创建一个新的socket对象就像开启这扇门一样简单,你可以根据需要选择不同的地址家族和协议类型。例如,创建一个IPv4环境下的TCP套接字:
import socket
# 创建一个TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 显示套接字的一些基本信息
print(f\”Socket type: {
tcp_socket.type}\”)
print(f\”Socket family: {
tcp_socket.family}\”)
2.1.2 Python中的地址家族与协议类型
地址家族:主要包括两种类型,AF_INET(IPv4)和AF_INET6(IPv6),分别对应不同版本的Internet协议地址。 协议类型:主要有两种,SOCK_STREAM(TCP)和SOCK_DGRAM(UDP)。TCP提供面向连接、可靠的数据传输服务;UDP则提供无连接、快速但可能丢包或乱序的数据传输服务。
2.2 Python中的TCP套接字编程
2.2.1 TCP服务器端开发步骤
2.2.1.1 绑定地址与监听连接
首先,服务器需要绑定一个本地地址(IP地址和端口号)来监听客户端的连接请求。例如,我们可以创建一个监听本地8000端口的TCP服务器:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((\’localhost\’, 8000))
server_socket.listen(5) # 设置最大挂起连接数为5
while True:
client_socket, client_address = server_socket.accept()
print(f\”Accepted connection from {
client_address[0]}:{
client_address[1]}\”)
# …此处可以处理来自客户端的数据…
2.2.1.2 接受客户端连接并通信
当有客户端连接时,accept()方法会返回一个新的套接字,用于与该客户端进行单独的数据交换:
# 在新线程中处理客户端连接
def handle_client(client_socket):
message = client_socket.recv(1024).decode(\’utf-8\’)
print(f\”Received message: {
message}\”)
response = \”Echo: \” + message
client_socket.sendall(response.encode(\’utf-8\’))
client_socket.close()
new_thread = threading.Thread(target=handle_client, args=(client_socket,))
new_thread.start()
2.2.2 TCP客户端编程实践
2.2.2.1 连接到服务器并发送数据
客户端需要知道服务器的地址和端口,然后发起连接请求:
client_socket
评论前必须登录!
注册