计算机网络面试八股文攻略(二)—— TCP 与 UDP

2023-11-12

一、基础概念

TCP 与 UDP 是活跃于 运输层 的数据传输协议

TCP:传输控制协议

(Transmission Control Protocol)–提供面向连接的,可靠的数据传输服务。具体来说就是一种要建立双端连接才能发送数据,能确保传输可靠的通讯协议。安全性比 UDP 好,但传的没 UDP 快。

UDP:用户数据协议

(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。总结一下就是一种不需要连接,直接朝着目标发,收没收到它不管的协议。可靠性没 TCP 好,但传的比 TCP 快。

二、TCP 的三次握手与四次挥手

2.1 概念:

三次握手和四次挥手其实就是 TCP 协议连接的开始与结束需要进行的步骤。

2.2 流程图

在这里插入图片描述

参数定义

  • LISTEN:等待从任何远端TCP 和端口的连接请求。 SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
  • SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
  • ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
  • FIN_WAIT_1:等待远端 TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
  • FIN_WAIT_2:等待远端 TCP 的连接终止请求。
  • CLOSE_WAIT:等待本地用户的连接终止请求。
  • CLOSING:等待远端TCP 的连接终止请求确认。
  • LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
  • TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。 TIME_WAIT 两个存在的理由:
    1.可靠的实现tcp全双工连接的终止;
    2.允许老的重复分节在网络中消逝。
  • CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)

2.3 三次握手:

过程:

  1. 一次握手:客户端发送带有 SYN =1 的数据包到服务端 。服务端接收数据包。连接进入服务端的半连接队列
  2. 二次握手:服务端发送带有 SYN/ACK (SYN为新值,ACK 为
    SYN值+1)标志的数据包到客户端
  3. 三次握手:客户端发送带有带有 ACK (ACK 为 SYN值+1)标志的数据包到服务端。连接进入服务端的全连接队列

题目

(1)为什么要三次握手呢?

是为了确保双方的发送和接受都是正常的。

  1. 第一次握手:Client 什么都不能确认;Server 确认了对方发送正常,自己接收正常。
  2. 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:对方发送正常,自己接收正常
  3. 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常,对方发送、接收正常。

(2)为什么要传回 SYN?

为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

(3)为啥还要传 ACK?

接收方到发送方的通道还需要 ACK 信号来进行验证

(4)两次握手会导致什么问题

二次成功但没有三次握手:服务端没法确认自己的发送和对方的接收正常。
二次失败:客户端和服务端都会发起重传

(5)三次握手会导致什么问题

发送失败,得不到服务端的回应,就会发现连接失败。客户端会重置状态,重传报文。
假如数据未发送,到时间限制后,客户端会检查连接状态,发现检查失败,那状态重置,将连接从半连接状态中移除

(6)Syn 洪泛攻击

概念:属于 dos 攻击的一种。

原理:当连接进入服务端的半连接队列时,服务端需要发送 ACK 确认给对应的客户端,等到客户端返回确认后,才能将连接从半连接队列中移除。但半连接队列是有容纳上限的。假如攻击者不断发起一次握手,并丢掉二次握手发回的 ACK 包,让半连接队列的容纳达到上限。服务端就会拒绝掉一切请求,直到半连接队列空出来。这就会导致正常的请求无法执行。

解决方案:使用syn cookie解决,服务器在第二次握手时不会为第一次握手的SYN创建半开连接,而是生成一个cookie一起发送给客户端,只有客户端在第三次握手发送ACK报文并且验证cookie成功服务器才会创建TCP连接,分配资源。

(7)全连接队列的进入情况

  1. 全连接队列未满:将连接的相关信息从半连接队列中取出,放入全连接队列。之后服务端accept()处理此请求。
  2. 当全连接已满且 tcp_abort_on_overflow = 0,server会扔掉client 发过来的ack。之后隔一段时间server会重发握手第二步的syn+ack包给client,如果客户端连接一直排队不上等待超时则会报超时异常。
  3. 全连接已满且tcp_abort_on_overflow = 1时,server会发送一个reset包给client,表示废除这个握手过程和这个连接(客户端会报connection reset by peer异常)

