作为 TCP/IP 中两个最具有代表性的传输层协议,TCP 和 UDP 经常被拿出来相互比较。这些协议具体有什么区别,又是什么作用呢?

在 IT 圈混迹多年的小伙伴们,对 TCP 和 UDP 肯定再熟悉不过了。作为计算机网络专业毕业多年的二狗子,除了 OSI 七层和 TCP/IP 四层模型,就是对网络协议印象比较深刻了。在面试中,网络协议也是我们必须要掌握的知识。作为 TCP/IP 中两个最具有代表性的传输层协议,TCP 和 UDP 经常被拿出来相互比较。

今天我们就来简单聊聊 TCP 和 UDP,不过在讲 TCP 和 UDP之前,我们先来了解一下 TCP/IP。

TCP/IP 网络模型

网络设备之间要互相通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而这种规则就称之为协议(Protocol)。

TCP/IP 是互联网相关的各类协议族的总称,它以两个原始协议:传输控制协议(TCP)和Internet 协议(IP)来命名。比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。TCP/IP 模型是互联网的基础,它可以划分为四层,分别为链路层、网络层、传输层和应用层。

  • 链路层:负责封装和解封装 IP 报文,发送和接受 ARP/RARP 报文等。

  • 网络层:负责路由以及把分组报文发送给目标网络或主机。

  • 传输层:负责对报文进行分组和重组,并以 TCP 或 UDP 协议格式封装报文。

  • 应用层:负责向用户提供应用程序,比如 HTTP、FTP、Telnet、DNS、SMTP 等。

下面我们主要来介绍一下传输层协议:TCP 和 UDP。

TCP

TCP 全称为传输控制协议(Transmission Control Protocol),它由 IETF 的 RFC 793 定义,是一种面向连接的点对点传输通信协议,它以有序顺序将数据包作为非结构化字节流发送。

TCP 通过使用序列号和确认消息,从发送节点提供有关传输到目标节点的数据包的传递的信息。TCP 确保数据的可靠性,端到端传递,重新排序和重传,直到达到超时条件或接收到数据包的确认为止。

TCP 是 Internet 上最常用的协议。当我们在浏览器中请求网页时,计算机会将 TCP 数据包发送到 Web 服务器的地址,要求它将网页返还给我们。Web 服务器通过发送 TCP 数据包流进行响应,然后浏览器将这些数据包缝合在一起以形成网页。TCP 的全部意义在于它的可靠性,它通过对数据包编号来对其进行排序,而且它会通过让服务器将响应发送回浏览器说“已收到”来进行错误检查。因此在传输过程中不会丢失或破坏任何数据。

我们接下来看下 TCP 的连接过程:

1.TCP 的连接过程(三次握手)

  • 主机 A 通过将 TCP SYN 数据包发送到主机 B 来建立连接。其中包含了随机序列号(4321),该号标记了 A 将要发送数据的序号的开始。

  • B 接收到数据包并以自己的序列号(5501)进行响应。响应中还包含确认号,该号是 A 的序列号加 1(4322)。

  • A 通过发送确认号来确认服务器的响应,该确认号是 B 的序列号加 1(5502)。

2.TCP 终止连接

TCP 是全双工的,在断开连接时两端都需要发送 FIN 和 ACK。

  • 若客户端 A 认为数据发送完成,则它需要向服务端 B 发送连接释放请求。

  • B 收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A 到 B 的连接已经释放,不再接收 A 发的数据了。但是因为 TCP 连接是双向的,所以 B 仍旧可以发送数据给 A。

  • B 如果此时还有没发完的数据会继续发送,完毕后会向 A 发送连接释放请求,然后 B 便进入 LAST-ACK 状态。

  • A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。

UDP

用户数据报协议(User Datagram Protocol)是一种无连接的传输层通信协议,用于建立低容错和丢失等待时间的连接,可以在网络内或跨网络传递服务或数据包。UDP 有不提供数据包分组、组装和不能对数据包进行排序的缺点。也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

当应用程序使用 UDP 时,数据包仅发送到目标。发送者不必等待确保接收者已收到该数据包,它会继续发送下一个数据包。如果目标错过了一些数据包,则它们只会被丢掉,发送者不会重新发送它们。这也意味着设备可以更快地进行通信。

