TCP,UDP的区别
TCP UDP的区别
- TCP是点对点,一对一;UDP可以一对一、一对多、多对一、多对多
- TCP是面向连接的,UDP是面向无连接的。TCP在发送请求的时候,会去先使用三次握手进行链接,而UDP不会。
- TCP是提供可靠交付的,它能够保证无差错,不丢失,不重复,按序到达。UDP不提供可靠交付。
- TCP提供拥塞控制,而UDP没有
- UDP支持广播,TCP不支持
- TCP面向字节流,UDP面向数据报
- 数据报大小
- **TCP:**由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于缓冲区有大小限制,所以你如果用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。
- **UDP:**由于 UDP 本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小。
那在什么时候我们非用 UDP 不可:
- **对实时性要求高:**比如实时会议,实时视频这种情况下,如果使用 TCP,当网络不好发生重传时,画面肯定会有延时,甚至越堆越多。如果使用 UDP 的话,即使偶尔丢了几个包,但是也不会影响什么,这种情况下使用 UDP 比较好;
- **多点通信:**TCP 需要保持一个长连接,那么在涉及多点通讯的时候,肯定需要和多个通信节点建立其双向连接,然后有时在NAT环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,而 UDP 可以无需保持连接,直接发就可以了,所以成本会很低,而且穿透性好。这种情况下使用 UDP 也是没错的。
1. Tcp保证可靠性的,Udp不保证可靠性
Tcp提供可靠服务,通过Tcp传输的数据,无差错、不丢失、不重复,且有序回复。而Udp尽最大努力提供交付,处理逻辑简单,不保证可靠性,不保证不丢失、不保证顺序。Tcp会从这几个方面来保证可靠性:
1-1 面向连接
Tcp是面向连接的,在传输数据之前需要三次握手建立连接,连接成功后才能发送数据。Udp在发送数据之前不需要建立连接,是无连接的。并且Tcp的连接是点对点的,但是Udp发送数据是支持一对一、一对多、多对一、多对多的。
1-2 有序确认
Tcp的每个包都有一个32位的序号,在建立连接的时候会商定起始序号,然后按照序号一个一个的发送,并且为了保证不丢包,对于发送的包都会进行ACK应答。并且ACK是有序的,比如说序号大的包已经到达接收端了,但是有序号小的包还未到达,此时接受端不能立即应答序号大的包,而是需要等待序号小的包到达并应答后才轮到序号大的包。Udp没有此机制。
1-3 重传机制
Tcp对于每一个发送了但是没有接收到接收端应答的ACK,当一个包经过了一段时间仍然没有收到对应的ACK,那么发送端就会重传这个包,这个叫重传机制。
1-4 拥塞控制
Tcp会在出现包丢失和超时重传时对发包速度进行调整,首先是慢启动,当出现拥塞(丢包、超时重传)情况时,就会下降发送速度,以适应不好的网络环境。而Udp并不会对网络环境状况做出相应的发包素的的变化。
1-5 维护的数据结构
上述机制的代价就是需要维护额外的数据结构,比如建立连接双方都需要维护状态机,有序、重传机制、拥塞机制需要维护窗口去做相应的记录。又因为这样,所以Tcp的首部也比Udp的复杂,越复杂,做的工作也就越多,那效率自然也就会低一点了。
2. Tcp面向字节流,Udp基于数据报
Tcp传输的数据是以字节流的形式传输的,而Udp是以数据报的形式传输的。在使用Socket编程时,如果使用的是Tcp,那么发送数据和接收数据都是从socket获取inputStream或者outputStream,然后通过流读取数据。而如果使用的是Udp,那在发送数据时就会将数据封装成一个DatagramPacket,接收也以DatagramPacket接收的。