前言
TCP与UDP是传输层两个具有代表性的协议。TCP提供可靠的通信传输,UDP常被用于让广播和细节控制交给应用的通信传输。它们是通过接受数据中的目标端口号识别目标处理程序。
TCP是面向连接的,可靠的流协议,为提供可靠性传输,实行“顺序控制”或“重发机制”,还具备“流控制”、“拥塞控制”。
UDP是不具备可靠性的数据报协议。细微的处理它会交给上层应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。主要应用于那些对告诉传输和实时性要求较高的通信或广播通信。
UDP
UDP是User Datagram Protocol的缩写。不提供复杂的控制机制,利用IP提供面向无连接的通信服务,可以随时发送数据。并且它是将应用程序发来的数据在接收的那一刻,立即按照原样发送到网络上的一种机制。
即使出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即使出现丢包,UDP也不负责重发。甚至当出现包到达顺序乱掉时也没有纠正功能。如果需要这些细节控制,那么久不得不交由采用UDP的应用程序去处理。
TCP
TCP充分地实现了对数据传输时的各种控制功能,可以进行丢包时的重发机制,还可以对次序乱掉的分包进行顺序控制。作为面向有连接的协议,只有确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
TCP实现可靠性传输的机制
1、通过序列号与确认应答提高可靠性
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。反之,则数据丢失的可能性很大,也有可能是数据对方已经收到,只是返回的确认应答在途中丢失,还有可能是一些其他原因导致确认应答延迟到达,进而重新发送数据。
2、重发超时如何确定
重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。在BSD的Windows系统中,超时都是以0.5秒为单位进行控制,因此重发超时都是0.5秒的整数倍(偏差的最小值也是0.5秒,因此最小的重发时间至少是1秒)。不过由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。
数据重发之后若还是收不到确认应答,则进行再次发送。此时,确认等待时间将会以2倍、4倍的指数函数增长。
3、连接管理
由于TCP是面向连接的通信传输,会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。在通信结束时会进行断开连接的处理(FIN包)。即常见的三次握手,四次挥手过程。
4、TCP以段为单位发送数据
在建立TCP连接的同时,也可以确定发送数据包的单位,成为“最大消息长度”(MSS),最好的情况,最大消息长度正好是IP中不会被分片处理的最大数据长度。TCP在传输大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。
MSS是在三次握手的时候,在两端主机之间计算得出。两端的主机在发出建立连接请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小,然后会在两者之中选择一个较小的值投入使用。
5、利用窗口控制提高速度
TCP以1个段为单位,每发送一个段进行一次确认应答的处理,包的往返时间越长通信性能就越低。引入窗口的概念,指无需等待确认应答而可以继续发送数据的最大值。
窗口控制中确认应答不再是以每个分段,而是以窗口进行确认,即发送了一个段以后不必要一直等待确认应答,而是继续发送,转发时间会被大幅度的缩短。
6、窗口控制与重发控制
(1)确认应答未能返回的情况下,数据已经到达对端,是不需要再次发送的,然而在没有窗口控制的时候,没有收到确认应答的数据都会被重发,有了窗口控制,某些确认应答即便丢失也无需重发。
(2)某报文段丢失的情况下,在窗口比较大,又出现报文段丢失的情况下,同一个序号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,会将其所对应的数据进行重发。