乐趣区

关于即时通讯:网络编程懒人入门十三一泡尿的时间快速搞懂TCP和UDP的区别

本文援用了作者 Fundebug 的“一文搞懂 TCP 与 UDP 的区别”一文的内容,感激自私分享。

1、引言

网络协议是每个搞网络通信利用开发(比方 IM、推送、网关等等)的程序员都必须要把握的基础知识,TCP/IP 协定簇中有两个最具备代表性的传输层协定——别离是 TCP 和 UDP。

有过网络通信开发教训的同学们都晓得,TCP 和 UDP 协定是平时用的最多的两种协定,而对于很多人来说,什么时候以及什么场景下该用 TCP 还是 UDP?这是个经久不息的探讨话题。

不同于其它简明扼要,本文尽量以简洁精炼的文字,帮你总结演绎 TCP 和 UDP 协定的次要区别,不便那些想把握这方面常识又不违心消耗太多工夫去系统地学习网络理论根底的同学疾速了解!

举荐浏览:为了加深了解,本系列的另一篇《网络编程懒人入门 (四):疾速了解 TCP 和 UDP 的差别》也能够一并浏览。
学习交换:

  • 挪动端 IM 开发入门文章:《新手入门一篇就够:从零开发挪动端 IM》
  • 开源 IM 框架源码:https://github.com/JackJiang2…

(本文已同步公布于:http://www.52im.net/thread-37…)

2、疾速了解 TCP/IP 协定簇

计算机与网络设备要互相通信,单方就必须基于雷同的办法。比方:如何探测到通信指标、由哪一边先发动通信、应用哪种语言进行通信、怎么完结通信等规定都须要当时确定。不同的硬件、操作系统之间的通信,所有的这所有都须要一种规定。而咱们就把这种规定称为协定(protocol)。

TCP/IP 是互联网相干的各类协定族的总称,比方:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协定。

TCP/IP 模型是互联网的根底,它是一系列网络协议的总称。这些协定能够划分为四层,别离为链路层、网络层、传输层和应用层。

具体是:

1)链路层:负责封装和解封装 IP 报文,发送和承受 ARP/RARP 报文等;
2)网络层:负责路由以及把分组报文发送给指标网络或主机;
3)传输层:负责对报文进行分组和重组,并以 TCP 或 UDP 协定格局封装报文;
4)应用层:负责向用户提供应用程序,比方 HTTP、FTP、Telnet、DNS、SMTP 等。

上面这张表格进行了了演绎:

上面这张图,更活泼的反映了 TCP/IP 协定族的关系状况(高清图从这里下载):

在网络体系结构中,网络通信的建设必须是在通信单方的对等层进行,不能交织。

在整个数据传输过程中,数据在发送端时通过各层时都要附加上相应层的协定头和协定尾(仅数据链路层须要封装协定尾)局部,也就是要对数据进行协定封装,以标识对应层所用的通信协议。

无关 TCP/IP 协定簇的常识,几本书都写不完,这里我就不再赘述了,有趣味能够读一读《TCP/IP 详解 卷 1:协定(在线浏览)》。

另外,学习常识,我特地喜爱理解技术之外的一些常识,比方上面两篇:

《技术往事:扭转世界的 TCP/IP 协定(宝贵多图、手机慎点)》
《5G 时代曾经到来,TCP/IP 老矣,尚能饭否?》

接下来,咱们将回到正题,学习 TCP/IP 中有两个具备代表性的传输层协定——TCP 和 UDP。

3、疾速了解 UDP 协定

3.1 根本介绍
UDP 协定:全称是用户数据报协定,在网络中它与 TCP 协定一样用于解决数据包,是一种无连贯的协定。

在 OSI 模型中,处在第四层——传输层,处于 IP 协定的上一层(见下图)。


▲ 上图援用自《计算机网络通信协定关系图》

UDP 有不提供数据包分组、组装和不能对数据包进行排序的毛病,也就是说,当报文发送之后,是无奈得悉其是否平安残缺达到的。

UDP 协定的几个次要特地,我进行演绎,上面的下节将逐个阐明。

3.2 面向无连贯
首先 UDP 是不须要和 TCP 一样在发送数据前进行三次握手建设连贯的,想发数据就能够开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。

具体来说就是:

1)在发送端:应用层将数据传递给传输层的 UDP 协定,UDP 只会给数据减少一个 UDP 头标识下是 UDP 协定,而后就传递给网络层了;
2)在接收端:网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作。

3.3 反对单播、多播、播送
UDP 不止反对一对一的传输方式,同样反对一对多,多对多,多对一的形式,也就是说 UDP 提供了单播、多播、播送的性能。

3.4 面向报文
UDP 协定是面向报文的。

发送方的 UDP 对应用程序交下来的报文,在增加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。

