趣谈TCP与UDP

Home / 博客 / 趣谈TCP与UDP

       大家都知道,传输层定义了两种协议,一种是TCP,另一种就是UDP。提到TCP,我们第一印象就是这是一种面向连接、可靠、不会丢包的传输层控制协议;而提到UDP,我们就会说非可靠连接、会丢包、但是速度快,可实时传输数据。这些特点我想每一位学网络的人都早已耳熟能详,即使没有接触过网络的人也早已而闻。但是具体的讲,这是什么原因造成的?TCP和UDP的区别这么大,在如今快速发展的互联网时代,他们又在哪些实际应用中分别发挥着自己的功能呢?

带着这些疑问,听小编细细道来。

“3次握手建立TCP连接,4次握手终止TCP连接”。是的,TCP和UDP最大的不同就在这里,当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP建立连接的过程是通过三次握手来完成的,首先发送端给接收端发送一个SYN请求,就相当于问对方:“我可以给你发送数据吗?”接收端收到这个请求后,向发送端回应一个SYN/ACK应答,就是说:“当然可以,我可以向你发送数据吗?”然后发送方收到此包后在向接收端回应ACK,发送端说:“可以啊。”完成3次握手后,TCP连接成功建立,双方就能相互发送数据了。而终止一个TCP连接需要4次握手,这是由TCP的半关闭状态造成的。由于发送端和接收端的连接都能独立的被终止,所以在这个过程中双方都需要发送一个FIN和ACK。

TCP提供超时重发、丢弃重复数据、检验数据、流量控制等功能,保证数据能从一端传到另一端。提到这些TCP的特有功能,其实在TCP的报头中完美的体现了出来。

TCP

 

图1   TCP 报头结构

TCP报头的总长最小为20字节,其中来源连接端口指定了发送端的端口,目的连接端口指定了接收端的端口,它们用来标识发送方和接收方的应用层。对于每个TCP连接的一端,都有一个相关的16位的无符号端口号分配给它们,这个端口号与它所在主机的IP地址构成一个48位的套接字,一对套接字在互联网中唯一标识一个TCP连接。序列号是用于标识每个报文段,使接收端可确认已收到指定报文段中的数据。当发送端用多个报文段发送一个报文时,即使这些报文到达目的主机的顺序不一样,序列号也可以使目的主机按顺序排列它们。确认号32位,目的主机返回确认号,使源主机知道某个或几个报文段已被接收。如果ACK控制位被设置为1,则该字段有效。确认号等于顺序接收到的最后一个报文段的序号加1,这也是目的主机希望下次接收的报文段的序号值。返回确认号后,计算机就认为此确认号之前的数据都已经接收到。如此,就实现了无乱序、无丢失、和无重复的可靠数据传输。标题长度占4位,指明了TCP报文头的长度,保留是为以后预留一个字段,标志符就是我们通常所说的标志位,当满足条件时,把对应的位置1。例如:当发送确认信号时,就在报文头中把ARK位置1.窗口指明了发送端下一段能发送数据的大小,避免主机分组发送得过快而使接收端来不及完全收下,避免了网络阻塞。TCP的校验和占16位,在传输是设置了双校验机制,也就是发送者在发送时需要把TCP的段头和数据包校验一次,同时接收者收到报文后也需要重新校验一次。如此一来,就保证了报文的完整性和正确性。紧急指针指明报文中包含紧急信息,只有当URG位置1时,紧急指针才有效。

相对而言,UDP的数据传输就简单多了,它不提供可靠性,只是把数据包往IP层上一扔,至于数据包能不能传送到目的地,会不会丢包,传送数据报的顺序是否正确,不好意思,这就不是UDP能够提供的了。由于UDP传输数据包前不需要建立连接,没有重发机制,所以UDP速度非常快。其实这些在UDP的报头中都体现了出来。

UDP报头

图2 UDP报头结构

UDP报头由4个部分组成,其中两个是可选的。各16bit的来源端口和目的端口用来标记发送和接受的应用进程。因为UDP不需要应答,所以来源端口是可选的,如果来源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度域,用来指定UDP头部和UDP数据的总长度,长度最小值为8byte。报头剩下地16bit是用来对首部和数据部分一起做校验和(Checksum)的,这部分是可选的,但在实际应用中一般都使用这一功能。

显然,TCP和UDP都有一些自己的独特的地方,这就决定了TCP与UDP在不同的领域发光发热。这就要我们选择时多注意点了,下面是我的几点建议:

  • 当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时,TCP协议是当然的选择,如:发送邮件;
  • 当强调传输性能而不是传输的完整性时,如:实时流多媒体(如因特网广播)、实时多媒体播放器和游戏、IP电话(VoIP)等等,UDP是最好的选择。在数据传输时间很短,以至于此前的连接过程成为主体的情况下,UDP也是一个好的选择,如:DNS交换。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时,UDP较低的开销使其有更好的机会去传送管理数据。

TCP丰富的功能有时会导致不可预料的性能低下,但是我们相信不远的将来一定会出现功能多、性能高的TCP协议应用到我们的网络中。

By Cillian

感谢关注!