说到网络基础就不得不提TCP/IP协议,老生常谈的问题之一:TCP与UDP区别?
TCP
TCP是一种面向有连接的传输层协议。可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外、TCP还能有利用贷款、缓解网络拥堵。然而,为了建立与断开连接,有时需要至少7次的发包收报,导致网络流量浪费。此外,为了提高网络利用率,TCP协议中定义了各种各样的复杂的规范,因此不利于视频会议等场合使用。
UDP
UDP是一种面向无连接的传输层协议。不会关注对端是否真的接受到了传送过去的数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。
基本区别
特点 | TCP | UDP |
---|---|---|
连接性 | 面向连接 | 面向非连接 |
资源消耗 | 高 | 低 |
可靠性 | 可靠 | 不可靠 |
数据单位 | 字节 | 报文 |
连接对象 | 点到点 | 一对一、一对多、多对一 |
传输效率 | 慢 | 快 |
- TCP面向连接(通讯首先要建立连接)、UDP面向无连接(不需要建立连接)。
- TCP消耗资源多(建立连接、数据传输、维护连接都消耗CPU、内存等硬件资源)、UDP消耗资源少(不用建立和维护连接,没有阻塞机制)。
- TCP提供可靠服务(无差错、不丢失、不重复、按顺序)通信信道是双工可靠信道、UDP尽最大努力提供服务(不保证可靠交付)不可靠信道。
- TCP面向字节流、UDP面向报文。
- TCP连接是点对点的连接、UDP可以是一对一、一对多、多对一。
- TCP首部20字节、UDP首部8字节。
应用场景
TCP
- 由于TCP采用校验和、序列号、确认应答、重发控制、连接管理、窗口控制等机制实现可靠性传输、消耗大量网络和硬件资源,所以对可靠性有严格要求的通信、基本都会采用TCP传输协议。
UDP
- 包总量较少的通信(DNS、SNMP等)。
- 视频、音频等多媒体通信(即时通信)。
- 现定于LAN等特定网络中的应用通信。
- 广播通信(广播、多播)。
编码实现
TCP
TCP编程的服务器端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt(); * 可选
- 绑定IP地址、端口等信息到socket上,用函数bind();
- 开启监听,用函数listen();
- 接收客户端上来的连接,用函数accept();
- 收发数据,用函数send()和recv(),或者read()和write();
- 关闭网络连接;
- 关闭监听;
TCP编程的客户端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt();* 可选
- 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
- 设置要连接的对方的IP地址和端口等属性;
- 连接服务器,用函数connect();
- 收发数据,用函数send()和recv(),或者read()和write();
- 关闭网络连接;
UDP
- UDP编程的服务器端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt();* 可选
- 绑定IP地址、端口等信息到socket上,用函数bind();
- 循环接收数据,用函数recvfrom();
- 关闭网络连接;
UDP编程的客户端一般步骤是:
- 创建一个socket,用函数socket();
- 设置socket属性,用函数setsockopt();* 可选
- 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
- 设置对方的IP地址和端口等属性;
- 发送数据,用函数sendto();
- 关闭网络连接;
注:本篇文章属于归纳、借鉴和参考了《图解TCP/IP》,和一些网络资料。