因而,应用程序必须抉择适合大小的报文(见《UDP 中一个包的大小最大能多大?》)。

3.5 不可靠性
UDP 的不可靠性首先体现在无连贯上,通信的单方不须要建设连贯,想发就发,这样的状况必定不牢靠。

并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关怀对方是否曾经正确接管到数据了。

再者网络环境时好时坏,然而 UDP 因为没有拥塞管制,始终会以恒定的速度发送数据(即便网络条件不好,也不会对发送速率进行调整)。

这样实现的弊病就是在网络条件不好的状况下可能会导致丢包,然而长处也很显著,在某些实时性要求高的场景(比方电话会议)就须要应用 UDP 而不是 TCP(见《网络编程懒人入门(五):疾速了解为什么说 UDP 有时比 TCP 更有劣势》)。

上面这个动图能够很好的阐明 UDP 的不可靠性:

从下面的动图能够得悉,UDP 只会把想发的数据报文一股脑的丢给对方,并不在意数据有无平安残缺达到。

3.6 头部开销小
UDP 协定头部开销小(如下图所示),传输数据报文时是很高效的。


▲ 上图援用自《TCP/IP 详解 – 第 11 章·UDP 协定》

UDP 头部蕴含了以下几个数据:

1)两个十六位的端口号,别离为源端口(可选字段)和指标端口;
2)整个数据报文的长度;
3)整个数据报文的测验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的谬误。

因而 UDP 的头部开销小,只有 8 字节,相比 TCP 的至多 20 字节要少得多,在传输数据报文时是很高效的。

作为比照,下图是 TCP 协定的头部开销:


▲ 上图援用自《TCP/IP 详解 – 第 17 章·TCP 协定》

3.7 更全面地学习 UDP 协定
UDP 协定相对来说比较简单易学,如果感觉实践上有所欠缺,能够通过网络经典书籍《TCP/IP 详解 – 第 11 章·UDP:用户数据报协定》中的章节来补充。

其实生产利用时,UDP 协定也有它简单的一面,上面这几篇值得学习一下:

《鲜为人知的网络编程(五):UDP 的连接性和负载平衡》
《鲜为人知的网络编程(六):深刻地了解 UDP 协定并用好它》
《鲜为人知的网络编程(七):如何让不牢靠的 UDP 变的牢靠?》

另外,随着近年来 Google 等互联网大厂大力推广 Quic 协定,UDP 协定在新时代挪动互联网环境下或者能找到更多的利用场景,有趣味的读者能够学习一下 QUIC 协定:《网络编程懒人入门(十):一泡尿的工夫,疾速读懂 QUIC 协定》、《技术扫盲:新一代基于 UDP 的低延时网络传输层协定——QUIC 详解》、《让互联网更快:新一代 QUIC 协定在腾讯的技术实际分享》。

4、疾速了解 TCP 协定

4.1 根本介绍
当一台计算机想要与另一台计算机通信时,两台计算机之间的通信须要畅通且牢靠,这样能力保障正确收发数据。

例如:当你想查看网页或查看电子邮件时,心愿残缺且按程序查看网页,而不失落任何内容。当你下载文件时,心愿取得的是残缺的文件,而不仅仅是文件的一部分,因为如果数据失落或乱序,都不是你心愿失去的后果,于是就用到了 TCP。

TCP 协定:全称是传输控制协议是一种面向连贯的、牢靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。

TCP 是面向连贯的、牢靠的流协定。流就是指不间断的数据结构,你能够把它设想成排水管中的水流。

无关 TCP 协定的实践能够持续浏览《TCP/IP 详解 – 第 17 章·TCP:传输控制协议》,限于篇幅这里就开展了。

接下来咱们一一介绍 TCP 最次要的几个特点。

4.2 TCP 连贯过程(3 次握手)
如下图所示,这是建设一个 TCP 连贯的过程(俗称“3 次握手”):

1)第一次握手:客户端向服务端发送连贯申请报文段。该报文段中蕴含本身的数据通讯初始序号。申请发送后,客户端便进入 SYN-SENT 状态。

2)第二次握手:服务端收到连贯申请报文段后,如果批准连贯,则会发送一个应答,该应答中也会蕴含本身的数据通讯初始序号,发送实现后便进入 SYN-RECEIVED 状态。

3)第三次握手:当客户端收到连贯批准的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连贯建设胜利。

这里可能大家会有个纳闷:为什么 TCP 建设连贯须要三次握手,而不是两次?这是因为这是为了防止出现生效的连贯申请报文段被服务端接管的状况,从而产生谬误。

上面的动画演示了 3 次握手过程,可能更好懂一些:

▲ 动图援用自《跟着动画来学 TCP 三次握手和四次挥手》

4.3 TCP 断开链接(4 次挥手)