2.4 四次挥手

过程:

  1. 一次挥手:客户端发送一个FIN为1,序列号随机生成的报文给服务器(假设序列号为M),进入FIN_WAIT_1状态;
  2. 二次挥手:服务器收到这个报文之后,发送一个ACK为1,acknowledge number=M+1的应答报文给客户端,进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。
  3. 三次挥手:服务器关闭与客户端的连接,发送一个FIN为1,序列号随机生成的报文给客户端(假设序列号为N),进入LAST_ACK状态;
  4. 四次挥手:客户端收到服务器的FIN报文后,进入TIME_WAIT状态;接着发送一个ACK为1,acknowledge number=N+1给服务器;服务器收到后,确认acknowledge number是否为N+1,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。

题目:

(1)为什么要四次挥手呢

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。

(2)为何要等待 2MSL(最大报文生存时间)

因为客户端给服务器发送的ACK报文可能会丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果服务器没有收到ACK报文,就会重发FIN,如果客户端在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止服务器没有收到ACK而不断重发FIN。2MSL 代表报文正常来回的最长时间,超过了就代表接收发生异常了。

(3)为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手

因为服务器收到客户端的FIN报文时有可能还没有做好断开连接的准备(如还有部分数据没有发给客户端,还在继续发送),但需要先发送一个ACK报文告诉客户端我收到了断开连接的请求,等服务器准备好了,再发一个FIN报文给客户端,告诉客户端可以断开连接了。

(4)什么情况下四次挥手可以变为三次

服务器收到客户端的FIN报文时,已经准备好了断开连接(没有数据要发送了)+开启了捎带应答,就可以讲ACK报文和FIN报文合并发送,变为三次挥手

(5)什么是捎带应答机制

当发送没有携带数据的 ACK,它的网络效率也是很低的,为了提高网络效率, TCP产生了延迟确认策略。
当有响应数据要发送时,ACK 会随着响应数据一起立刻发送给对方
当没有响应数据要发送时,ACK 将会延迟一段时间,以等待是否有响应数据可以一起发送
如果在延迟等待发送 ACK 期间,对方的第二个数据报文又到达了,这时就会立刻发送 ACK

三、TCP 可靠传输的实现方法

3.1 分割排序

应用数据被分割成 TCP 认为最适合发送的数据块。TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

3.2 校验和

TCP 会计算它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

3.3 流量控制与拥塞控制

(1)概念

流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
拥塞控制:流量控制是发送和接受的缓冲区滑动窗口。拥塞控制是发送与接收间的网络的滑动窗口。用于防止过多的数据注入到网络中,网络中的路由器或链路不致过载。
发送方要维持一个 拥塞窗口(cwnd) 的状态变量。窗口的大小取决于网络的拥塞程度,并且动态变化。发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

(2)拥塞控制算法

  1. 慢开始:由小到大逐渐增大拥塞窗口数值。每经过一个传播轮次,cwnd加倍。
  2. 拥塞避免:每经过一个往返时间RTT就把发送放的cwnd加1。
  3. 快重传:接收机接受到一个乱序(如越过 M3 的 M4)的数据段时,会直接返回一个重复的确认(M2)。接收机接受到 M5 时也返回一个 M2 的确认,且这个确认不必等待发送数据时一起发送。发送方累计收到三个重复的 ACK 时不必等待重传计时器,直接开始重传。
  4. 快恢复:快重传时,把(慢开始进行到现在的值)值减半,执行拥塞避免算法
  5. Reno:在上限值 ssthresh 前执行慢开始,之后执行拥塞避免。当快重传被触发表明拥塞发生后,执行快恢复。

在这里插入图片描述

3.4 ARQ协议

(1)简述

自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一。通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。具体可细分为 停止等待ARQ协议连续ARQ协议

(2)异常处理方案

超时:有一个超时计时器,超过时间则重传
确认丢失:当确认消息在传输过程丢失,接受端在重新接受到后。接受端会丢弃这个重复的M1消息,不向上层交付,并向A发送确认消息
确认迟到:当发送端未接受确认接受信息,重传后收到了两份接受信息,包括之前未接受到的。发送端就会丢弃重复的接收信息,接收端也丢弃重复的信息。

