TCP/UDP概述
在网络协议中,运输层中具有两个非常重要的协议,分别是TCP和UDP。对此,先简述一下运输层:
①从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
②从运输层角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
网络层和运输层有着明显的区别。网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信
UDP(面向无连接)
UDP特点
用户数据报协议UDP只在IP的数据报服务之上增加了很少一点功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点是:
(1)UDP是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销的发送数据之前的时延。
(2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表(这里面有许多参数)
(3)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,即不合并,也不拆分,而是**保留这些报文的边界如下图:
(4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。因为一些实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发送拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP正好适合这种要求。
(5)UDP支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
存在的问题
虽然某些实时应用需要使用没有拥塞控制的UDP,当很多的源主机同时都向网络发送高速率的实时视频流时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不使用拥塞控制功能的UDP有可能会引起网络产生严重的拥塞问题。
TCP(面向连接)
TCP特点
TCP(Transmission Control Protocol,传输控制协议)是面向连接的连接的协议。什么叫做面向连接呢?就是说你要与对方进行数据的传输时,那么你就要与对方建立一条连接,才能进行一个通信。TCP主要的特点是:
(1)TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。也就是说,应用进程之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。
(2)每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)。
(3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4)TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序把数据传送给TCP的缓存后,就可以做自己的事情,而TCP在合适的时候把数据发送出去。在接收时,TCP把接收到的数据存入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。TCP中的“流(stream)” 指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。并且TCP是不保证这些大小对应的关系。
备注:TCP连接是一条虚连接(也就是逻辑连接),而不是一条真正的物理连接。TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层。再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。
可靠传输的工作原理
我们知道,TCP发送的报文段是交给IP层传送的,但是IP层只能提尽最大努力服务,也就是说,TCP下面的网络所提供的是不可靠的传输。因此TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。
理想的传输条件有以下两个特点:
(1)传输信道不产生差错。
(2)不管发送方以多快的速度发送数据,接受方总是来得及处理收到的数据。
在这样的理想传输条件下,不需要采取任何措施就能够实现可靠传输。
然而实际的网络都具备以上两个理想条件,但是我们可以使用一些可靠的传输协议,当出现差错时,我们可以让发送方重新发送出错的数据,同时接收方来不及接收处理到的数据时,及时告诉方法方适当降低发送数据的速度。如下面的停止等待协议。
停止等待协议
全双工通信的双方既是发送方也是接受方。“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认之后在发送下一个分组。接来下仅考虑A发送数据而B接收数据并发送确认。
无差错情况与出现差错的情况
确认丢失和确认迟到
使用上图中的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。 像上述的这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。
信道利用率
停止等待协议的优点是简单,但是缺点是信道利用率太低。假定在A和B之间有一条直通的信道来传送分组,如下:
解决方法:为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。流水线传输就是发送方可连续发送多个组,不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据不间断地在传送。显然,这种传输方式可以获得很高的信道利用率。
当使用流水线传输时,就要使用连续ARQ协议和滑动窗口协议。
连续ARQ协议
下图表示发送方维持的发送窗口,它的意义是:位于发送窗口内的5个分组都可连续发送出去,而不需要等待对方的确认。这样,信道利用率就提高了。
图表示发送方收到了对第 1 个分组的确认,于是把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,那么现在就可以发送窗口内的第6个分组了。
接收方一般都是采用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为之止的所有分组都已正确收到了。
累积确认的优缺点
优点:容易实现,即使确认丢失也不必重传。
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
滑动窗口
TCP的滑动窗口是以字节为单位的。
TCP的流量控制
利用滑动窗口来实现流量控制
一般来说,我们总是希望数据输得更快一点。但如果发送方把数据发送得很快,接收方就可能来不及接收,这就会造成数据的丢失。所谓的流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
如下图例子:
TCP的拥塞控制
TCP的运输连接管理
注释:
确认ACK:当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若是同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
确认号ack
初始序号seq
终止FIN:用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。