秋招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的最大允许长度 ,并且不需要建立连接,大大提升的响应速度,但这要求客户端自己有超时处理/请求重传/重试机制来保证响应数据的可靠性。

相关推荐
殷色玫瑰38 分钟前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同1 小时前
java输入输出+方法
java·开发语言·python
Yyyyyy~1 小时前
【Java】String
java
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: 服务拆分之服务远程调用
java·开发语言·spring cloud
Wang's Blog1 小时前
Java框架 SpringCloud 快速入门: 路由断言工厂
java·spring·spring cloud
ym hyd 1111 小时前
门诊挂号系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
杨丰玮4181 小时前
C语言核心语法
java·c语言·开发语言·学习方法
海宇AI2 小时前
Java数据工程:利用海宇婚恋风险报告优化高端婚恋实名与涉诉核验合规体验
java·人工智能
CEZ2 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·开源
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: Gateway 路由的过滤器配置
java·spring cloud·gateway