Linux 网络之 TCP
【摘要】 Linux 网络之 TCP 1. 介绍TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在 Linux 网络编程中占据核心地位,广泛应用于需要可靠数据传输的场景。 2. 应用使用场景Web 服务器:如 HTTP/HTTPS 协议基于 TCP。文件传输:如 FTP、SFTP 协议。数据库连接:如 MySQ...
Linux 网络之 TCP
1. 介绍
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在 Linux 网络编程中占据核心地位,广泛应用于需要可靠数据传输的场景。
2. 应用使用场景
- Web 服务器:如 HTTP/HTTPS 协议基于 TCP。
- 文件传输:如 FTP、SFTP 协议。
- 数据库连接:如 MySQL、PostgreSQL 使用 TCP 进行通信。
- 实时通信:如聊天应用、视频会议(部分基于 TCP)。
- 远程登录:如 SSH 协议。
3. 不同场景下的详细代码实现
场景 1:简单的 TCP 服务器和客户端
功能:实现一个 TCP 服务器和客户端,客户端发送消息,服务器接收并回复。
服务器端代码:
import socket
def start_server(host='127.0.0.1', port=65432):
# 创建 TCP 套接字
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
# 绑定地址和端口
server_socket.bind((host, port))
# 监听连接
server_socket.listen()
print(f"服务器正在 {host}:{port} 上监听...")
# 接受客户端连接
conn, addr = server_socket.accept()
with conn:
print(f"已连接客户端:{addr}")
while True:
# 接收数据
data = conn.recv(1024)
if not data:
break
print(f"收到数据:{data.decode()}")
# 发送回复
conn.sendall(b"已收到消息")
if __name__ == "__main__":
start_server()
客户端代码:
import socket
def start_client(host='127.0.0.1', port=65432):
# 创建 TCP 套接字
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client_socket:
# 连接到服务器
client_socket.connect((host, port))
# 发送数据
client_socket.sendall(b"你好,服务器!")
# 接收回复
data = client_socket.recv(1024)
print(f"收到回复:{data.decode()}")
if __name__ == "__main__":
start_client()
运行效果:
- 启动服务器:
服务器正在 127.0.0.1:65432 上监听... 已连接客户端:('127.0.0.1', 12345) 收到数据:你好,服务器!
- 启动客户端:
收到回复:已收到消息
场景 2:多客户端 TCP 服务器
功能:支持多个客户端同时连接,服务器为每个客户端创建一个线程处理请求。
服务器端代码:
import socket
import threading
def handle_client(conn, addr):
with conn:
print(f"已连接客户端:{addr}")
while True:
data = conn.recv(1024)
if not data:
break
print(f"收到来自 {addr} 的数据:{data.decode()}")
conn.sendall(b"已收到消息")
def start_server(host='127.0.0.1', port=65432):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
server_socket.bind((host, port))
server_socket.listen()
print(f"服务器正在 {host}:{port} 上监听...")
while True:
conn, addr = server_socket.accept()
# 为每个客户端创建一个线程
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
if __name__ == "__main__":
start_server()
客户端代码:
与场景 1 的客户端代码相同。
运行效果:
- 服务器可以同时处理多个客户端的连接和消息。
4. 原理解释
-
TCP 的三次握手:
- 客户端发送 SYN 报文给服务器。
- 服务器回复 SYN-ACK 报文。
- 客户端发送 ACK 报文,连接建立。
-
TCP 的四次挥手:
- 客户端发送 FIN 报文。
- 服务器回复 ACK 报文。
- 服务器发送 FIN 报文。
- 客户端回复 ACK 报文,连接关闭。
-
算法原理:
- 可靠传输:通过序列号、确认应答、超时重传等机制保证数据可靠传输。
- 流量控制:通过滑动窗口机制控制发送速率。
- 拥塞控制:通过慢启动、拥塞避免等算法避免网络拥塞。
-
流程图:
客户端 -> SYN -> 服务器 客户端 <- SYN-ACK <- 服务器 客户端 -> ACK -> 服务器 连接建立 数据传输 客户端 -> FIN -> 服务器 客户端 <- ACK <- 服务器 客户端 <- FIN <- 服务器 客户端 -> ACK -> 服务器 连接关闭
5. 测试步骤
- 安装 Python(如果未安装):
sudo apt install python3
- 运行服务器:
python3 server.py
- 运行客户端:
python3 client.py
- 检查服务器和客户端的输出是否符合预期。
6. 部署场景
- 本地测试:在本地机器上运行服务器和客户端。
- 局域网测试:将服务器部署到局域网中的一台机器,客户端从其他机器连接。
- 云服务器部署:将服务器部署到云服务器(如 AWS、阿里云),客户端从公网连接。
7. 材料链接
8. 总结
TCP 是网络编程中最重要的协议之一,提供了可靠的数据传输服务。通过 Python 的 socket
库,可以轻松实现 TCP 服务器和客户端。多客户端支持可以通过多线程或异步编程实现。
9. 未来展望
- 性能优化:使用异步 I/O(如
asyncio
)提高服务器性能。 - 安全性增强:集成 TLS/SSL 加密通信。
- 协议扩展:支持更多应用层协议(如 HTTP、FTP)。
- 跨平台支持:将代码移植到其他语言(如 C/C++、Go)或平台(如嵌入式设备)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)