(3)停止等待ARQ协议

概念

每发完一个分组就停止发送,等待对方确认(回复ACK)。若接收方收到重复分组,就丢弃该分组,但同时还要发送确认。

优点:

实现简单

缺点:

信道利用率低,等待时间长

(4)连续ARQ协议

概念

发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认

优点:

信道利用率高,容易实现,即使确认丢失,也不必重传

缺点:

不能向发送方反映出接收方已经正确收到的所有分组的信息

四、DNS 协议

4.1 概念

DNS 协议(域名解析协议)是一个应用层协议,功能就是将人类可读的域名 (如,www.qq.com) 转换为机器可读的 IP 地址 (如,119.147.15.13)。
DNS协议默认通过 UDP 协议进行通讯,但是由于广域网中不适合传输过大的 UDP 数据包,因此规定当报文长度超过了 512 字节时,应转换为使用 TCP 协议进行数据传输。
所以,DNS 协议是少有的既可以用 UDP 协议,又可以用 TCP 协议作为底层协议的应用层协议。

4.2 缓存过程

  1. 浏览器缓存:浏览器会先检查是否在缓存中(浏览器会缓存之前拿到的DNS 2-30分钟时间),没有则调用系统库函数进行查询。
  2. 操作系统缓存:操作系统也有自己的 DNS 缓存,但在这之前,会先检查域名是否存在于本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。
  3. 路由器缓存:将请求发给路由器,查找ISP服务商缓存的DNS的服务器,如果查找到IP则直接返回,没有的话继续查找。
  4. ISP 缓存:ISP 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。
  5. 根域名服务器查询:在前面所有步骤都没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域

4.3 类型

  1. A 记录:Address:指定对应的IP,所有域名解析同一个 IP
  2. MX 记录:Mall Exchage:邮件服务器执行自己的 Mall Server,Web 请求仍可得到 A 记录的 IP
  3. CNAME 记录:Canonical Name:别名解析,为一个域名设置多个别名,更换 IP 时比较方便,但影响性能
  4. NS 记录:Name Server:指定 DNS 服务器进行域名解析

五、经典题目

5.1 TCP,UDP 协议的区别

  • UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认
  • UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信)
  • TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接
  • TCP 不提供广播或多播服务。
  • TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。

为什么及时通信要用 UDP