例如在游戏中,如果我们因为网络原因错过了接收一些 UDP 数据包,那当收到较新的数据包时,游戏画面可能会跳帧。如果错过了旧数据包,错过了就是错过了,因为就算没有我们,游戏也会继续运行。在游戏中重要的是正在发生的事情,而不是几秒钟前发生的事情。抛弃一些错误有助于加快游戏连接速度并减少延迟。

大多数应用程序都需要 TCP 的可靠性和纠错机制,但是某些应用程序也需要 UDP 的高效性和降低开销。我们可以通过一些诸如 Wireshark、Fiddler 等网络分析工具,就可以看到发送和接收不同类型的数据包。

TCP vs UDP

TCP 和 UDP 有许多区别和相似之处。它们都是通过 Internet 发送数据包的最常用的协议。并且它们都在 TCP/IP 协议栈的传输层上工作。

一个简单的例子,可以清楚地了解两者的差异:

假设有两座房子,House1 和 House2,并且必须从 H1 发送一封信到 H2。但是这两座房子之间有一条河。现在我们如何寄信?

解决方案 1:在河上架桥,然后将其交付。

解决方案 2:通过鸽子运送。

将第一个解决方案视为 TCP,必须进行连接(桥)才能传递数据(信)。

这样得到的数据是可靠的,因为它可以直接到达另一端而不会丢失或者出错。

第二种解决方案类似 UDP,无需连接即可发送数据。与需要建立连接(桥)的 TCP 相比,该过程更快。但是数据并不可靠:因为我们并不知道这只鸽子是否会朝正确的方向前进,或者会在途中掉信或遇到一些其他问题。

简单总结下 TCP 和 UDP 的区别:

连接和无连接:TCP 是面向连接的协议,而 UDP 是无连接协议。TCP 可以在发送数据之前在发送方和接收方之间建立连接。而 UDP 在发送数据之前不会先建立连接。

可靠性:TCP 是可靠的。使用 TCP 协议发送的数据可以保证传递到接收。如果数据在传输过程中丢失,它会恢复数据并重新发送。TCP 还将检查数据包中的错误并跟踪数据包,以保证数据不会丢失或损坏。

而 UDP 是不可靠的,它不能提供有保证质量的传递,并且数据报包可能会在传输中损坏或丢失。

流量控制:TCP 使用流控制机制来确保发送者不会一次发送太多数据包而压倒接收者。TCP 将数据存储在发送缓冲区中,并在接收缓冲区中接收数据。当应用程序准备就绪时,它将从接收缓冲区读取数据。如果接收缓冲区已满,则接收器将无法处理更多数据并将其丢弃。为了保持可以发送给接收方的数据量,接收方会告诉发送方接收缓冲区中有多少剩余空间(接收窗口)。每次接收到数据包时,都会使用当前接收窗口的值向发送方发送一条消息。UDP 不提供流控制。使用 UDP,数据包以连续流的形式到达或被丢弃。

速度:TCP 比 UDP 慢,因为它“顾虑”比较多:TCP 必须建立连接,进行错误检查,并确保按照发送顺序接收文件。而 UDP 则更简单,更高效。

使用场景:TCP 最适合用于对时序不太关心的,且要求高可靠性的应用程序。

  • 万维网(HTTP,HTTPS)

  • 安全外壳(SSH)

  • 文件传输协议(FTP)

  • 电子邮件(SMTP,IMAP / POP)

UDP 最适合需要速度和效率的应用程序。

  • 串流影片

  • 线上游戏

  • 现场直播

  • 域名系统(DNS)

  • 互联网协议语音(VoIP)

  • 普通文件传输协议(TFTP)

聊了这么多,相信你对 TCP 和 UDP 也有了基本的了解,那么你认为:TCP 和 UDP,哪个更胜一筹呢?

推荐阅读

从新冠疫情出发,漫谈 Gossip 协议

从 301 跳转,聊聊边缘规则的那些小妙用