TCP 是全双工的,如上图所示,在断开连接时两端都须要发送 FIN 和 ACK。

1)第一次挥手:若客户端 A 认为数据发送实现,则它须要向服务端 B 发送连贯开释申请。

2)第二次挥手:B 收到连贯开释申请后,会通知应用层要开释 TCP 链接。而后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明 A 到 B 的连贯曾经开释,不再接管 A 发的数据了。然而因为 TCP 连贯是双向的,所以 B 仍旧能够发送数据给 A。

3)第三次挥手:B 如果此时还有没发完的数据会持续发送,结束后会向 A 发送连贯开释申请,而后 B 便进入 LAST-ACK 状态。

4)第四次挥手:A 收到开释申请后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会继续 2MSL(最大段生存期,指报文段在网络中生存的工夫,超时会被摈弃)工夫,若该时间段内没有 B 的重发申请的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。

对于 TCP 的 4 次挥手,上面的动画或者更活泼一些:

▲ 动图援用自《跟着动画来学 TCP 三次握手和四次挥手》

正确理解 TCP 3 次握手和 4 次挥手过程,是十分重要的,限于篇幅,本文没方法进一步深刻开展,有趣味的共事能够进一步深刻浏览以几篇专题文章:

《脑残式网络编程入门(一):跟着动画来学 TCP 三次握手和四次挥手》
《实践经典:TCP 协定的 3 次握手与 4 次挥手过程详解》
《实践联系实际:Wireshark 抓包剖析 TCP 3 次握手、4 次挥手过程》

4.4 TCP 协定要点演绎
1)面向连贯:

面向连贯,是指发送数据之前必须在两端建设连贯。

建设连贯的办法是“三次握手”,这样能建设牢靠的连贯。建设连贯,是为数据的牢靠传输打下了根底。

2)仅反对单播传输:

每条 TCP 传输连贯只能有两个端点,只能进行点对点的数据传输,不反对多播和播送传输方式。

3)面向字节流:

TCP 不像 UDP 一样那样一个个报文独立地传输,而是在不保留报文边界的状况下以字节流形式进行传输。

4)牢靠传输:

对于牢靠传输、判断丢包、误码,靠的是 TCP 的段编号以及确认号。

TCP 为了保障报文传输的牢靠,就给每个包一个序号,同时序号也保障了传送到接收端实体的包的按序接管。

而后接收端实体对已胜利收到的字节发回一个相应的确认(ACK):如果发送端实体在正当的往返时延(RTT)内未收到确认,那么对应的数据(假如失落了)将会被重传。

对于牢靠传输的实践,能够深刻学习《TCP/IP 详解 – 第 21 章·TCP 的超时与重传》,这里就不深刻开展了。

5)提供拥塞管制:

当网络呈现拥塞的时候,TCP 可能减小向网络注入数据的速率和数量,缓解拥塞。

TCP 中无关拥塞管制的文章通都比拟干燥,这篇《通俗易懂 - 深刻了解 TCP 协定(下):RTT、滑动窗口、拥塞解决》相对来说讲的比拟易懂,有趣味能够深刻读读。

6)TCP 提供全双工通信:

TCP 容许通信单方的应用程序在任何时候都能发送数据,因为 TCP 连贯的两端都设有缓存,用来长期寄存双向通信的数据。

当然,TCP 能够立刻发送一个数据段,也能够缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于 MSS)。

4.5 更全面地学习 TCP 协定
TCP 协定波及的内容比拟丰盛,真要方方面面展来讲,三天三夜也讲不完。不过,对于网络应用的开发者来说,依据自已利用所波及技术的深度按需学习就能够了。

初学者倡议先把实践夯实,比方从《TCP/IP 详解 – 第 17 章·TCP:传输控制协议》这本经典书籍开始。

如果感觉实践太过乏味,上面这几篇生动有趣的入门文章举荐肯定要读一读:

《网络编程懒人入门(一):疾速了解网络通信协定(上篇)》
《网络编程懒人入门(二):疾速了解网络通信协定(下篇)》
《网络编程懒人入门(三):疾速了解 TCP 协定一篇就够》
《网络编程懒人入门(六):史上最艰深的集线器、交换机、路由器性能原理入门》
《脑残式网络编程入门(一):跟着动画来学 TCP 三次握手和四次挥手》
《网络编程入门从未如此简略(一):如果你来设计网络,会怎么做?》
《网络编程入门从未如此简略(二):如果你来设计 TCP 协定,会怎么做?》

另外,在学习 TCP 或者网络编程实际的过程中,其它的一些网络常识也有必要理解,上面这几篇能够让你轻松的学习,不要错过:

