传输层中的TCP和UDP浅析
TCP/IP协议中,传输层有两大协议:TCP和UDP,本文介绍了TCP和UDP的概念,并介绍了TCP通信和UDP通信的原理,比较了两者的不同,分析了两者各自的应用环境。
TCP和UDP是TCP/IP网络协议中传输层的两大协议,主要负责分割并组装上层交付的数据流,为数据流提供端到端的传输服务。TCP全称是Transmission Control Protocol传输控制协议,是面向链接的可靠协议。UDP全称是User Datagram Protocol用户数据报协议,是无链接的可靠协议。下面具体描述TCP和UDP的概念。
1. TCP(传输控制协议)
TCP是一种面向链接的可靠协议,是因为利用TCP进行通信,需要建立虚电路。这种虚电路在物理上是不存在的,只是一种逻辑上认为建立了链接。此外,TCP还保证了数据包的可靠性,控制流量。TCP通信的过程分成了三步:1. 开始传输前,端到端需要通过三次握手建立链接。2. 传输过程中双方按照TCP保证可靠性。3. 传输结束之后,双方再用三次握手关闭连接。
什么是三次握手呢?
为了保证在逻辑上的链接,协议需要确保双方可以通信,因此在数据传输开始前,需要三次握手。下图标示了一个三次握手的过程,主机A为发送端,主机B为接收端。
1) A向B发送SYN请求,这是一个请求同步的信号,A的意思是说:我要向你请求同步。
2) 如果B同意建立链接,向A回复同意SYN请求的信号(SYN + ACK),B的意思是说:我同意A的同步请求。
3) A向B回复收到了同意请求的信号,(SYN + ACK),A的意思是说:我收到了B的同意信号。
通过这样的三次握手,A和B能够确定对方在线,且两者能够通信。这样就保证了链接是有效的,虚电路就建立起来了。
TCP链接如何保证可靠性?
TCP的数据包中记录了序号(seq)和应答号(ack)两个字段。三次握手成功后,seq被初始化。传输过程中,TCP继续使用这个序号来标记发送的每个数据包,发送端每传送一个数据包,序列号加一。接收端每接受一个数据包,会用ACK应答哪个seq标记的数据包收到了。
通过上述过程,TCP链接就可以保证通信的可靠性了。1. 针对于丢包或者延迟,TCP定义了重发机制。发送端监听接收端返回的ACK包,如果在一个时间窗口内发送端未能接收到ACK包,发送端就认为发送失败,重发该数据包。2. 数据包的重发机制就会导致包的重复,针对包的重复,TCP根据包的seq字段去重复。接收端接收到数据包之后,查看其seq字段,如果已经成功接收该数据包,则丢弃这个数据包。3. IP包的转发机制可能导致包的乱序,针对包的乱序,TCP同样根据包的seq字段重装数据段。保证了每个数据包能够以正确的顺序,无重复的传输到接收端,也就保证了TCP链接的传输可靠性。
TCP链接的流量控制
如果每发送一个包都要等待ACK响应,会导致传输效率太低。为了充分利用带宽,TCP引入了滑动窗口机制。发送端可以发送窗口大小规定的数据包数,当最早发送的数据包接收到ACK响应,窗口则向前滑动,发送端可以继续发送数据包。窗口越大,可以发送的数据包就越多,对带宽的利用率越高。如果窗口无限大,也就是不需要等待ACK响应,就可以一口气把所有数据包全部发送。然而窗口越小,对带宽的利用率越低。如果窗口大小为1,就意味着没法送一个数据包,都要等待ACK响应后,才能在发送下一个。
因此,通过控制滑动窗口的大小就可以控制TCP链接的流量。当网络畅通的时候,滑动窗口大小可以大一点;当网络拥塞的时候,滑动窗口小一点,大家都节约带宽。流量控制的好处是,避免了因为大量数据包重发导致网络进一步拥塞。当网络拥塞的时候,丢包率更高,会使得大量的数据包重发,使得网络进一步拥塞。不对端用户流量加以控制,可能导致网络瘫痪。
TCP链接的关闭
当应用进程没有数据继续发送时,可以关闭TCP链接,需要四次握手来保证通信双方都关闭TCP链接。下图标示了一个三次握手的过程,主机A为发送端,主机B为接收端。
TCP使用四次握手来关闭连接,主要是为了保证双方都关闭TCP链接。由于TCP链接是双全工的,因此每个方向必须单独关闭。关闭的原则是当一方完成它的数据发送任务就可以发送FIN请求关闭这个方向的链接。当接收端接收到FIN请求,就通知上层应用发送端已经发送完毕,并回复ACK响应。这时TCP链接进入一个半关闭状态,主机A已经不能向B发送数据,但是能够接收来自B的数据;而主机B能够向A发送数据,却不在接收来自A的数据。当接收端也发送FIN请求并得到ACK响应后,TCP链接就彻底关闭了。
2. UDP(用户数据报协议)
UDP为应用程序提供的是一种不可靠的、无连接的分组交付,因此,UDP报文可能会出现丢失、乱序、延时等问题。UDP直接向接收端发送数据包,并不关心接收端是否收到这些数据包。接收端按照数据包的接受顺序重组数据段,并不关心数据包的乱序、丢失等问题。
既然UDP如此不可靠,为什么要设计这样一个协议?正是由于UDP不提供可靠性,它的开销很小。由于UDP既不需要三次握手连接,也不需要ACK响应和重发机制,也没有滑动窗口机制,它的开销已经被降到了最小。
3. TCP/UDP各自适合什么场景?
3.0 TCP/UDP对比
UDP处理的细节比TCP少,没有三次握手、ACK响应和重发机制、流量控制机制,开销比TCP小得多。UDP把数据报发出去后只能希望它能够抵达目的地。UDP不能保证消息被传送到目的地,也不保证数据包的传送顺序。
TCP和UDP各有优劣。TCP的优点:
1.TCP提供以认可的方式显式地创建和终止连接。
2.TCP保证可靠的、顺序的(数据包以发送的顺序接收)以及不会重复的数据传输。
3.TCP处理流量控制。
4.允许数据优先。
5.如果数据没有传送到,则TCP套接口返回一个出错状态条件。
6.TCP通过保持连续并将数据块分成更小的分片来处理大数据块,这一点程序猿无需关心。
缺点:
1. TCP在转移数据时必须创建(并保持)一个连接,给通信进程增加了开销。
2. 等待接收端的ACK响应,让它比UDP速度要慢。
UDP优缺点:
1.UDP不要求建立和保持一个连接,开销更小。
2.UDP没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的流量开销。
缺点:
过于简单,不保证数据可靠传输,没有流量控制。
3.1 适合UDP的环境:
1.在要求实时性网络环境中,允许一定量的丢包和乱序的情况下,UDP可提供高效的网络通信。这类的场景包括音频、视频的传输,这类场景要求实时性强,且少量的丢包乱序对数据质量影响不大,因此UDP经常被选为这类场景的传输层协议。
2.在轻权通信中,当需要传输的数据量很小(可以装在一个IP数据包内)时。如果我们使用TCP,那么,先建立连接,一共需要发送3个IP数据包,然后数据传输,1个IP数据包,产生一个确认信号的IP包,然后关闭连接,需要传输5个IP数据包。使用TCPIP包的利用率为1/10。而使用UDP,只需要发送一个IP数据包。哪怕丢包(服务不成功),也可在应用层重新申请服务(重传)。
3. 在要求高效网络环境中(不需要考虑网络不好导致的丢包、乱序、延时、重复等问题时),UDP效率要高得多,因为UDP是无连接的服务,不用消耗不必要的网络资源(TCP中的协议间通信)和处理时间(预期确认需要的时间)。
3.2 适合TCP的环境
在要求可靠通信的网络环境中,最好采用TCP。当网络硬件失效或者负担太重时,数据包可能就会产生丢失、重复、延时、乱序的现象。这些都会导致我们的通信不正常的时候。如果让应用程序来担负差错控制的工作,无疑将给程序员带来许多复杂的工作,于是,我们使用独立的通信协议来保证通信的可靠性是非常必要的。
TCP应用场景最广泛,比如浏览器访问网页、网页前端和服务器之间的数据传输,都要求很高的可靠性。
参考: