热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

阿里巴巴终面技术挑战:如何利用UDP实现TCP功能?

在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用UDP实现TCP功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对UDP和TCP在原理上的差异的理解,以及如何通过UDP实现类似TCP的可靠传输机制。



本题是在面试中,技术总监问的一道真题,当时答得不太好,所以把它揪出来总结了下。后来问了下总监,总监说这是阿里的面试题。。

其实面试官主要是想让我说出 UDP 和 TCP 的原理上的区别,怎么给 UDP 加些功能实现 TCP。

看好去很容易就能说出一两个 TCP 和 UDP 的区别,但如果能用女朋友都能听懂的方式该怎么说呢?

女朋友:我不想听课本上讲的!我听不懂呀~

下面我会以大白话的方式来解答上面的问题。

UDP 的特点
UDP 让我想起了刚毕业参加工作那会,一名毕业菜鸟。

沟通简单
领导安排的任务,直接干就完了。

UDP 也是,相信网络世界永远是美好的,我发送的包是很容易送到的,接收方也是很容易组装的。数据结构也很简单,不需要大量的数据结构、处理逻辑、包头字段。

轻信他人
测试人员报的 bug 我也不会和她争论什么,永远相信测试人员是对的,测试人员说啥就是啥,我改就是。

UDP 也是,不会建立连接,有个端口号,谁都可以监听这个端口号往上面发数据。也可以从这个端口号传给任何人数据。反正我只管发就是。

不会讨价还价
产品经理昨天说手机壳需要根据心情变色,测试人员说这个 bug 要把关联的两个 bug 一起修掉。那就按照他们说的做吧!

UDP 也是,不懂坚持和退让。也就是根据网络情况进行拥塞控制。无论网络丢包多严重,我还是照样发~

UDP 使用场景
针对像我那时候毕业菜鸟的情况,领导给我安排了三种工作环境让我选。

内部系统,任务简单,模块单一,不需要考虑代码的关联影响,即使失败了也没有关系。
UDP 也是,需要资源少,网络情况比较好的内网,或者对于丢包不敏感的应用。

有一个强力的团队支持,都是中高级开发、测试人员,团队成员打过很多年交道,互相信任。有什么问题,吼一嗓子就可以了!
UDP 也是,不需要一对一沟通来建立连接,可以广播的应用。

一个新项目,需要有激情,对于刚毕业的菜鸟,都是有很强的自主能动性的,也不会耍滑头,躲在厕所玩手机,带薪拉shi ?即使项目不忙,我也抓紧时间干。项目忙,还是一样干!
UDP 也是,猛着发包就是,主要应用在需要处理速度快,时延低,可以容忍少数丢包的情况。即使网络情况不佳,发包就是~

针对上面的三大场景,UDP 常用在实时竞技游戏,IoT 物联网,移动通信领域。

TCP 的特点?
面向连接
TCP 和 UDP 是传输层里面比较重要的两个协议。大部分面试的时候都会问到两者的区别。而大部分都会两句,比如 TCP 是面向连接的,UDP 是面向无连接。

那什么是面向连接?

TCP 三次握手是我们常常念叨和背诵的。而在这三次握手成功后,就是建立连接成功。

那什么又叫面向呢?

我们也常听到面向对象编程、面向切面编程、面向服务编程。那到底什么是面向?

在我看来 面向 就是遵循一定的协议、规范、数据结构等来做一系列事情。

比如面向连接,就是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据来保证所谓的面向连接的特性。

知道了 TCP 的是用三次握手来建立连接,那我们是否可以让 UDP 也发三个包来模拟 TCP 建立连接?可以是可以,但是如果只是建立,而不是面向连接,其实意义不大。

那 TCP 面向连接做了哪些事情?

TCP 提供可靠交付,通过 TCP 连接传输的数据,可以无差错、不丢失、不重复、并且按序到达。而 UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。

面向字节流
TCP 是面向字节流,所谓字节流,就是发的是一个流,没头没尾。TCP 自己维护流状态。

UDP 基于 IP 数据报,一个一个地发,一个一个地收。

拥塞控制
TCP 拥有拥塞控制,如果包丢弃了或者网络环境不好了,就会根据网络情况自行控制自己的行为,看下是发快点还是发慢点。

UDP 则没有这么智能了, 你让我发,我就发呗,反正是你让我发的,其他的一概不管~

有状态服务
TCP 是一个有状态的服务,有状态可以理解为:我记录了哪些发送了,哪些没有发送,哪些接收到了,哪些没接收到,应该接收哪个了,一点差错都不行。TCP 干的事情可真多!

而 UDP 则不是有状态的服务,我只管发,其他的就交给接收端吧,有点任性是吧?