TCP 有三次握手机制还有 ARQ 协议等确保可靠性,但这导致 TCP 传输速度很慢,会有延迟,UDP 就不会有,在即时通信领域,这个延迟是不可接受的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络面试八股文攻略(二)—— TCP 与 UDP 的相关文章

  • 数据报总是被完整接收吗?

    大多数数据报接收函数 例如c的recv或read java的DatagramPacket类或python的SocketServer 都包含找出接收数据量的可能性 c int amount recv sock buf n MSG WAITAL
  • 具有多个接口的 Python UDP 套接字

    我正在 Windows XP 机器上用 python2 7 编写脚本 本机使用不同的网卡连接到多个网络 我遇到了一个问题 我已将 UDP 套接字绑定到特定接口 我知道您可以通过仅提供网卡现有的 IP 地址来在 Windows 中完成此操作
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • C#/Unity - 无法从异步方法调用 Unity 方法

    我正在使用Unity3D 这是我的异步方法 private void Receive IAsyncResult ar try IPEndPoint ipEndPoint null byte data udpClient EndReceive
  • 如何在QT中发送和接收UDP数据包

    我正在 QT 中编写一个小型应用程序 它通过本地网络发送广播 UDP 数据包 并等待来自网络上的一个或多个设备的 UDP 响应数据包 创建套接字并发送广播数据包 udpSocketSend new QUdpSocket this udpSo
  • 我刚刚在哪个适配器上收到此 UDP 数据包?

    我正在尝试用 C 编写一个 BOOTP 服务器 我正在接收并解析来自客户端的 BOOTP 数据包 我需要回复我的服务器 IP 地址 问题是 计算机可以有多个网络适配器 客户端还没有 IP 地址 有什么方法可以查出 UDP 数据包是在哪个适配
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • 使用 STUN 打孔

    我目前正在尝试通过 Internet 发送 UDP 消息 并且必须为端点 A 和 B 都位于 NAT 后面 设置防火墙 为此 我想使用 STUN 服务器进行打孔 当 A 创建对 STUN 服务器的请求 例如 私有 85 1 1 12 600
  • 在 macOS 10.12 上绑定到套接字时出现 NSPOSIXErrorDomain

    我正在玩CocoaAsyncSocket https github com robbiehanson CocoaAsyncSocket在 Swift 中绑定到 UDP 套接字并通过本地网络接收消息 我正在初始化一个套接字 并尝试绑定到一个端
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 如何使用 Nmap 检索 TCP 和 UDP 端口? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我需要在使用 Nmap 的同一扫描中以尽可能最快的方式检索 TCP 和 UDP 端口 我会尽力解释得更好 如果我使用最常用的命令 nmap 192 1
  • 尝试接收 UDP 多播时出现空指针异常

    在尝试了几次让简单的 UDP 多播接收器工作后 我感到很困惑 在我自己的代码无法按预期工作后 我尝试了 vertx 文档中发布的确切示例 DatagramSocket socket vertx createDatagramSocket ne
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • C# 套接字数据报溢出

    我是 C 新手 我有一个关于udp套接字的小问题 我有一个聊天服务器 它接收特定结构的数据包 udp 数据报 为什么程序在套接字缓冲区已满时才接收数据 难道以后的一切就不应该失去吗 也许会出现数据包碎片 数据包结构 udp headers
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL

