【网络面试篇】TCP与UDP类

目录

一、综述

[1. TCP与UDP的概念](#1. TCP与UDP的概念)

[2. 特点](#2. 特点)

[3. 区别](#3. 区别)

[4. 对应的使用场景](#4. 对应的使用场景)

二、补充

[1. 基础概念](#1. 基础概念)

(1)面向连接

(2)可靠的

(3)字节流

[2. 相关问题](#2. 相关问题)

[(1)TCP 和 UDP 可以同时绑定相同的端口吗?](#(1)TCP 和 UDP 可以同时绑定相同的端口吗?)

[(2)多个 TCP 服务进程可以同时绑定同一个端口吗?](#(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 连接的,并不会 因为 客户端的 端口号 相同,而导致 连接冲突的 问题。

相关推荐
源代码•宸11 小时前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
峰顶听歌的鲸鱼11 小时前
Kubernetes管理
运维·笔记·云原生·容器·kubernetes·云计算
旖旎夜光12 小时前
Linux(11)(中)
linux·网络
猿码优创13 小时前
过滤境外ip和域名访问的解决方案
网络·网络协议·tcp/ip·安全·阿里云
zhangrelay13 小时前
影响移动固态磁盘稳定性的原因有哪些呢?
笔记·学习
code bean14 小时前
深入理解:NO_PROXY 如何绕过代理
网络·代理
lkbhua莱克瓦2414 小时前
深入理解HTTP协议:从理论到SpringBoot实践
网络·笔记·后端·网络协议·http·javaweb
华硕之声15 小时前
苏式废土美学游戏
网络·数据·华硕
@@123456胡斌15 小时前
渗透文件内容
网络
charlie11451419115 小时前
计算机图形学速通指南笔记(0)
c++·笔记·软件工程·计算机图形学·工程实践