秋招Day12 - 计算机网络 - UDP
说说TCP和UDP的区别?
TCP使用无边界的字节流传输,可能发生拆包和粘包,接收方并不知道数据边界;UDP采用数据报传输,数据报之间相互独立,有边界。
应用场景方面,TCP适合对数据的可靠性要求高于速率要求的场景,比如邮件传输,文件传输,网页浏览。UDP适合对速率要求高、可以容忍一定数据丢失的场景,比如即时聊天、在线视频、语音电话。
你会如何设计QQ中的网络协议?
首先是登陆功能,由于需要准确性和数据加密,所以采用TCP + SSL/TSL协议来进行登陆。
登陆之后的即时聊天/语音视频通话功能,由于实时性要求高,所以采用UDP协议。
如何保证消息的不丢失?
对于TCP协议来说,如果发生消息丢失,则会尝试进行重传(RTO超时重传/快速重传)
对于UDP协议,可以通过应用层的重传机制来保证消息不丢失。当接收方的应用层收到消息后,发送一个确认信息给发送方,如果发送方没有收到确认信息,则重传。同时,每个消息都有一个序列号,接收方通过序列号来判断消息是否丢失,如果发现序列号不连续,就要求发送方重新发送,这样还可以避免消息重复。
消息持久化也很重要,可以将消息保存在服务器或者本地数据库中,即时网络断连,也能从数据库中恢复消息。
为什么QQ采用UDP协议?
- QQ并不是全部采用UDP协议,比如文件传送采用的是TCP保证可靠性。
- 使用UDP传输信息的好处是延迟较低,对于数据丢失的处理比较简单。TCP是一个全双工的协议,需要建立连接,网络开销较大。
- 如果使用QQ语音或者视频通话,UDP的优势更能显现,首先延迟较小,其次是偶尔的丢包不需要重传,因为用户可以接受偶尔的卡顿和画面模糊,但是如果频繁出现几秒前的画面和声音,几乎是不可接受的。
- QQ的服务器设计容量是海量级的,一台服务器要容纳几十万的并发连接,因此服务器只有采用UDP与客户端通信才能保证如此大规模的服务,服务器压力小。
UDP协议为什么不可靠?
- 不保证消息交付:无确认、无重传、无超时
- 不保证交付顺序:无序号、不重排、无队首阻塞(TCP需要等待丢失的数据重传才能把数据交付到应用层)
- 不跟踪连接状态
- 不进行拥塞控制
DNS为什么要用UDP?
DNS既使用TCP又使用UDP。
使用TCP的情况是区域传送,也就是DNS服务器之间同步域名解析数据时。因为数据同步所要传输的数量大于普通的请求和响应,而TCP能够传输更大的报文长度,而且为了保证数据的正确性,所以使用TCP。
客户端向DNS服务器请求域名解析的时候使用UDP,服务器返回的内容不会超过UDP的最大允许长度,并且不需要建立连接,大大提升的响应速度,但这要求客户端自己有超时处理/请求重传/重试机制来保证响应数据的可靠性。