随机推荐

  • 黑群晖vmm专业版_群晖的ABB应用不错,但必须吐槽群晖 VMM功能,让你看看就是不让你好好用!!!...

    吐槽君今天参加了Synology 2019 新品发布会 J V P XS等系列都有更新 还新增了UC系列 据说很牛X 但吐槽君家庭和企业都用不到UC 就自动过滤了 除了新品硬件发布 今天最大的干货更新在我看来有两个 ABB和VMM ABB
  • 一款做思维导图的神奇软件——MindMaster

    文章目录 1 思维导图的作用 2 如何下载MindMaster 3 如何使用MindMaster 3 1新建模板 3 2选择主题格式和页面格式 4 总结 1 思维导图的作用 从思维模式来开 思维导图是一种高效的模式 它主要是使用图文并茂的方
  • 软件开发的各步骤以及需要的工具

    1 需求调研 MindMap 工具使用FreeMind或MindManager 2 架构设计 UML ER 工具 PowerDesigner Togather RationalRose 3 数据库设计 PowerDesigner SQL20
  • Apple 允许您指定在您死后谁可以访问您的账户

    在周一的WWDC 2021活动中 Apple 宣布 从今年秋季的 iOS 15 和 macOS Monterey 操作系统更新开始 将可以指定在您死亡的情况下谁可以访问您的账户 新功能称为数字遗产 它使亲戚或朋友更容易访问已故亲人拥有的数码
  • ZYNQ7000系列 DDR读取正确性

    摘要 使用ZYNQ或者MPSoC的好处是可以通过PL逻辑设计硬件加速器 对功能进行硬件加速 加速器和ARM之间的交互信息一般包含自定义加速指令传递 待计算数据以及计算结果 这三种交互信息 使用ZYNQ或者MPSoC的好处是可以通过PL逻辑设
  • java 档案整理 生成归档章 透明背景图片

    import javax imageio ImageIO import java awt import java awt image BufferedImage import java io File import java io IOEx
  • unity3d鼠标点击,获取世界坐标

    unity中有关于鼠标位置的函数 Input mousePosition 但不得不说 这个函数不到位 可以用一个print函数输出一下这个坐标会发现 只有X Y值在改变 Z值没有发生变化 并且在屏幕的左下角固定为 0 0 0 查看文档后发现
  • 类加载器是否为空

    package com bzu csh 项目名称 Test1 类名称 Test2 类描述 创建人 admin 创建时间 2017年1月7日 下午9 41 36 修改人 admin 修改时间 2017年1月7日 下午9 41 36 修改备注
  • 数据可视化之折线图绘制

    使用python中的matplotlib绘制折线图 环境需求 python 或者anaconda pycharm 和第三方库matplotlib 首次先绘制简单的折线图 其他的参数可以在使用熟练后一点一点的加入 import matplot
  • 计算机网络课程笔记

    学习MOOC华南理工计算机网络课程笔记 第1章 概述 1 1 为什么要学习计算机网络 1 2 互联网发展史 1 3 常用的基本概念 1 4 参考模型 1 5 参考模型相关概念 1 6 本课程的组织 第2章 物理层 2 1 物理层概述 2 2
  • JNI编程—JNI基础

    什么是JNI 怎么使用 JNI Java Native Interface 它是Java平台的一个特性 并不是Android系统特有的 其实主要是定义了一些JNI函数 让开发者可以通过调用这些函数实现Java代码调用C C 的代码 C C
  • python 如何编写一个自己的包

    python 如何编写一个自己的包 先写function 内容 package wadepypk ls init py f1 py f2 py f1 py def show print in pkg f show f2 py def sho
  • unix bsd linux gun   粗略解释

    最早的unix是开放的 很多组织对unix都有修改 期中比较有名的就是伯克利大学的修改版本 叫做bsd 是unix的分支 由于bsd的协议允许你直接使用 修改他的代码 并且可以作为商业用途 所以很多公司的unix都是从bsd衍生过来的 比如
  • mongodb学习笔记一:mongodb安装与介绍

    一 前言 最近开始学习非关系型数据库MongoDB 却在博客园上找不到比较系统的教程 很多资料都要去查阅英文网站 效率比较低下 本人不才 借着自学的机会把心得体会都记录下来 方便感兴趣的童鞋分享讨论 部分资源出自其他博客 旨将零散知识点集中
  • C/C++函数模板template

    1 说明 当函数处理功能相似 函数名相同 但是参数个数或者类型有区别 我们知道实现的方式是依靠函数重载 overload 但是如果仅函数参数或返回数的类型不同 我们想到靠函数模板解决这个问题 不仅节省内存 而且不用复杂声明多个函数 函数模板
  • 为线程池中的每个线程设置UncaughtExceptionHandler

    参考了 java并发编程实战 P134内容 每当线程池需要创建一个线程时 都是通过调用线程工厂方法来完成的 默认的线程工厂方法将创建一个新的 非守护的线程 并且不包好特殊的配置信息 如果你希望在线程运行之前 之后 或者运行中如果发生异常等情
  • Linux 系统 lscpu 命令详解

    文章目录 前言 lscpu 命令详解 命令 1 查看物理 CPU 个数 2 查看每个物理 CPU 核数 3 查看总线程数 4 查看内存信息 5 查看 linux 系统版本 前言 Linux 系统查看系统相关信息方法很多 以下详细介绍 lsc
  • 一颗二叉树代码(图解)

    什么是二叉树 树结构是一种非线性存储结构 存储的是具有一对多关系的数据的集合 而树形结构的一种抽象出来的数据结构往往是二叉树的形式 满足以下两个条件的树就是二叉树 本身是有序树 树中包含的各个节点的度不能超过 2即只能是 0或者1 或者 2
  • 项目时间管理-架构真题(二十四)

    1 霍尔提出了系统方法的三维结构体系 通常称为霍尔三维结构 这就是系统工程方法论的基础 霍尔三维结构以时间堆 堆 知识堆组成的立体结构概括性表示出系统工程在各阶段 各步骤以及所涉及的知识范围 其中时间维是系统的工作进程 对于一个具体的工程项
  • 计算机网络面试八股文攻略(二)—— TCP 与 UDP

    一 基础概念 TCP 与 UDP 是活跃于 运输层 的数据传输协议 TCP 传输控制协议 Transmission Control Protocol 提供面向连接的 可靠的数据传输服务 具体来说就是一种要建立双端连接才能发送数据 能确保传输