TCP 和 UDP,哪个更胜一筹的更多相关文章

  1. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  2. 【校验】TCP和UDP的校验和

    一开始,私以为校验和只是简单的求和得到的结果,后来在TCP和UDP里面看到使用的校验和方式有点奇怪--二进制反码(循环进位)求和. 人类的认知过程必将从简单到复杂,看下这个二进制反码循环求和是啥子意思 ...

  3. 初入网络系列笔记(2)TCP和UDP

    一.借鉴说明,本博文借鉴以下博文 1.BlueTzar,TCP/IP四层模型, http://www.cnblogs.com/BlueTzar/articles/811160.html 2.叶剑峰,漫 ...

  4. 传输层协议TCP和UDP

    本文力图简洁,让读者对TCP和UDP有个初步的认知.闲话少说,现在开始吧.TCP和UDP都是传输层的协议.TCP通过三次握手建立可靠连接,对未送达的消息重新进行发送.UDP不建立连接而直接发送,对未送 ...

  5. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  6. http、tcp、udp、OAUTH2.0网络协议区别

                    一.先来一个讲TCP.UDP和HTTP关系的 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RAR ...

  7. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  8. OSI参考模型及各层功能,TCP与UDP的区别

    OSI参考模型:ISO/IEC 7498标准定义了网络互联的7层结构模型,即开放系统互连参考模型. OSI参考模型定义了开放系统的层次结构.层次之间的相互关系,以及各层所包括的可能的服务.OSI的服务 ...

  9. TCP与UDP的区别

    TCP与UDP的区别 TCP面向连接:UDP是无连接,即发送数据之前不需要建立连接 TCP提供可靠的服务,TCP连接传送的数据,无差错.不丢失.不重复,且按顺序到达:UDP尽最大努力交付,即不保证可靠 ...

随机推荐

  1. 5种经典的Linux桌面系统

    最近一直在准备Linux相关的PPT,对于一个老码农来说Linux系统自然是比较熟悉了,随口可以说出好几种Linux的版本,然而对于计算机初学者可能就知道windows操作系统.也许你告诉他你可以安装 ...

  2. Redis持久性——RDB和AOF

    Redis持久性 Redis提供了不同的持久性选项: RDB持久性以指定的时间间隔执行数据集的时间点快照. AOF持久性记录服务器接收的每个写入操作,将在服务器启动时再次播放,重建原始数据集.使用与R ...

  3. struct2面试准备

    二 工作流程1.客户端浏览器发出HTTP请求.2.根据web.xml配置,该请求被FilterDispatcher接收3.根据struts.xml配置,找到需要调用的Action类和方法, 并通过Io ...

  4. Java | 顶层类(Top-Level Class)

    前言 本文内容根据 Java 官方教程中的<课程:类和对象>编写而成. 本文提供的是 JDK 14 的示例代码. 定义 顶层类(Top-Level Class),是 Java 中对类的一种 ...

  5. app自动化测试环境配置:adb环境配置、monkey环境配置、appium环境配置大全

    1. 安装jdk 2. 安装配置Andriod sdk 安装Andriod sdk前首先需要安装配置好jdk环境. 然后安装Android sdk 安装完成后需要配置环境变量:ANDROID_HOME ...

  6. 深入探究ASP.NET Core异常处理中间件

    前言     全局异常处理是我们编程过程中不可或缺的重要环节.有了全局异常处理机制给我们带来了很多便捷,首先我们不用满屏幕处理程序可能出现的异常,其次我们可以对异常进行统一的处理,比如收集异常信息或者 ...

  7. 初探numpy——广播和数组操作函数

    numpy广播(Broadcast) 若数组a,b形状相同,即a.shape==b.shape,那么a+b,a*b的结果就是对应数位的运算 import numpy as np a=np.array( ...

  8. 循环中的自变量-break和continue

    1.break 作用:break 用于终止循环的执行, 过程:当执行到break语句后,程序将跳出循环,执行循环语句后边的代码 i=1 while i<10: if i==5: break pr ...

  9. 【Oracle】如何让一个用户能够访问另外一个用户下所有的表

    根据需求的不同,也分为好几种方法,且看下文. 先构造基本的环境:创建两个用户AA,BB,基本需求为用户AA能够访问用户BB下所有的表,即用户AA有对BB下所有的表有"select on&qu ...

  10. java语言进阶(五)_异常

    第一章 异常 1.1 异常概念 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了 ...