TCP vs UDP 协议之区别知多少

本贴最后更新于 895 天前,其中的信息可能已经时移世易

作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,面试的时候面试官也非常喜欢问一些协议相关的问题,其中有两个协议因为非常基础,出现的频率非常之高,分别是 ”TCP协议“ 和 ”UDP协议“。因为它们两个协议都处于传输层,所以两个协议经常被用来做比较。

那么要知道它们之间的区别,我们就先需要了解清楚这两个协议的具体实现原理。

TCP协议

TCP协议,全称是 Transmission Control Protocol,传输控制协议, 顾名思义,就是要对数据的传输进行一定的控制.

如大家了解的那样,网络报文传输到传输层的时候,会给数据封装一个传输层的头部,所以TCP作为一个传输层的协议,也会封装一个TCP协议的头部,这个头部包含什么信息,其实就代表着这个协议可以进行哪些工作。TCP的头部如下图所示:

图片.png

我们来给大家解释一下里面的每个字段的意义:

源端口号/目的端口号: TCP协议的端口是用来唯一区分上层应用协议的,可以帮助找到电脑的应用程序,明确出来数据从哪个应用进程进来, 传到哪个应用进程去。

每个应用层协议都有一个专属的端口,比如我们比较熟悉的一些协议,http协议的端口就是TCP的80端口,https协议的端口就是TCP协议的443端口,SSH协议的端口就是TCP协议的22端口,DNS协议就是TCP协议的53端口,FTP协议就是TCP的20/21端口等等。

序号(Sequence Number):如果 TCP 数据太大时,在网络中需要就得要进行分段。这个序号就是记录每个封包的序号,可以让接收端重新将TCP的数据正确的组合起来。所以,TCP的每个报文都会带上一个序号。

确认号(Acknowledge Number):TCP协议为了可靠的进行数据传输,确认主机端确实有收到我们 client 端所送出的封包数据,我们 client 端当然希望能够收到主机方面的收到确认,那就是这个 Acknowledge Number 的用途了。 当 client 端收到这个确认码时,就能够确定之前传递的封包已经被正确的收下了。这个确认号的号码本身是期望收到对方的下一个报文段的数据的序号。

状态控制码(Code Control Flag):状态控制码有六个标志位字段,分别是 U、A、P、R、S、F,这几个标志位就是用来标记这个报文的类型:

ACK:确认位(Acknowledge),当ACK=1时代表这个封包为确认包,确认号才是有效的;当ACK=0时,确认号无效。

RST:复位比特(Reset) ,当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

SYN:同步(Synchronous),SYN=1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。

FIN:终止(Final),用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。

以上这些头部字段,其实都是用来为TCP协议建立连接和断开链接使用的,所以我们接下来给大家介绍一下TCP协议建立链接的过程。

TCP的三次握手

如果两个主机的之间要发消息,如果底层基于的是TCP协议,那就要先建立TCP的链接。TCP建立连接的过程,也就是大家比较熟悉的的tcp三次握手的过程,如下图所示:

图片.png

在尝试建立连接之前, 客户端和服务器都处于 CLOSE 状态.

第一次握手:Client将标志位SYN置为1,随机产生一个值作为序号:seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认;
第二次握手:Server收到数据包后,由于标志位SYN=1,知道是Client请求建立连接的报文,所以,Server会给出回应:将标志位SYN和ACK都置为1,确认号ack=J+1,随机产生一个值序号seq=K,并将该数据包发送给Client,表示确认并同意连接请求。此时Server进入SYN_RCVD状态;
**第三次握手**:Client收到确认报文后,检查确认号ack是否为J+1,ACK标记位是否标记为1,如果正确则将标志位ACK置为1,确认号为ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK位是否标记为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

TCP的四次握手

当客户端和服务器双方数据传输完毕后,双方都可以释放连接。此时客户端和服务器都是处于ESTABLISHED状态,然后客户端主动断开连接,服务器被动断开连接,而且每个方向都必须要单独进行关闭,所以断开链接,就需要进行TCP的四次挥手:

图片.png

第一次挥手:Client发送完毕了所有的数据,就会发送一个标记位FIN=1的报文,序号seq=n,用来关闭Client的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:Server收到FIN包后,发送一个ACK给Client,序号为收到序号+1,Server进入CLOSE_WAIT状态。

第三次挥手: Server发送一个FIN=1 ,seq=m,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手: Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,序号为m+1,Server进入CLOSED状态,完成四次挥手。

UDP协议

UDP协议,全称 User Datagram Protocol ,用户数据报协议。我们同样来看一下 这个协议的头部信息:

图片.png

从头部信息可以看到,udp比tcp少很多东西,只有一个源端口号/目的端口号,这里的作用跟TCP协议的端口是一样的。 然后,至于TCP的序号,确认号,状态码等它都没有,那么,UDP怎么建立连接呢?

此处注意的是,UDP没有连接,它是一种无连接的传输层协议。所以使用UDP协议的的应用一般必须允许一定量的丢包、出错,这也是他的一个特点:不重视可靠,只重视速度!

那么有哪些应用不需要可靠机制,只性能和速度呢?

比如流媒体、即时多媒体游戏和IP电话(VoIP),就会采用UDP协议来封装,因为他不需要连接,因而具有资源消耗小,处理速度快的优点,音频、视频和在传送时偶尔丢失几个数据包,也不会对接收结果产生太大影响的,就会选择UDP协议来封装。

常用协议:域名系统(DNS)、简单网络管理协议(SNMP)、动态主机配置协议(DHCP)、路由信息协议(RIP)等等。

TCP协议和UDP协议的对比

图片.png

连接方面区别:TCP面向连接(如打电话要先拨号建立连接),UDP是无连接的,即发送数据之前不需要建立连接。

安全方面的区别:TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。

传输效率的区别,TCP传输效率相对较低,UDP效率高。

回帖
请输入回帖内容 ...