作为 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. BUAA_OO_2020_Unit4_总结博客

    BUAA_OO_2020_Unit4_总结 2020年春季学期第十六周,OO第四单元即最终章落下帷幕,本单元是利用Java进行UML类图的解析,完成对类图.顺序图.状态图的内部查询操作与简单的规则判断 ...

  2. 迁移AndroidX

    1. 前言 AndroidX replaces the original support library APIs with packages in the androidx namespace. O ...

  3. Docker中使用RabbitMQ

    安装Docker yum install docker //安装完成以后,可以查看一下docker的版本 docker -v //Docker version 1.13.1, build 64e998 ...

  4. Unity中数据的存储与交互的初步分析(PlayerPrefs,Dictionary,JsonUnility)

    1.PlayerPrefs   PlayerPrefs.SetString(key,Value);  PlayerPrefs.GetString(key,Value);字符串类型 PlayerPref ...

  5. elasticsearchBouncing Results问题

    bouncing results问题,两个document排序,field值相同:不同的shard上,可能排序不同:每次请求轮询打到不同的replica shard上:每次页面上看到的搜索结果的排序都 ...

  6. django drf插件(一)

    复习 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} ...

  7. IOC/DI概念简述及基本应用

    早几年面试时,面试官经常问我依赖注入的概念,但有面试官自己都不是很清楚ioc和di的区别,而是草草归于一类,今天翻了翻以前写的demo,顺便把这部分概念整理出来,加深一下印象. 先科普一下,IOC是什 ...

  8. [转]理解神经网络:从神经元到RNN、CNN、深度学习

    神经网络是目前最流行的机器学习算法之一.随着时间的推移,证明了神经网络在精度和速度方面,比其他的算法性能更好.并且形成了很多种类,像CNN(卷积神经网络),RNN,自编码,深度学习等等.神经网络对于数 ...

  9. 实现MFC扩展DLL中导出类和对话框

    如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对 ...

  10. 发家致富的鬼bug。让人心动

    这个bug是我目前见过最离谱的bug…… 颠覆了我二十多年的世界观,天上掉馅饼这种好事第一次砸我身上(雾),至今我都没想明白其中的原理. 情况是这样的,去年我出门去外地有些事情要处理.由于要呆很长时间 ...