众所周知,TCP需要经过三次握手才能建立起来,目的是为了使得数据包的发送和接收同步,经过三次“对话”之后,主机之间才正式发送数据。
主要问题集中在,TCP与UDP相比,是如何保证数据的可靠性的。
- 应用数据会被分割成TCP认为的最适合发送的数据块,由TCP传给IP的信息单位叫做报文段或者段(segment)。UDP传输中,应用程序产生的数据报长度将保持不变。
- TCP发送一个segment,它将启动定时器,等待目的端确认接收这个segment。当未在定时器结束前收到确认,将重传这个segment(TCP协议中的自适应的超时及重传策略)。注意,当目的端收到了发自TCP连接的另一端的数据,它将发送一个确认。这个确认通常不是立即发送,会推迟几分之一秒的时间再发送。
- TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化,若收到的segment检验和有差错,TCP将丢弃这个segment,且不发送确认,目的是希望发送端超时并重传。
- TCP的segment作为IP数据报来传输,IP数据报的到达会失序,那么segment的到达也可能会失序,如有必要,TCP将对收到的数据进行重新排序,收到的数据将以正确的顺序交给应用层。
- 同时,IP数据报会发生重复,TCP的接收端必须丢弃重复数据。
- TCP还会提供流量控制(滑动窗口)。TCP连接的每一方都有固定大小的缓存空间,TCP接收端只允许另一端发送接收端缓存区所能接纳的数据。防止较快主机使得较慢主机的缓存区溢出。
总的来说,TCP通过重传机制(两种)、校验和、有序性、流量控制、拥塞控制来保证接收数据的可靠性,也正是其与UDP的不同。
后续会对上述几种方式做详细补充。
作为无连接的传输协议,UDP应用于实时性要求较高的场合,比如音视频会议。然而,任何应用都不能完全没有可靠性的保障,那么UDP是如何保证可靠性的呢。
使用UDP协议的传输层无法保证数据的可靠传输,所以需要转移可靠性保障的阵地,那就在应用层来实现。实现方式类似于上述TCP在传输层保障可靠性的方案,不同的是这些方案在应用层实现。