精华内容
下载资源
问答
  • 其实面试官主要是想让我说出 UDPTCP 的原理上的区别,怎么给 UDP 加些功能实现 TCP。 看好去很容易就能说出一两个 TCPUDP 的区别,但如果能用女朋友都能听懂的方式该怎么说呢? 女朋友:我不想听课本上讲的...

    本篇来自于我的一次真实面试经历。

    背景

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

    其实面试官主要是想让我说出 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 的功能。相信这样回答的思路可以让面试官觉得还是有点东西的。

    参考:

    《趣谈网络协议》

    《计算机网络》

    特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
    
    
    

    长按订阅更多精彩▼
    
    如有收获,点个在看,诚挚感谢
    
    展开全文
  • 怎么用 UDP 实现 TCP

    千次阅读 2020-12-07 22:03:12
    其实面试官主要是想让我说出 UDPTCP 的原理上的区别,怎么给 UDP 加些功能实现 TCP。 下面我会以大白话的方式来解答上面的问题。 UDP 的特点 UDP 让我想起了刚毕业参加工作那会,一名毕业菜鸟。 沟通简单 领导...

    背景

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

    其实面试官主要是想让我说出 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。

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

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

    巨人的肩膀:

    《趣谈网络协议》

    《计算机网络》

    展开全文
  • UDP实现TCP可靠传输

    千次阅读 2018-10-22 11:30:12
    udptcp的区别 TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 使用超时重传、数据确认、滑动窗口等方式确保数据包被正确地发送至目的端 UDP是(User ...

    udp与tcp的区别

    • TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
      使用超时重传、数据确认、滑动窗口等方式确保数据包被正确地发送至目的端
    • UDP是(User Datagram Protocol 用户数据报协议),一种无连接的、不可靠的、基于数据报的传输层协议,提供面向事务的简单不可靠信息传送服务。
      可靠性由上层应用实现,所以要实现udp可靠性传输,必须通过应用层来实现和控制

    设计方法

    1. 添加seq/ack机制,确保数据发送到对端
    2. 添加发送和接收缓冲区,主要是用户超时重传
    3. 添加超时重传机制
      详细说明:发送端发送数据时,生成一个随机seq=x,然后每一片按照数据大小分配seq。数据到达接收端后接收端放入缓存,并发送一个ack=x的包,表示对方已经收到了数据。发送端收到了ack包后,删除缓冲区对应的数据。时间到后,定时任务检查是否需要重传数据。
    展开全文
  • 如何利用UDP实现TCP的可靠传输

    千次阅读 2019-03-06 23:38:41
    报告:https://github.com/c980129/TCP/blob/master/%E5%AE%9E%E9%AA%8C%E6%8A%A5%E5%91%8A.pdf 代码:https://github.com/c980129/TCP
    展开全文
  • TCP/UDP C语言实现

    2018-08-30 20:16:03
    TCP/UDP实现,VC++6.0环境,C语言编写,简单,供参考。
  • 下面小编就为大家带来一篇Java简单实现UDPTCP的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了python基于socket实现UDPTCP通讯功能,结合实例形式分析了基于Python socket模块的UDPTCP通信相关客户端、服务器端实现技巧,需要的朋友可以参考下
  • 主要是为探索一下这个校验和算法具体怎么实现的,需要的朋友可以参考下
  • VC WinSock API实现的聊天程序,消息部份可穿越内网,传输文件部分(TCP部分)暂且只能接收,其实与UDP类似,把TCP socket改为允许端口复用即可(WSAEADDRINUSE)
  • demo实现socket的通信 包括 tcp 客户端和服务端之间的通信 udp客户端和服务端之间的通信
  • 这是用Winform实现TCP以及UDP协议之间的通讯,包含tcp客户端与服务器端,以及内部之间的通讯。UDP也是一样的
  • netty搭建TCPUDP服务

    2020-09-23 17:05:21
    Java异步NIO框架Netty实现高性能高并发,通过netty搭建TCPUDP服务,支持物联网设备上行,下行
  • 使用纯JAVA实现UDPTCP连接 大家使用JAVA做项目的时候,较多使用NETTY等框架。 但是了解下最基本的原始用法对初学者是非常适用的
  • Python编写 实现本地通信的简单UDP/TCP的socket连接的客户服务器程序 TCP的是基于Python2.7的 UDP的是基于Python3.7的
  • WebSocket Socket TCP/UDP

    2018-11-24 13:53:01
    WebSocket Socket通信源码例子,TCP/UDP都有,适合网络通信入门的练习与学习,有一个在线的聊天室系统
  • UDP模仿TCP

    千次阅读 2018-11-28 20:59:55
    udp模仿tcp类似于socket实现tcp的功能(单方向),比如三次握手,四次挥手,超时重传快速重传等等。 模拟TCP的功能 三次握手 四次挥手 发送端要带有计时器,要实现RTT估计和RTO(重传计时器)估计。RTT如下 ...
  • 包括C#TCP&UDP服务器客户端代码
  • 使用C(或C++)等语言编写网络通信模拟程序,它由 client 和 server 两部分组成, client 和 server 之间的通信基于 TCP 或者UDP协议,要求能够实现客户和服务器端的交互对话
  • 主要介绍了使用C#实现基于TCPUDP协议的网络通信程序的示例,文中分别编写了基本的服务器端和客户端,代码十分简单,需要的朋友可以参考下
  • 采用Java语言实现TCPUDP传输,TCP方面具体功能有:在客户端获取服务器根目录下文件列表、大小等,进入指定文件夹,退出文件夹;UDP方面的功能有:在客户端通过get方法获取服务器指定文件并下载到指定路径。
  • 主要介绍了Android编程实现TCPUDP客户端通信功能,结合实例形式分析了Android实现TCPUDP通讯功能的相关操作技巧与注意事项,需要的朋友可以参考下
  • Java——UDPtcp聊天室,基本功能实现,适合新手,发送表情,字体
  • 开放端口,python ,TCP,UDP,SOCKET ,扫描端口;目前调试在windows python环境中扫描win和linux等系统环境tcpudp均正常,在linux环境中扫描其它平台,tcp正常,udp不准确。 建议考虑python 中的nmap功能;或直接...
  • C语言实现TCPUDP通信

    2012-12-03 11:53:12
    C语言实现TCPUDP通信 : C语言 TCP UDP 通信 多服务器 多客服端
  • UDPTCP实现。 基本互动 服务器侦听传入的客户端请求。 客户端(仅用于TCP)连接到服务器并发送ASCII请求“当前日期和时间是什么?” 服务器以“当前日期和时间– 09/29/2019 09:00:01”的格式响应当前日期和...
  • 主要介绍了Android中实现TCPUDP传输实例,本文给出了TCP服务器端代码、TCP客户端代码、UDP服务器端代码、UDP客户端代码等代码实例,需要的朋友可以参考下
  • qt环境实现socket数据收发,可以直接打开工程文件使用
  • windows下的基于winsock的socket编程,实现UDPTCP的数据传输,其中的TCP实现自然也包括TCP协议中的Server和Client建立连接的过程。代码易懂。
  • TCPUDP 在java上通信上的实现

    千次阅读 多人点赞 2017-03-19 21:15:01
    TCP/IP 实现通信图示: 服务器端: ServerSocket 第一步: 服务器端启动一个ServerSocket, 绑定到特定的端口号上,并对该端口号进行监听,等待用户的请求ServerSocket serverSocket = new ServerSocket(5566);第...
  • 在该范围内使用多线程机制循环创建客户端套接字对象,对某一地址(段)的主机端口进行扫描,若套接字没有发生异常,说明该端口打开并提供服务,返回该开放端口的类型(如UDP端口还是TCP端口)。 2.3 采用Java网络...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 255,340
精华内容 102,136
关键字:

udp实现tcp