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

news2024/11/9 9:35:00

一、基础概念

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 就不会有,在即时通信领域,这个延迟是不可接受的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hive DDL和DML

目录 一 DDL 1.1 数据库 1.1.1 创建数据库 1.1.2 查询数据库 1.1.3 修改数据库 1.1.4 删除数据库 1.1.5 切换当前数据库 1.2 表 1.2.1 创建表 1.2.2 查看表 1.2.3 修改表 3.2.4 删除表 3.2.5 清空表 二 DML 2.1 Load 2.2 Insert 2.2.1 将查询结果插入表中 2…

C++程序设计函数部分(定义+实例)

目录 1、内联函数 2、默认形参值函数 3、重载函数 4、系统函数 1、内联函数 (1)定义 在函数前面加上 inline 申明 eg: inline double CalArea(double radius) { return 3.14*radius*radius; } void main() { double r(3.0); dou…

后缀数组的应用:[Leetcode] 321.拼接最大数(困难)

题目描述 给定长度分别为 m 和 n 的两个数组&#xff0c;其元素由 0-9 构成&#xff0c;表示两个自然数各位上的数字。现在从这两个数组中选出 k (k < m n) 个数字拼接成一个新的数&#xff0c;要求从同一个数组中取出的数字保持其在原数组中的相对顺序。 求满足该条件的…

ChatGPT 究竟在做什么?它为何能做到这些?(1)

ChatGPT能够自动生成一些表面上看起来像人类写出的文字的东西&#xff0c;是一件很厉害且出乎大家意料的事。那么&#xff0c;它是如何做到的呢&#xff1f;又是为何能做到呢&#xff1f;我在这里想大致介绍一下ChatGPT的内部机理&#xff0c;然后探讨一下为什么它能很好地生成…

ZNS 架构实现 : 解决传统SSD问题的高性能存储栈设计

声明 主页&#xff1a;元存储的博客_CSDN博客 依公开知识及经验整理&#xff0c;如有误请留言。 个人辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 内容摘要 2.2 ZNS 的架构实现 先看看 支持zone 存储的 SMR HDD 以及 支持 zonefs 的 nvme ssd 的整个存储栈形态 其中对…

前端项目-12-个人中心-二级路由配置-导航守卫-懒加载

目录 1-个人中心 1.1-个人中心路由注册 1.2-拆分二级路由组件 1.3-动态渲染我的订单页面 2-导航守卫优化 2.1-用户未登录导航守卫优化 2.2-路由独享 2.3-组件内守卫 3-懒加载 3.1-图片懒加载 3.2-路由懒加载 4-map文件处理 1-个人中心 需求&#xff1a;当用户点击支…

计算机图形学 | 实验五:模型导入

计算机图形学 | 实验五&#xff1a;模型导入计算机图形学 | 实验五&#xff1a;模型导入模型加载库AssimpAssimp简介Assimp构建Mesh && Model 类的创建MeshModel绘制模型华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&#xff…

进阶C语言

1.数据的存储 1.1 为什么数据在内存中存放的是补码 因为CPU只有加法器,而使用补码&#xff0c;就可以将符号位和数值域统一处理(即统一处理加法和减法)且不会需要额外的硬件电路。 1.2 为什么会有大小端 这是因为在计算机系统中,是以字节为单位的,比如: 每个地址单元都对应着…

双指针算法初阶

前言&#xff1a;首先&#xff0c;这是不是你所了解的双指针算法&#xff1f; for (int i 0; i < n; i) {for (int j 0; j < n; j){...} } 那你就要继续往下看了&#xff0c;双指针算法可不是简单的两层的for循环暴力&#xff0c;这并不能起到时间优化的作用。 那话…

基于html+css的图片展示9

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

educoder实训——数值类型

第1关:三角形周长及面积 任务描述 输入的三角形的三条边a、b、c 的长度,计算并依次输出三角形的周长和面积,结果严格保留2位小数。测试用例的数据保证三角形三边数据可以构成三角形。 三角形面积计算公式: 其中s=(a+b+c)/2。 输入格式 分三行输入 3 个浮点数,表示三…

银行数字化转型导师坚鹏:金融数字化转型助力乡村振兴及案例

金融数字化转型助力乡村振兴及案例课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚如何借助数字化转型助力乡村振兴&#xff1f; 不知道普惠金融模式和产品如何有效创新&#xff1f; 不知道数字化转型助力乡村振兴的成功案例&#xff1f; 课程特色&#xff1…

【用AI写周报,“卷死”同事】打造一款自动生成周报的微信小程序

文章目录前言步骤1&#xff1a;创建一个ChatGPT账号步骤2&#xff1a;创建一个微信小程序并配置API。步骤3&#xff1a;在微信开发者工具中创建一个新的微信小程序项目步骤4&#xff1a;创建ChatGPT API云函数步骤5&#xff1a;创建UI界面步骤6&#xff1a;创建发送邮件的云函数…

Kubernetes 1.27 正式发布

Kubernetes 1.27 正式发布&#xff0c;这是 2023 年的第一个版本。这个版本包括 60 项增强功能。其中 18 项增强功能进入 Alpha、29 项进入 Beta&#xff0c;还有 13 项升级为 Stable 稳定版。 主题和标识 Kubernetes v1.27 的主题是 Chill Vibes 新内容 冻结 k8s.gcr.io镜像…

replugin宿主与插件通信小结

近来replugin开发中遇到宿主和插件间需要通信的情形&#xff0c;思来只有进程间通信(IPC)才是比较好的宿主与插件的通信方式。而Android进程间通信主要有2种方式&#xff1a;Messenger和AIDL。 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android接…

矩阵和线性代数的应用

矩阵和线性代数是数学中重要的概念&#xff0c;它们被广泛应用于物理、工程、计算机科学、经济学等众多领域。本文将讨论矩阵和线性代数的一些基本概念以及它们在实际应用中的重要性和影响。 一、矩阵和线性代数的基本概念 矩阵是由数字组成的矩形数组。它可以表示线性方程组…

线程池并发服务器

线程池技术 线程池技术是一种典型的生产者-消费者模型。 线程池技术是指能够保证所创建的任一线程都处于繁忙状态&#xff0c;而不需要频繁地为了某一任务而创建和销毁线程&#xff0c;因为系统在创建和销毁线程时所耗费的cpu资源很大。如果任务很多&#xff0c;频率很高&am…

Android中级——系统信息与安全机制

系统信息与安全机制系统信息获取/system/build.prop/procandroid.os.buildSystemPropertyPackageManagerActivityManagerpackages.xmlpermissions标签package标签perms标签安全机制Apk反编译apktooldex2jarjd-guiApk加密系统信息获取 /system/build.prop 存放一些配置信息&am…

Seaborn 变量分布分析

文章目录一、数据集1.1 下载数据集1.2 字段含义说明1.3 导入数据集二、初步分析2.1 缺失值分布查看2.2 异常值分布查看2.3 查看变量分布三、数值变量分析3.1 replot()&#xff1a;多个变量之间的关联关系3.2 lmplot()/regplot&#xff1a;分析两个变量的线性关系3.3 displot()&…

从前序与中序遍历序列构造二叉树——力扣105

题目描述 法一&#xff09;递归 复杂度分析 代码如下 class Solution { private:unordered_map<int, int> index;public:TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_ri…