TCP 和 UDP 协议的区别

TCP/IP 是个协议组,可分为三个层次:网络层传输层应用层

  • 在网络层有 IPICMPARPRARPBOOTP 协议。
  • 在传输层有 TCPUDP 协议。
  • 在应用层有 FTPHTTPTELNETSMTPDNSTFTP 等协议。

什是 TCP 协议

TCP是 Transmission Control Protocol 的简称,中文名是传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。在简化的计算机网络 OSI 模型中,完成第四层传输层所指定的功能。

TCP 是面向连接的、可靠的、缓慢的、可靠交付以及保证消息顺序的。TCP 用于实现可靠传输的情况,文件非常重要,对网络拥堵有较高的要求的情况。

什是 UDP 协议

UDP是 User Datagram Protocol 的简称,中文名是用户数据报协议,是一种无连接的、提供面向事务的简单且不可靠的传输层通信协议,由 IETF 的 RFC 768 定义。在简化的计算机网络 OSI 模型中,同样完成第四层传输层所指定的功能。UDP 在 IP 报文的协议号是 17。

UDP 是无连接的、不可靠的、没有序列保证,但是一个快速传输的协议。UDP 用于高速传输和实时性较高的场合(即时通信),UDP 常被用于广播和细节控制交给应用的通信传输。

TCP 和 UDP 的相同点

  1. TCP 和 UDP 在简化的计算机网络 OSI 模型中,都是传输层协议
  2. TCP 和 UDP 都是位于 IP 层之上
  3. TCP 和 UDP 都是保护网络层的传输,双方的通信都需要开放端口

TCP 和 UDP 的不同点

  1. TCP 是面向连接的协议,而 UDP 是无连接的协议。使用 TCP 协议在发送数据之前需要建立连接,而使用 UDP 协议在发送数据之前不需要建立连接。
  2. TCP 提供可靠的服务,而 UDP 提供不可靠的服务。使用 TCP 协议发送的消息是保证交付给客户端的,如果消息在传输过程中丢失,那么它将重发,这是由 TCP 协议本身控制的。
  3. TCP 保证数据的有序性,而 UDP 不保证数据的有序性
  4. TCP 不保存数据的边界,而 UDP 保证。TCP 中数据以字节流的形式发送,并没有明显的标志表明传输信号消息(段)的边界。在 UDP 中,数据包单独发送的,只有当它们到达时,才会再次集成。
  5. TCP 传输速度比较慢,而 UDP 传输速度较快。TCP 在传输数据之前必须先建立连接,以保证消息的可靠交付和有序性,需要做的事情比 UDP 多。
  6. TCP 是重量级的协议,而 UDP 是一个轻量级的协议。UDP 传输的信息中不承担任何间接创造连接,保证交货或秩序的的信息。
  7. TCP 数据包报头大,而 UDP 数据包报头小。TCP 数据包报头的大小是20字节,包含序列号、数据偏移量、控制标志、窗口、紧急指针、可选项、填充项、校验和、源端口和目的端口;UDP 数据报报头是8个字节,只包含长度、源端口号、目的端口、校验和。
  8. TCP 有流量控制,而 UDP 没有流量控制。TCP 在任何用户数据可以被发送之前,需要三数据包来设置一个套接字连接。
  9. TCP 对系统资源要求较多,而 UDP 对系统资源要求较少
  10. TCP 是点到点的,而 UDP 支持一对一、一对多、多对一和多对多的交互通信
  11. TCP 最适合需要高可靠且对传输时间要求不高的应用,而 UDP 适合需要快速且高效传输的应用
  12. TCP 被应用于 FTP、HTTP、HTTPS、TELNET、SMTP 等协议,而 UDP 被应用于 DNS、TFTP、DHCP、SNMP、TFTP 等协议

TCP 和 UDP 主要区别如下表所示:

