目录
一、综述
1. TCP与UDP的概念
2. 特点
3. 区别
4. 对应的使用场景
二、补充
1. 基础概念
(1)面向连接
(2)可靠的
(3)字节流
2. 相关问题
(1)TCP 和 UDP 可以同时绑定相同的端口吗?
(2)多个 TCP 服务进程可以同时绑定同一个端口吗?
(3)客户端的端口可以重复使用吗?
一、综述
1. TCP与UDP的概念
- TCP(传输控制协议)是一种面向连接的、可靠的、基于 字节流 的传输层通信协议。
- UDP(用户数据报协议)为应用程序 提供了一种 无需建立连接 就可以发送封装的 IP 数据包的方法。
2. 特点
- TCP:面向连接,传输可靠,传输形式为 字节流,传输 效率慢,所需 资源多。
- UDP:无连接、传输不可靠、传输形式为 数据报文段,传输 效率快,所需 资源少。
3. 区别
- 是否面向连接:TCP 是 面向连接的 传输,UDP 是 无连接的 传输。
- 是否是可靠传输:TCP 是可靠的 传输服务,在传递数据之前,会有 三次握手来 建立连接;在数据传递时,有确认、窗口、重传、拥塞控制机制。UDP 是不可靠传输,数据传递 不需要给出 任何确认,且不保证数据 不丢失及 到达顺序。
- 是否有状态:TCP 传输是 有状态的,它会去 记录自己发送消息的 状态 比如消息 是否发送了、是否被接收了 等等,而 UDP 是无状态的。
- 传输形式:TCP 是 面向字节流的,UDP 是 面向报文的。
- 传输效率:由于 TCP 传输的时候 多了连接、确认重传等 机制,所以 TCP 的传输效率 要比 UDP 低。
- 首部开销:TCP 首部开销(20~60字节)比 UDP 首部开销( 8 字节)要大。
- 是否提供广播或多播服务:TCP 只支持 点对点 通信,UDP 支持 一对一、一对多、多对一、多对多。
4. 对应的使用场景
- TCP 常用于要求 通信数据 可靠场景(如 网页浏览、文件传输、邮件传输、远程登录、数据库操作等)。
- UDP 常用于要求 通信速度高场景(如 域名转换、视频直播、实时游戏等)。
二、补充
1. 基础概念
(1)面向连接
一定是「一对一」才能连接,不能像 UDP 协议可以 一个主机 同时向多个主机 发送消息,也就是 一对多是 无法做到的;
(2)可靠的
无论的 网络链路中 出现了怎样的 链路变化,TCP 都可以 保证一个报文 一定能够 到达 接收端;
(3)字节流
用户消息 通过 TCP 协议传输 时,消息可能会 被 操作系统「分组」成 多个的 TCP 报文,如果 接收方的 程序如果 不知道「消息的边界」,是无法 读出一个 有效的 用户消息的。并且 TCP 报文是「有序的」,当「前一个」TCP 报文 没有收到的 时候,即使 它先 收到了 后面的 TCP 报文,那么也 不能扔给 应用层 去处理,同时对「重复」的 TCP 报文 会自动丢弃。
2. 相关问题
(1)TCP 和 UDP 可以同时绑定相同的端口吗?
可以。
TCP 和 UDP 传输协议,在内核中是由 两个完全独立的 软件模块 实现的。当 主机 收到 数据包后,可以在 IP 包头的「协议号」字段 知道 该数据包 是 TCP/UDP,所以 可以 根据 这个信息 确定送给 哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的 报文根 据「端口号」确定 送给 哪个应用程序 处理。
因此,TCP/UDP 各自的端口号也相互独立,互不影响。
(2)多个 TCP 服务进程可以同时绑定同一个端口吗?
如果两个 TCP 服务进程 同时绑定的 IP 地址 和 端口都相同,那么执行 bind()时候 就会出错,错误是 “Address already in use"。
如果两个 TCP 服务进程 绑定的 端口 都相同,而 IP 地址不同,那么执行 bind()不会出错。
(3)客户端的端口可以重复使用吗?
在客户端执行 connect 函数的时候,只要 客户端连接的 服务器 不是同一个,内核 允许 端口重复使用。TCP 连接是由 四元组(源 IP 地址,源端口,目的 IP 地址,目的端口)唯一 确认的,那么 只要四元组中 其中一个 元素发生了 变化,那么就 表示不同的 TCP 连接的。
所以,如果 客户端 已使用端口 64992 与 服务端 A 建立了连接,那么 客户端 要 与 服务端 B 建立连接,还是可以 使用端口 64992 的,因为 内核是 通过 四元组 信息来 定位一个 TCP 连接的,并不会 因为 客户端的 端口号 相同,而导致 连接冲突的 问题。