深入浅出TCP与UDP协议

Posted seanxushuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出TCP与UDP协议相关的知识,希望对你有一定的参考价值。

深入浅出TCP与UDP协议

网络协议是每个前端工程师的必修课,TCP/IP协议族是一系列网络协议的总和,而其中两个具有代表性的传输层协议,分别是TCP与UDP,本文将介绍这两者以及他们之间的区别。

一、TCP/IP网络结构模型

计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由那一边先发起通信、使用那种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称之为协议(protocol)。

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

网络参考模型

当通过http发起一个请求时,应用层、传输层、网络层和链路层的相关协议依次对该请求进行包装并携带对应的首部,最终在链路层生成以太网数据包,以太网数据包通过物理介质传输给对方主机,对方接收到数据包以后,然后再一层一层采用对应的协议进行拆包,最后把应用层数据交给应用程序处理。

网络通信就好比送快递,商品外面的一层层包裹就是各种协议,协议包含了商品信息、收货地址、收件人、联系方式等,然后还需要配送车、配送站、快递员,商品才能最终到达用户手中。

一般情况下,快递是不能直达的,需要先转发到对应的配送站,然后由配送站再进行派件。

配送车就是物理介质,配送站就是网关, 快递员就是路由器,收货地址就是IP地址,联系方式就是MAC地址。

快递员负责把包裹转发到各个配送站,配送站根据收获地址里的省市区,确认是否需要继续转发到其他配送站,当包裹到达了目标配送站以后,配送站再根据联系方式找到收件人进行派件。

二、UDP

通过上图我们可以知道,链路层定义了主机的身份,也就是MAC地址,而网络层则定义了IP地址,明确了主机所在的网段,有了这两个地址,数据包就可以由一个主机发送到另一个主机,但是,网络的通信一般都是从一个主机的某个应用程序发出,由另一个主机的应用程序接收,而每台主机都会运行很多程序,所以当数据包发送到主机上时,我们不知道应该哪个程序接收数据包。

因此传输层引入了UDP协议来解决这个问题,为了给每个应用程序标识身份,UDP协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息。 这样,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。如下图所示:

因此我们可以总结它的几个特点:

1、面向无连接

首先UDP是不需要连接到主机的,想发数据直接就可以发送。

也就是说:

  • 在发送端,应用层将数据传递给传输层的UDP协议,UDP协议只会给数据增加一个UDP头标识。

  • 而在接收端,网络层将数据传递给传输层,UDP只是去除IP报文后就传递给应用层。

2、不可靠性

不可靠性体现在无连接上,由于UDP通信是不需要建立连接的,不管接收方是否接收到数据,所以肯定是不可靠的。

此外,由于UDP没有拥塞控制,会以恒定的速度发送数据,即使网络条件不好的时候,也不会对发送速率进行调整。这样会导致在网络条件不好的情况下容易导致丢包——数据丢失,但是优点也是明显的,在某些对实时性要求高的应用场景下,使用UDP比TCP更好,比如qq电话,微信视频等。

3、头部开销小

UDP数据包由首部和数据两部分组成,首部长度为8个字节,主要包括源端口和目标端口;数据最大为65527个字节,整个数据包的长度最大可达到65535个字节。

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

  • 两个十六位的端口号,分别为源端口(可选字段)和目标端口

  • 整个数据报文的长度

  • 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误

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

但是由于UDP协议比较简单,实现容易,但这恰恰也是它的缺点,没有确认机制,一旦发出,不知道主机是否接收到数据包,这无法满足对数据传输可靠性高的需求,因此诞生了TCP协议。也就是说TCP协议是具有确认机制的UDP协议。

三、TCP

为了使主机之间能够保持畅通的通信,提供可靠的连接服务,TCP采用了三次握手确立连接,和四次挥手断开连接:

在了解TCP如何建立连接和断开连接之前,我们先了解一下TCP的几个标识,即:SYN()、ACK()、FIN()。

三次握手

为了准确无误的传输数据,TCP协议采用了三次握手的策略:

1、客户端采用TCP协议将带有SYN标志的数据包发送给服务器,等待服务器确认。

2、服务器接收到SYN数据包后,必须确认SYN信号,即自己发送的ACK标志,同时也会想客户端发送一个SYN标志。

3、当客户端接收到ACK+SYN包后,会向服务器端发送ACK包,完成三次握手。

此时,客户端和服务器端就建立了连接,开始传送数据。

如图所示:

四次挥手

由于TCP/IP协议是要占用端口号的,而计算机的端口号却是有限的,如果不断开的话,肯定会造成计算机资源的浪费。

1、当客户端的数据传送完毕时,客户端会发送一个带有FIN标志的数据包。使得服务器端明白自己要断开连接了。

2、由于TCP的连接是双向的,所以断开时也应该是双向的;当服务器收到FIN标志的数据包时,会向客户端发送ACK包,并断开客户端到服务器端的连接,不再接收客户端发送的数据,但服务器仍然可以发送数据给客户端。

3、当服务器端发送完数据后,会向客户端发送一个带有FIN标志的数据包,使得客户端明白自己要断开连接了。

4、当客户端收到断开连接请求后,向客户端发送确认应答。然后客户端会进入等待状态,该状态会持续2MSL。如果这段时间内服务器都没有重发请求,就进入CLOSE状态。

如图所示:

TCP协议的特点

  • 面向连接

    面向连接是指,两个主机传送数据之前,必须建立连接,这样保证了数据传送的可靠性。

  • 点对点传输

    每条TCP传输连接只能有两个端点,只能进行点对点的数据传输

  • 可靠传输

    TCP的三次握手和四次挥手保证了数据的可靠传输

  • 拥有拥塞控制

    当网络情况不好的时候,TCP会减小发送数据的速率和数量。保证数据的可靠传输

【面试题】

1、为什么不能使用两次握手连接?

现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

即:客户端未收到确认连接分组,会忽略服务端发来的任何数据分组 而服务端因为发出的分组超时后,会重复发送同样的分组,这就形成了死锁

2、为什么关闭的时候是四次挥手?

四次挥手不能像三次握手一样,三次握手可以将ACK+SYN 一起发送,ACK用于确认信息,SYN却是用来建立联机的;四次挥手中ACK是不能和FIN一起发送,ACK只是告诉客户端确认我收到了,等我将数据发送完毕之后会向其发送FIN的标志,所以四次挥手是不能够改变的。

四、TCP与UDP的比较

1、对比

 UDPTCP
是否连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只能是一对一通信
传输方式 面向报文 面向字节流
首部开销 首部开销小,仅 8 字节 首部最小 20 字节,最大 60 字节
适用场景 适用于实时应用(IP 电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

2、总结

  • TCP 向上层提供面向连接的可靠服务 ,UDP 向上层提供无连接不可靠服务。

  • 虽然 UDP 并没有 TCP 传输来的准确,但是也能在很多实时性要求高的地方有所作为

  • 对数据准确性要求高,速度可以相对较慢的,可以选用 TCP


参考文章


以上是关于深入浅出TCP与UDP协议的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出之 TCP协议(三次握手与四次挥手超时重发流量控制拥塞控制与UDP区别)

TCP与UDP区别的深入了解(这里只讨论IPV4情况,当然,IPV6下的TCP与UDP协议部分也能适用)

网络通信与信息安全之深入解析TCP与UDP传输协议

深入浅出php socket编程

Linux深入理解TCP协议(connectbindlistenaccept)及其源码

深入浅出TCP协议,为什么需要TCP协议?