Linux 网络之 TCP

举报
William 发表于 2025/01/25 10:10:14 2025/01/25
【摘要】 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()
运行效果:
  1. 启动服务器:
    服务器正在 127.0.0.1:65432 上监听...
    已连接客户端:('127.0.0.1', 12345)
    收到数据:你好,服务器!
    
  2. 启动客户端:
    收到回复:已收到消息
    

场景 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 的三次握手

    1. 客户端发送 SYN 报文给服务器。
    2. 服务器回复 SYN-ACK 报文。
    3. 客户端发送 ACK 报文,连接建立。
  • TCP 的四次挥手

    1. 客户端发送 FIN 报文。
    2. 服务器回复 ACK 报文。
    3. 服务器发送 FIN 报文。
    4. 客户端回复 ACK 报文,连接关闭。
  • 算法原理

    • 可靠传输:通过序列号、确认应答、超时重传等机制保证数据可靠传输。
    • 流量控制:通过滑动窗口机制控制发送速率。
    • 拥塞控制:通过慢启动、拥塞避免等算法避免网络拥塞。
  • 流程图

    客户端 -> SYN -> 服务器
    客户端 <- SYN-ACK <- 服务器
    客户端 -> ACK -> 服务器
    连接建立
    数据传输
    客户端 -> FIN -> 服务器
    客户端 <- ACK <- 服务器
    客户端 <- FIN <- 服务器
    客户端 -> ACK -> 服务器
    连接关闭
    

5. 测试步骤

  1. 安装 Python(如果未安装):
    sudo apt install python3
    
  2. 运行服务器:
    python3 server.py
    
  3. 运行客户端:
    python3 client.py
    
  4. 检查服务器和客户端的输出是否符合预期。

6. 部署场景

  • 本地测试:在本地机器上运行服务器和客户端。
  • 局域网测试:将服务器部署到局域网中的一台机器,客户端从其他机器连接。
  • 云服务器部署:将服务器部署到云服务器(如 AWS、阿里云),客户端从公网连接。

7. 材料链接


8. 总结

TCP 是网络编程中最重要的协议之一,提供了可靠的数据传输服务。通过 Python 的 socket 库,可以轻松实现 TCP 服务器和客户端。多客户端支持可以通过多线程或异步编程实现。


9. 未来展望

  • 性能优化:使用异步 I/O(如 asyncio)提高服务器性能。
  • 安全性增强:集成 TLS/SSL 加密通信。
  • 协议扩展:支持更多应用层协议(如 HTTP、FTP)。
  • 跨平台支持:将代码移植到其他语言(如 C/C++、Go)或平台(如嵌入式设备)。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。