Linux 传输层协议:UDP 和 TCP

举报
红尘灯塔 发表于 2025/02/06 09:36:27 2025/02/06
【摘要】 Linux 传输层协议:UDP 和 TCP 介绍在计算机网络中,传输层协议负责从应用层接收数据并将其发送到目标主机。两种主要的传输层协议是 UDP(用户数据报协议)和 TCP(传输控制协议)。TCP(Transmission Control Protocol):提供可靠的数据传输,通过三次握手建立连接,并确保数据按序、无差错地传递。适合需要可靠性和顺序保证的应用,如 HTTP、FTP、电子...

Linux 传输层协议:UDP 和 TCP

介绍

在计算机网络中,传输层协议负责从应用层接收数据并将其发送到目标主机。两种主要的传输层协议是 UDP(用户数据报协议)和 TCP(传输控制协议)。

  • TCP(Transmission Control Protocol)

    • 提供可靠的数据传输,通过三次握手建立连接,并确保数据按序、无差错地传递。
    • 适合需要可靠性和顺序保证的应用,如 HTTP、FTP、电子邮件。
  • UDP(User Datagram Protocol)

    • 是无连接的协议,提供快速但不可靠的数据传输,没有握手和确认机制。
    • 适用于对实时性要求高但对丢包不是特别敏感的场景,如视频流、在线游戏、VoIP。

应用使用场景

  • TCP 使用场景

    • Web 浏览器访问网站
    • 文件下载和上传
    • 电子邮件传输
  • UDP 使用场景

    • 实时视频会议
    • 在线游戏
    • DNS 查询

原理解释

TCP 原理

  • 连接建立:通过三次握手来建立连接。
  • 数据传输:数据在两个端点之间按序传递;如有必要,会进行重传。
  • 连接终止:四次挥手来关闭连接。

UDP 原理

  • 无连接模型:不需要建立连接即可发送数据。
  • 数据报文:每个数据包通过单独的 IP 发送,不保证顺序或完整性。
  • 简单高效:没有流量控制和错误恢复机制,适合快速传输。

算法原理流程图

TCP 连接流程图

  1. 三次握手

    Client -> SYN -> Server
    Client <- SYN/ACK <- Server
    Client -> ACK -> Server
    
  2. 数据传输

    Data transfer with acknowledgment and possible retransmissions
    
  3. 四次挥手

    Client -> FIN -> Server
    Client <- ACK <- Server
    Client <- FIN <- Server
    Client -> ACK -> Server
    

UDP 数据传输流程图

Client -> Message -> Server
  • 无需握手,直接发送消息。

实际详细应用代码示例实现

TCP 客户端和服务器(Python 示例)

TCP 服务器

import socket

# 创建 TCP/IP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(1)

print('等待客户端连接...')
connection, client_address = server_socket.accept()

try:
    print(f'已连接:{client_address}')
    while True:
        data = connection.recv(1024)
        if data:
            print(f"收到: {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)
client_socket.connect(('localhost', 8080))

try:
    message = 'Hello, TCP Server!'
    client_socket.sendall(message.encode())
    
    data = client_socket.recv(1024)
    print(f'收到: {data.decode()}')
finally:
    client_socket.close()

UDP 客户端和服务器(Python 示例)

UDP 服务器

import socket

# 创建 UDP/IP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 8080))

print('等待客户端消息...')
while True:
    data, address = server_socket.recvfrom(4096)
    print(f"收到来自 {address}: {data.decode()}")
    if data:
        sent = server_socket.sendto(data, address)

UDP 客户端

import socket

# 创建 UDP/IP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('localhost', 8080)

try:
    message = 'Hello, UDP Server!'
    client_socket.sendto(message.encode(), server_address)

    data, server = client_socket.recvfrom(4096)
    print(f'收到: {data.decode()}')
finally:
    client_socket.close()

测试步骤以及详细代码、部署场景

  1. 安装 Python

    • 确保系统上已安装 Python 环境。
  2. 运行服务器程序

    • 启动 TCP 或 UDP 服务器脚本。
  3. 运行客户端程序

    • 启动相应的 TCP 或 UDP 客户端脚本。
  4. 观察输出

    • 在客户端和服务器上查看消息传递过程及结果。
  5. 扩展场景

    • 调整 IP 地址和端口号进行局域网通信测试。

材料链接

总结

TCP 和 UDP 协议各自具有不同的优势和应用场景。TCP 提供了可靠的数据传输,适用于需要精确交付的应用。而 UDP 则以其快速和简单著称,适合实时性强的应用。根据需求选择合适的协议能显著提升网络应用的性能和用户体验。

未来展望

随着网络技术的进步,包括 QUIC 在内的新兴协议可能会替代部分传统 TCP 和 UDP 的用途。这些新协议旨在提高传输效率、减少延迟,并更好地支持现代互联网应用。随着物联网和 5G 技术的普及,对低延迟、高效传输的需求将持续推动这些协议的发展和优化。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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