• 网络编程入门介绍:TCP 和 UDP


    目录

    1. 简介
    2. TCP:传输控制协议
    3. UDP:用户数据报协议
    4. TCP 与 UDP 的比较
    5. 总结

    简介

    计算机网络中,TCP(传输控制协议)和 UDP(用户数据报协议)是两种常用的传输层协议。它们在数据传输方式、可靠性和用途上有显著差异。本文将通俗易懂地介绍 TCP 和 UDP,帮助新手理解这两种协议。
    在这里插入图片描述

    TCP:传输控制协议

    TCP 的特点

    • 面向连接:TCP 在传输数据之前需要建立连接,类似于打电话前要拨号。
    • 可靠性:TCP 确保数据包按顺序、无丢失地传输到目标设备。
    • 流量控制:TCP 管理发送和接收数据的速率,避免网络拥塞。
    • 错误检测和恢复:TCP 能够检测数据传输中的错误,并进行重传。

    TCP 如何工作

    1. 建立连接:TCP 使用“三次握手”建立连接。
      • 客户端发送 SYN 请求。
      • 服务器收到请求并返回 SYN-ACK 确认。
      • 客户端收到确认后再发送 ACK 确认,连接建立。
    2. 数据传输:数据以段(Segment)为单位传输,每个段都包含序号,接收方按序接收并确认。
    3. 断开连接:使用“四次挥手”断开连接。
      • 客户端发送 FIN 请求。
      • 服务器收到请求并返回 ACK 确认。
      • 服务器发送 FIN 请求。
      • 客户端收到请求后返回 ACK 确认,连接断开。

    TCP 示例

    在这里插入图片描述

    场景:下载文件

    • 客户端请求下载文件,使用 TCP 连接确保文件完整无误地传输到客户端。

    TCP 实践样例

    下面是一个使用 Python 实现 TCP 客户端和服务器的示例:

    TCP 服务器
    import socket
    
    # 创建TCP/IP套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 绑定套接字到地址和端口
    server_address = ('localhost', 65432)
    server_socket.bind(server_address)
    
    # 监听传入连接
    server_socket.listen(1)
    
    print('等待连接...')
    connection, client_address = server_socket.accept()
    
    try:
        print('连接来自', client_address)
    
        # 接收数据并发送回去
        while True:
            data = connection.recv(1024)
            if data:
                print('收到:', data.decode())
                connection.sendall(data)
            else:
                break
    finally:
        # 关闭连接
        connection.close()
    
    TCP 客户端
    import socket
    
    # 创建TCP/IP套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 连接服务器
    server_address = ('localhost', 65432)
    client_socket.connect(server_address)
    
    try:
        # 发送数据
        message = '这是一个测试消息。'.encode()
        client_socket.sendall(message)
    
        # 接收响应
        data = client_socket.recv(1024)
        print('收到:', data.decode())
    finally:
        # 关闭连接
        client_socket.close()
    

    在这个示例中,TCP 服务器在 localhost 上的 65432 端口监听传入连接。客户端连接到服务器并发送一个测试消息。服务器接收消息并将其回显给客户端。

    UDP:用户数据报协议

    UDP 的特点

    • 无连接:UDP 不需要建立连接,直接发送数据,类似于发短信。
    • 不保证可靠性:UDP 不保证数据包的顺序和完整性,适用于对可靠性要求不高的场景。
    • 快速传输:UDP 适合实时应用,如视频流和在线游戏。

    UDP 如何工作

    1. 直接发送数据:UDP 将数据打包成数据报(Datagram),附加源和目的信息后直接发送。
    2. 无确认机制:发送方不等待接收方的确认,数据包可能丢失或乱序。

    UDP 示例

    在这里插入图片描述

    场景:视频通话

    • 视频通话需要快速传输数据,允许少量数据丢失,不影响整体体验,因此使用 UDP。

    UDP 实践样例

    下面是一个使用 Python 实现 UDP 客户端和服务器的示例:

    UDP 服务器
    import socket
    
    # 创建UDP套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 绑定套接字到地址和端口
    server_address = ('localhost', 65432)
    server_socket.bind(server_address)
    
    print('等待数据...')
    
    while True:
        data, address = server_socket.recvfrom(4096)
        print('收到:', data.decode(), '来自:', address)
    
        if data:
            sent = server_socket.sendto(data, address)
    
    UDP 客户端
    import socket
    
    # 创建UDP套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    server_address = ('localhost', 65432)
    message = '这是一个测试消息。'.encode()
    
    try:
        # 发送数据
        print('发送:', message.decode())
        sent = client_socket.sendto(message, server_address)
    
        # 接收响应
        data, server = client_socket.recvfrom(4096)
        print('收到:', data.decode())
    finally:
        client_socket.close()
    

    在这个示例中,UDP 服务器在 localhost 上的 65432 端口等待数据。客户端发送一个测试消息到服务器,服务器接收消息并将其回显给客户端。

    TCP 与 UDP 的比较

    特性TCPUDP
    连接类型面向连接无连接
    可靠性
    传输顺序保证不保证
    速度较慢较快
    传输单元段(Segment)数据报(Datagram)
    典型应用文件传输、网页浏览视频流、在线游戏

    总结

    TCP 和 UDP 各有优缺点,适用于不同的应用场景。TCP 适合需要高可靠性的数据传输,如文件下载和网页浏览。UDP 则适合对实时性要求高但允许少量数据丢失的应用,如视频通话和在线游戏。理解它们的工作原理和特点,有助于选择合适的协议来满足特定的网络需求。

    希望这篇文章能帮助你入门 TCP 和 UDP,进一步探索网络世界的奥秘。

  • 相关阅读:
    c++继承
    淘宝扭蛋机小程序开发:开启购物新纪元,探索乐趣无穷的互动体验
    在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理
    WampServer下载安装并结合cpolar内网穿透实现本地服务的公网访问
    PIX2SEQ: A LANGUAGE MODELING FRAMEWORK FOR OBJECT DETECTION
    SpringMVC框架的详细解读
    MYSQL数据库细节详细分析
    EM@从整数指数幂到实指数幂
    免费在线markdown转pdf
    centos7搭建EFK日志收集系统
  • 原文地址:https://blog.csdn.net/Ephemeroptera/article/details/139693037