TCP和UDP都是传输层协议,负责在网络中传输数据。但是,它们之间存在一些关键的区别:
连接方式:TCP是一种面向连接的协议,这意味着在数据传输之前,会先建立一条专用的通信连接。而UDP是无连接的,不会预先建立连接。
可靠性:TCP设计用于在不可靠的网络中提供可靠的端对端字节流传输,因此它提供了数据传输的保证。相比之下,UDP可能不保证数据的完整性和正确性,因此可能会出现数据丢失的情况。
系统资源要求:TCP对系统资源的要求较高,因为它需要维护连接状态、重发数据等。而UDP对系统资源的要求较低,因为它不需要维护连接状态。
包头结构:UDP的包头结构相对简单,只包含源端口号、目的端口号、长度和校验和。而TCP的包头结构更复杂,包含了序列号、确认号、控制位等字段。
应用场景:TCP主要用于需要可靠传输的应用,如Web服务器、邮件服务器等。而UDP主要用于对高速传输和实时性有较高要求的通信或广播通信,如视频流、在线游戏等。
TCP保证可靠传输的方式主要有:
建立连接:通过三次握手建立连接,保证连接实体真实存在。
序号机制:对每个字节的数据都进行编号,确保数据按序、完整到达接收方。
校验和:在数据传输过程中,将发送的数据段都当做一个16位的整数,将这些整数加起来并进行取反得到校验和。发送方和接收方都会验证校验和是否相同,以此确定数据是否传输有误。
确认应答与超时重传:当接收方收到数据后,会向发送方发送一个确认应答(ACK)。如果发送方在一定的时间周期内没有收到相应的ACK,等待一定的时间,超时之后就认为这个数据包丢失,就会重新发送。
流量控制和拥塞控制:窗口控制解决了两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。
UDP协议本身无法保证可靠传输,其特性是不可靠的无连接协议。然而,其可靠性的确保实际上是借鉴了TCP可靠性传输的策略,例如:
序列号机制:虽然UDP不提供内置的序列号机制来保证数据的有序性,但应用层可以根据需求为每个数据包分配一个序列号,以此实现数据包的顺序控制。
确认应答与超时重传:同样地,UDP也不提供确认应答和超时重传机制,这些需要在应用层自行实现。当接收方收到数据后,可以向发送方发送一个确认信号,若在规定时间内未收到确认信号,则认为该数据包丢失,需要重新发送。
重排机制:由于UDP数据包可能因网络原因而发生乱序,因此在应用层需要对接收到的数据包进行排序。
窗口机制:类似于TCP的流量控制,应用层也可以实现窗口机制来控制发送速率,防止接收方处理不过来而导致丢包。