TCP UDP
是否连接 面向连接 面向非连接
程序结构 复杂 简单
传输速度 较慢 较快
传输可靠性 可靠 不可靠
数据正确性 保证 不保证
数据有序性 保证 不保证
数据实时性 较低 较高
系统资源要求 较多 较少
应用场合 传输大量的数据,对可靠性要求较高的场合 传送少量数据、对可靠性要求不高的场景

TCP 和 UDP 的编程步骤

TCPUDP 的编程都是基于 Socket 实现的。

Socket 简介

Socket是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组编程接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

Socket 又称套接字,应用程序通常通过 Socket 向网络发出请求或者应答网络请求。

TCP 的编程步骤

  • TCP 编程的服务端一般步骤是:
    1、创建一个 socket,用函数 socket();
    2、设置 socket 属性,用函数 setsockopt(); 可选
    3、绑定 IP 地址、端口等信息到 socket 上,用函数 bind();
    4、开启监听,用函数 listen();
    5、接收客户端上来的连接,用函数 accept();
    6、收发数据,用函数 send()和 recv(),或者 read() 和 write();
    7、关闭网络连接;
    8、关闭监听;

  • TCP 编程的客户端一般步骤是:

    1. 创建一个 socket,用函数 socket();
    2. 设置 socket 属性,用函数 setsockopt(); 可选
    3. 绑定 IP 地址、端口等信息到 socket 上,用函数 bind(); 可选
    4. 设置要连接的对方的 IP 地址和端口等属性;
    5. 连接服务器,用函数 connect();
    6. 收发数据,用函数 send() 和 recv(),或者 read() 和 write();
    7. 关闭网络连接;

UDP 的编程步骤

  • UDP 编程的服务端一般步骤是:

    1. 创建一个 socket,用函数 socket();
    2. 设置 socket 属性,用函数 setsockopt(); 可选
    3. 绑定 IP 地址、 端口等信息到 socket 上,用函数 bind();
    4. 循环接收数据,用函数 recvfrom();
    5. 关闭网络连接;
  • UDP 编程的客户端一般步骤是:

    1. 创建一个 socket,用函数 socket();
    2. 设置 socket 属性,用函数 setsockopt(); 可选
    3. 绑定 IP 地址、端口等信息到 socket 上,用函数bind(); 可选
    4. 设置对方的 IP 地址和端口等属性;
    5. 发送数据,用函数 sendto();
    6. 关闭网络连接;socket() 的参数不同

编程步骤的区别

TCP 和 UDP 的编程步骤区别如下:

  1. TCP 服务端需要调用 listen() 和 accept(),而 UDP 服务端不需要调用这两个方法;
  2. TCP 收发数据用 send()/recv() 方法;而 UDP 收发数据用 sendto()/recvfrom() 方法;
  3. TCP 地址信息在 connect()/accept() 时确定;而 UDP 在 sendto()/recvfrom() 中每次均需指定地址信息;
  4. UDP 的 shutdown() 方法有效;而 UDP 的 shutdown() 方法无效。

为什么 UDP 有时比 TCP 更有优势

UDP 以其简单、传输快的优势,在越来越多场景下取代了 TCP,如实时游戏。TCP 的传输虽然是可靠的,但是需要付出的代价更大,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此 TCP 传输的效率不如 UDP 高。

  • 网速的提升给 UDP 的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。
  • TCP 为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于 TCP 内置的系统协议栈中,极难对其进行改进。

采用 TCP,一旦发生丢包,TCP 会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大;基于 UDP 对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。


评论
 上一篇
TCP 协议中的三次握手和四次挥手 TCP 协议中的三次握手和四次挥手
TCP 在传输之前会进行三次沟通,一般称为三次握手;传完数据断开的时候要进行四次沟通,一般称为四次挥手。 什是 TCP 协议TCP是 Transmission Control Protocol 的简称,中文名是传输控制协议,是一种面向连接的
2019-03-13
下一篇 
Android 中的 Handler 消息机制详解 Android 中的 Handler 消息机制详解
Android 应用程序是通过消息来驱动的,Android 某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个 Android 知识体系中也是尤其重要。 消息处理机制消息处理机制
2019-03-05
  目录