TCP和UDP的区别
1、 TCP提供可靠的、面向连接的运输服务。在传输数据之前必须三次握手建立连接,数据传输结束之后,4次挥手释放连接,而且在数据传递时,又有确认应答、超时重传、滑动窗口(流量控制,防止较快主机致使较慢主机的缓冲区溢出)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)等机制保证传送数据的可靠性。TCP经常用于对网络通信质量有很高要求的地方,如文件传输,邮件发送,远程登录等场景。
UDP在传送数据之前不需要建立连接,目的主机收到UDP报文后,不需要给出确认。UDP不提供可靠交付,一般用于即时通信,如语音、视频、直播等。面向无连接,面向报文。
2、TCP支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式
3、TCP是面向字节流的,UDP是面向报文的
PS:TCP是如何保证传输数据的可靠性的?
答:通过“确认应答”、“超时重传”、“流量控制”、“拥塞控制”等级制来保证传输数据的可靠性。
TCP粘包
TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。原因可能是发送方也可能是接收方造成的。
发送方原因:TCP默认使用Nagle算法,将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。
接收方原因:TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。(传输层中TCP接收数据包到缓存的速度>应用程序从缓存读取数据包的速度)
PS:Nagle算法:避免发送小的数据包,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组,将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。
解决粘包的方法:1、发送方关闭Nagle算法。
2:应用层循环读取所有的数据,根据报文的长度判断每个包开始和结束的位置。