如何让 UDP 实现 TCP 功能?
建立连接上面已经讲到了,三次握手和四次握手,UDP 也可以模拟去做。

那下面还有几个问题:

顺序问题
丢包问题
流量控制
拥塞控制
TCP 的数据结构长这样:
在这里插入图片描述

其实如果你能把这些结构讲清楚,就已经理解了 TCP 的核心功能。下面我还是用大白话的方式来讲解上面的四个问题。

顺序问题和丢包问题可以利用确认与重发的机制。假如包收到了,可以做一个确认,发送一个 ACK 给发送端,告诉他我收到了。假如有的包提前到了,就缓存着。假如有包丢失了,就可以超时重试。超时重试不宜过短,时间必须大于往返时间 RTT,否则会引起不必要的重传。也不宜过长,如果超时时间过长,访问就变慢了。那怎么确定这个时间,可以通过采样 RTT 的时间,进行加权平均。还需要根据网络状况,动态变化。可以了解下自适应重传算法。

流量控制就是根据网络情况调整发包的速率。利用的是滑动窗口。在对于包的确认中,同时会携带一个窗口的大小,只要利用好这个窗口大小,就能很好地调整发包速率,发的报文段不要超过窗口的大小就 OK。(图片来源网络)
在这里插入图片描述

拥塞控制主要用来避免包丢失和超时重传,如果出现了这两种现象,就说明发的速率太快了。那最开始怎么知道发送速率呢?其实开始时只发送一个报文段数据,如果收到一个确认,则倍增报文段,依次类推。当发现超时重传时,就又回到只发送一个报文段的情况,这个就是慢启动,这种方式不合适。其实还有一种快速重传算法,简单来说就是拥塞窗口减半,后续线性增速。针对于算法怎么实现的,这里就不展开讲述了。(图片来源网络)

在这里插入图片描述

至此,我用大白话的方式讲解了 UDP 和 TCP 的区别,以及 UDP 缺什么功能,需要怎么去弥补才能实现 TCP 的功能。相信这样回答的思路可以让面试官觉得还是有点东西的。

总结了2020面试题,这份面试题的包含的模块分为19个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM 。
在这里插入图片描述

获取资料以上资料:关注公众号:有故事的程序员,获取学习资料。
记得点个关注+评论哦~

以下文章来源于公众号悟空聊架构 ,作者悟空聊架构



推荐阅读
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 龙蜥社区开发者访谈:技术生涯的三次蜕变 | 第3期
    龙蜥社区的开发者们通过自己的实践和经验,推动着开源技术的发展。本期「龙蜥开发者说」聚焦于一位资深开发者的三次技术转型,分享他在龙蜥社区的成长故事。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 菜鸟物流用户增长部现正大规模招聘P6及以上级别的JAVA工程师,提供年后入职选项。 ... [详细]
  • 深入解析层次聚类算法
    本文详细介绍了层次聚类算法的基本原理,包括其通过构建层次结构来分类样本的特点,以及自底向上(凝聚)和自顶向下(分裂)两种主要的聚类策略。文章还探讨了不同距离度量方法对聚类效果的影响,并提供了具体的参数设置指导。 ... [详细]
  • 实践指南:使用Express、Create React App与MongoDB搭建React开发环境
    本文详细介绍了如何利用Express、Create React App和MongoDB构建一个高效的React应用开发环境,旨在为开发者提供一套完整的解决方案,包括环境搭建、数据模拟及前后端交互。 ... [详细]
  • PHP面试题精选及答案解析
    本文精选了新浪PHP笔试题及最新的PHP面试题,并提供了详细的答案解析,帮助求职者更好地准备PHP相关的面试。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
  • 本文详细记录了腾讯ABS云平台的一次前端开发岗位面试经历,包括面试过程中遇到的JavaScript相关问题、Vue.js等框架的深入探讨以及算法挑战等内容。 ... [详细]
  • 深入解析JVM内存模型与分配机制
    本文详细探讨了JVM内存结构的主要组成部分,包括Java虚拟机栈、Java堆、方法区等,并深入分析了HotSpot虚拟机的分代收集策略及其对不同内存区域的管理方式。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 深入解析Dubbo:使用与源码分析
    本文详细介绍了Dubbo的使用方法和源码分析,涵盖其架构设计、核心特性和调用流程。 ... [详细]
  • 深入解析Linux中的slabtop命令
    本文将详细介绍如何在Linux系统中使用slabtop命令,帮助读者更好地理解和监控内核slab缓存的使用情况。通过本文的学习,您将掌握slabtop命令的基本用法及其高级功能。 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
author-avatar
郭楠v
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有