《脑残式网络编程入门(五):每天都在用的 Ping 命令,它到底是什么?》
《脑残式网络编程入门(六):什么是公网 IP 和内网 IP?NAT 转换又是什么鬼?》
《脑残式网络编程入门(七):面视必备,史上最艰深计算机网络分层详解》
《脑残式网络编程入门(八):你真的理解 127.0.0.1 和 0.0.0.0 的区别?》
《脑残式网络编程入门(九):面试必考,史上最艰深大小端字节序详解》

在生产利用中,必须要波及到网络的高性能、高并发问题,上面这几篇值得学习:

《高性能网络编程(一):单台服务器并发 TCP 连接数到底能够有多少》
《高性能网络编程(二):上一个 10 年,驰名的 C10K 并发连贯问题》
《高性能网络编程(三):下一个 10 年,是时候思考 C10M 并发问题了》
《高性能网络编程(四):从 C10K 到 C10M 高性能网络应用的实践摸索》
《从根上了解高性能、高并发(一):深刻计算机底层,了解线程与线程池》
《从根上了解高性能、高并发(二):深刻操作系统,了解 I / O 与零拷贝技术》
《从根上了解高性能、高并发(三):深刻操作系统,彻底了解 I / O 多路复用》
《从根上了解高性能、高并发(四):深刻操作系统,彻底了解同步与异步》
《从根上了解高性能、高并发(五):深刻操作系统,了解高并发中的协程》
《从根上了解高性能、高并发(六):通俗易懂,高性能服务器到底是如何实现的》
《从根上了解高性能、高并发(七):深刻操作系统,一文读懂过程、线程、协程》

随着 TCP 协定利用的深度一直拓展,肯定会遇到各种疑难杂症:

《鲜为人知的网络编程(一):浅析 TCP 协定中的疑难杂症(上篇)》
《鲜为人知的网络编程(二):浅析 TCP 协定中的疑难杂症(下篇)》
《鲜为人知的网络编程(三):敞开 TCP 连贯时为什么会 TIME_WAIT、CLOSE_WAIT》
《鲜为人知的网络编程(四):深入研究剖析 TCP 的异样敞开》

对于 TCP 协定来说,晓得的越多越觉无知,上面这几篇或者能够彻底为你解开一些纳闷,不可多得:

《鲜为人知的网络编程(十):深刻操作系统,从内核了解网络包的接管过程(Linux 篇)》
《鲜为人知的网络编程(十一):从底层动手,深度剖析 TCP 连贯耗时的机密》
《鲜为人知的网络编程(十二):彻底搞懂 TCP 协定层的 KeepAlive 保活机制》
《鲜为人知的网络编程(十三):深刻操作系统,彻底搞懂 127.0.0.1 本机网络通信》

5、总结一下

TCP 和 UDP 的区别能够演绎为上面这张表格:

简略来说,TCP 和 UDP 的区别就是:

1)TCP 向下层提供面向连贯的牢靠服务,UDP 向下层提供无连贯不牢靠服务;
2)尽管 UDP 并没有 TCP 传输来的精确,然而也能在很多实时性要求高的中央有所作为;
3)对数据准确性要求高,速度能够绝对较慢的,能够选用 TCP。

最初,想用一张图来活泼地概括一下 TCP 与 UDP 的区别:

正如上图所示:TCP 就像右边的妹子——喝起水来井井有条、滴水不漏,UDP 就像左边的妹子——甭管能喝到多少、倒就完了。。。

6、系列文章

本文是系列文章中的第 13 篇,本系列文章的纲要如下:

[1] 网络编程懒人入门(一):疾速了解网络通信协定(上篇)
[2] 网络编程懒人入门(二):疾速了解网络通信协定(下篇)
[3] 网络编程懒人入门(三):疾速了解 TCP 协定一篇就够
[4] 网络编程懒人入门(四):疾速了解 TCP 和 UDP 的差别
[5] 网络编程懒人入门(五):疾速了解为什么说 UDP 有时比 TCP 更有劣势
[6] 网络编程懒人入门(六):史上最艰深的集线器、交换机、路由器性能原理入门
[7] 网络编程懒人入门(七):深入浅出,全面了解 HTTP 协定
[8] 网络编程懒人入门(八):手把手教你写基于 TCP 的 Socket 长连贯
[9] 网络编程懒人入门(九):艰深解说,有了 IP 地址,为何还要用 MAC 地址?
[11] 网络编程懒人入门(十):一泡尿的工夫,疾速读懂 QUIC 协定
[12] 网络编程懒人入门(十一):一文读懂什么是 IPv6
[13] 网络编程懒人入门(十二):疾速读懂 Http/ 3 协定,一篇就够!
[14] 网络编程懒人入门(十三):一泡尿的工夫,疾速搞懂 TCP 和 UDP 的区别(* 本文)

(本文已同步公布于:http://www.52im.net/thread-37…)

退出移动版