♥ 前 言
作为软件测试,大家都知道一些常用的网络协议是我们必须要了解和掌握的,面试的时候面试官也非常喜欢问一些协议相关的问题,其中有两个协议因为非常基础,出现的频率非常之高,分别是 ”TCP 协议“ 和 ”UDP 协议“。因为它们两个协议都处于传输层,所以两个协议经常被用来做比较。那么要知道它们之间的区别,我们就先需要了解清楚这两个协议的具体实现原理。
TCP 协议TCP 协议,全称是 Transmission Control Protocol,传输控制协议, 顾名思义,就是要对数据的传输进行一定的控制。如大家了解的那样,网络报文传输到传输层的时候,会给数据封装一个传输层的头部,所以 TCP 作为一个传输层的协议,也会封装一个 TCP 协议的头部,这个头部包含什么信息,其实就代表着这个协议可以进行哪些工作。
TCP 的头部如下图所示:
我们来给大家解释一下里面的每个字段的意义:源端口号/目的端口号: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 三次握手的过程,如下图所
在尝试建立连接之前, 客户端和服务器都处于 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 的四次挥手:
第一次挥手: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 ,用户数据报协议。我们同样来看一下 这个协议的头部信息:
从头部信息可以看到,udp 比 tcp 少很多东西,只有一个源端口号/目的端口号,这里的作用跟 TCP 协议的端口是一样的。然后,至于 TCP 的序号,确认号,状态码等它都没有,那么,UDP 怎么建立连接呢?此处注意的是,UDP 没有连接,它是一种无连接的传输层协议。所以使用 UDP 协议的的应用一般必须允许一定量的丢包、出错,这也是他的一个特点:不重视可靠,只重视速度!那么有哪些应用不需要可靠机制,只看重性能和速度呢?比如流媒体、即时多媒体游戏和 IP 电话(VoIP),就会采用 UDP 协议来封装,因为他不需要连接,因而具有资源消耗小,处理速度快的优点,音频、视频和在传送时偶尔丢失几个数据包,也不会对接收结果产生太大影响的,就会选择 UDP 协议来封装。常用协议:域名系统(DNS)、简单网络管理协议(SNMP)、动态主机配置协议(DHCP)、路由信息协议(RIP)等等。
TCP 协议和 UDP 协议的对比连接方面区别:TCP 面向连接(如打电话要先拨号建立连接),UDP 是无连接的,即发送数据之前不需要建立连接。安全方面的区别:TCP 提供可靠的服务,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付。传输效率的区别:TCP 传输效率相对较低,UDP 效率高。