【面试题】网络TCP(第三篇)

1. 什么是TCP协议?

TCP(Transmission Control Protocol)即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义,为互联网中的数据通信提供了稳定的传输机制。

2. TCP的特点是什么?

TCP的特点主要包括:

  • 面向连接:在数据传输之前需要建立连接,通信结束后会断开连接。
  • 可靠传输:通过序列号、确认应答、重传机制等技术确保数据包正确无误地从源点传送到目的地。
  • 全双工通信:允许数据在两个方向上同时传输,提高了通信效率。
  • 流量控制:通过滑动窗口机制进行流量控制,避免快速发送方压倒慢速接收方。
  • 拥塞控制:实施拥塞控制策略来避免网络拥塞,如慢启动、拥塞避免、快速重传和快速恢复等。
  • 有序传输:保证数据按发送时的顺序到达接收端。

3. TCP如何保证数据的可靠性?

TCP通过以下机制保证数据的可靠性:

  • 序列号:每个数据包都有一个唯一的编号,以便接收方可以按照正确的顺序重新组合数据。
  • 确认应答:接收方会向发送方发送确认信号,表示已经接收到数据。如果发送方没有收到确认信号,会重传数据。
  • 重传机制:当数据包在传输过程中丢失或出错时,TCP会重新发送这些数据包。

4. TCP和UDP的区别是什么?

TCP和UDP是两种不同的传输层协议,它们的主要区别包括:

  • 连接性:TCP是面向连接的协议,需要在传输数据之前建立连接;而UDP是无连接的协议,可以直接发送数据。
  • 可靠性:TCP提供可靠的数据传输服务,保证数据的顺序和完整性;UDP不提供可靠的数据传输服务,不保证数据的顺序和完整性。
  • 应用场景:TCP适用于需要可靠传输的应用场景,如文件传输、邮件发送等;UDP适用于不需要可靠传输的应用场景,如音频、视频流等。

5. TCP三次握手的过程是什么?

TCP三次握手的过程包括:

  1. 第一次握手:客户端发送一个SYN包(SYN=1,seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认。
  2. 第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=1,ack=x+1),同时自己也发送一个SYN包(SYN=1,seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态。
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包(ACK=1,ack=y+1,seq=x+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

6.TCP三次握手为什么不是二次?

1. 防止失效的连接请求

  • 背景:假设在两次握手的情况下,客户端发送了一个连接请求(SYN包),但由于网络延迟或其他原因,这个请求在一段时间后才到达服务器。在请求到达之前,客户端由于未收到服务器的响应,可能会再次发送连接请求。
  • 问题:如果此时服务器收到了第一次的请求并回复了确认(ACK),那么两者将建立连接并开始数据传输。但之后,第一次的请求由于网络通畅最终也到达了服务器,服务器将再次回复确认,并尝试建立连接。然而,此时客户端并没有再次发送确认,这会导致服务器上有一个无用的连接,浪费了资源。

2. 确保双向通信的可靠性

  • 双向传输:TCP是一个双向传输协议,需要确保双方都能够发送和接收数据。
  • 两次握手的不足:在两次握手的情况下,只能确保客户端发送的数据能够到达服务器,但服务器发送给客户端的数据是否能够达到则无法保证。
  • 三次握手的必要性:通过第三次握手,客户端发送对服务器SYN的确认(ACK),服务器能够确保客户端已经收到了自己的SYN+ACK包,从而确保了双向通信的可靠性。

3. 总结

  • TCP采用三次握手而不是两次握手,主要是为了确保连接的可靠性和有效性,防止失效的连接请求导致资源浪费,并确保双向通信的可靠性。通过三次握手,客户端和服务器能够确认彼此的状态和序列号,为后续的数据传输打下坚实的基础。

7.三次握手过程中交换了哪些数据?

滑动窗口的大小以及序号

8.三次握手过程中服务器向客户端传递了几次数据?

1次

9.请简述一下滑动窗口

滑动窗口(Sliding Window)是TCP协议中一种重要的流量控制机制,用于调节发送方和接收方之间的数据传输速率,以避免网络拥塞并提高传输效率。以下是关于滑动窗口的详细解释:

1. 基本概念

  • 定义:滑动窗口是一种流量控制技术,允许发送方在不等待确认应答的情况下连续发送多个数据段,从而提高了网络的利用率。
  • 位置:滑动窗口不仅存在于数据链路层,也存在于传输层,如TCP协议。

2. 工作原理

  • 发送窗口:发送方维护一个发送窗口,表示可以连续发送的数据段的范围。发送窗口的大小取决于网络的情况和接收方的能力。
  • 接收窗口:接收方维护一个接收窗口,表示可以接收的数据段的范围。接收窗口的大小取决于接收方的缓冲区大小和处理能力。
  • 滑动操作:随着数据的发送和接收,发送窗口和接收窗口会不断滑动。当接收方成功接收到数据后,会将窗口向前滑动,通知发送方可以发送更多的数据。当发送方收到接收方的确认后,也会将发送窗口向前滑动。

3. 流量控制

  • 接收方控制:接收方通过调整接收窗口的大小来控制发送方的发送速率。如果接收方的缓冲区已满或者处理能力有限,可以减小接收窗口的大小,通知发送方减缓发送速率。如果接收方的缓冲区有足够的空间,可以增大接收窗口的大小,提高发送速率。

4. 主要优点

  • 提高传输效率:滑动窗口允许发送方连续发送多个数据段,而不需要等待确认应答,从而提高了网络的利用率和传输效率。
  • 减少延迟:通过滑动窗口机制,发送方和接收方之间可以实现并行的数据传输,从而减少了传输延迟。
  • 灵活性:滑动窗口的大小是动态调整的,可以根据网络的情况和接收方的能力来调整,从而适应不同的网络环境和传输需求。

5. 示例(假设发送窗口尺寸为2,接收窗口尺寸为1)

  • 初始态:发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧。
  • 发送数据:发送方打开0号窗口,表示已发出0帧但尚未确认返回信息。此时接收窗口状态不变。随后,发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。
  • 接收与确认:接收方收到0号帧后,0号窗口关闭,1号窗口打开,表示准备接收1号帧。发送方收到接收方发来的0号帧确认返回信息后,关闭0号窗口,并继续发送数据。

6. 归纳

滑动窗口是TCP协议中关键的流量控制机制,通过动态调整发送窗口和接收窗口的大小,实现了发送方和接收方之间数据传输速率的动态调节,有效避免了网络拥塞,提高了传输效率和稳定性。

11. TCP四次挥手的过程是什么?

TCP四次挥手的过程包括:

  1. 第一次挥手:客户端发送一个FIN包(FIN=1)用来关闭客户端到服务器的数据传送,客户端进入FIN_WAIT_1状态。
  2. 第二次挥手:服务器收到FIN包后,发送一个ACK包(ACK=1,ack=x+1)给客户端,确认序号为收到序号+1,服务器进入CLOSE_WAIT状态。
  3. 第三次挥手:服务器发送一个FIN包(FIN=1)用来关闭服务端到客户端的数据传送,服务器进入LAST_ACK状态。
  4. 第四次挥手:客户端收到FIN包后,进入TIME_WAIT状态,接着发送一个ACK包(ACK=1,ack=y+1)给服务器,确认后,服务器进入CLOSED状态,客户端经过2MSL(报文最大生存时间)后也进入CLOSED状态。

12.TIME_WAIT状态的作用?

TIME_WAIT状态在TCP协议中扮演着重要的角色,其主要作用包括:

  1. 确保可靠关闭连接
    • 当TCP连接关闭时,通信双方会交换FIN(结束)和ACK(确认)报文段。进入TIME_WAIT状态的一方会等待一段时间(通常是2MSL,即报文段最大生存时间的两倍),以确保对方也正确地接收并处理了FIN和ACK报文段。这样可以防止在网络存在延迟的情况下,对方未收到ACK报文段而导致的连接异常终止。
    • 例如,如果服务器发送了FIN包,但客户端的ACK包在传输过程中丢失,服务器会重发FIN包。在TIME_WAIT状态下,客户端能够重发丢失的ACK包,确保连接的正常关闭。
  2. 防止旧报文段干扰新连接
    • 在TCP连接关闭后,可能会有延迟的报文段在网络中滞留。如果这些旧的报文段被错误地应用于新的连接,可能会导致连接混乱或数据损坏。
    • TIME_WAIT状态可以确保有足够的时间让旧的报文段从网络中消失。具体来说,等待的2MSL时间通常足够让旧的报文段在网络中消逝,从而避免对新连接的干扰。
  3. 实现TCP全双工连接的终止
    • 在TCP全双工连接中,关闭连接的过程需要四次挥手。TIME_WAIT状态允许客户端在发送最后一个ACK包后继续等待一段时间,以确保服务器正确地处理了连接关闭的请求。
  4. 允许老的重复分节在网络中消逝
    • TCP分节可能由于网络故障而“迷途”,并在网络修复后被送到最终目的地。为了避免这些迷途的分节被误解为新的连接的一部分,TIME_WAIT状态可以确保这些分节在网络中消逝,从而避免对新连接的干扰。

归纳
TIME_WAIT状态在TCP连接的生命周期中占据重要位置,它通过确保连接的可靠关闭、防止旧报文段对新连接的干扰以及实现TCP全双工连接的终止,保证了TCP通信的稳定性和安全性。同时,它也允许网络中的旧报文段有足够的时间消逝,避免了潜在的连接混乱和数据损坏。

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

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

相关文章

【oracle】oracle索引分裂

本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 一、索引分裂概述 Oracle数据库中的索引分裂是数据库维护和性能管理中的一个重要概念,特别是在处理大量数据插入、更新和…

Python入门-基础知识-变量

1.标识符与关键字 Python语言规定,标识符由字母、数字和下画线组成,且不允许以数字开头。合法的标识符可以 是student_1、 addNumber、num等,而3number、2_student等是不合法的标识符。在使用标识符时应注意以下几点。 (1)命名时应遵循见名知…

CVPR 2024最佳论文分享:生成图像动力学

CVPR 2024最佳论文分享:生成图像动力学 CVPR(Conference on Computer Vision and Pattern Recognition)是计算机视觉领域最有影响力的会议之一,主要方向包括图像和视频处理、目标检测与识别、三维视觉等。近期,CVPR 2…

使用python在dolphinDB上运行SQL

需要先部署好dolphindb并启动数据库 步骤1:链接dolphinDB数据库 安装依赖库:pip install dolphindb 然后运行: import dolphindb as ddbdef get_dolphin_session():"""获取dolphinDB的session"""dolphin_c…

2000—2022年青藏高原遥感生态指数数据集

该数据集是基于多套MODIS数据集,选取NDVI、LST、WET、NDBSI四项指标,采用主成分分析法,生成2000-2022年500米空间分辨率的遥感生态指数(RSEI)数据集。 遥感生态指数:是一种基于遥感技术的生态环境质量综合评…

3D立体卡片动效(附源码)

3D立体卡片动效 欢迎关注:xssy5431 小拾岁月参考链接:https://mp.weixin.qq.com/s/9xEjPAA38pRiIampxjXNKQ 效果展示 思路分析 需求含有立体这种关键词,我们第一反应是采用动画中的平移、倾斜等实现。如果是立体,必然产生阴影&…

[c++] 类型推导 typeid decltype auto

前言:为什么c需要类型推导 诸如python这类语言,声明对象和函数返回时都不需要显示声明类型,如果程序比较复杂很容易在函数多级传参时找不到返回值的数据类型,这时类型推导就是一件很有意义的事了,而c/c中,函数的返回值类型都是显示传递的,不同类型之间还不能直接进行赋值,看起…

FFmpeg中位操作相关的源码:GetBitContext结构体,init_get_bits函数、get_bits1函数和get_bits函数分析

一、引言 由《音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB》可以知道,H.264 码流中的操作单位是位(bit),而不是字节。因为视频的传输和存贮是十分在乎体积的,对于每一个比特(bit&#xf…

利用圆上两点和圆半径求解圆心坐标

已知圆上两点P1,P2,坐标依次为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1​,y1​),(x2​,y2​),圆的半径为 r r r,求圆心的坐标。 假定P1,P2为任意两点,则两点连成线段的中点坐标是 x m i …

TS-常量枚举

如果使用普通的数值枚举或字符串枚举,在编译成JavaScript代码后会产生较多代码来支持各项功能,开销较大且可读性较差,而且很可能被人误用。例如,使用索引查找或反向映射会导致可读性进一步变差,出错率进一步提高。 要解…

qt 实现对字体高亮处理原理

在Qt中实现对文本的字体高亮处理,通常涉及到使用QTextDocument、QTextCharFormat和QSyntaxHighlighter。下面是一个简单的例子,演示如何为一个文本编辑器(假设是QTextEdit)添加简单的关键词高亮功能: 步骤 1: 定义关键…

redis sentinel 部署

安装Redis 建议版本不要太低 > 6.2,我这里是redis 7.2.5 curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg echo "deb [signed-by/usr/share/keyrings/redis-archive-keyring.gpg] http…

Git Flow 工作流学习要点

Git Flow 工作流学习要点 Git Flow — 流程图Git Flow — 操作指令优点:缺点:Git Flow 分支类型Git Flow 工作流程简述关于 feature 分支关于 Release 分支关于 hotfix 分支 总结 Git Flow — 流程图 图片来源:https://nvie.com/posts/a-succ…

vue全局方法plugins/utils

一、在src目录下创建一个plugins文件夹 test.ts文件存放创建的方法,index.ts用于接收所有自定义方法进行统一处理 二、编写自定义方法 // test.ts文件 export default {handleTest(val1: number, val2: number) {// 只是一个求和的方法return val1 val2;}, };三…

vue3 【提效】使用 CSS 框架 UnoCSS 实用教程

该换种更高效的方式写 CSS 啦&#xff0c;举个例&#xff1a; <div class"flex"> </div>相当于 <div class"flex"> </div> <style> .flex {display: flex; } </style>当然&#xff0c;还有超多强大的功能帮我们提升…

江科大笔记—FLASH闪存

FLASH闪存 程序现象&#xff1a; 1、读写内部FLASH 这个代码的目的&#xff0c;就是利用内部flash程序存储器的剩余空间&#xff0c;来存储一些掉电不丢失的参数。所以这里的程序是按下K1变换一下测试数据&#xff0c;然后存储到内部FLASH&#xff0c;按下K2把所有参数清0&…

注册中文网址(中文域名)有什么用?

随着互联网的全球普及&#xff0c;域名系统作为网络空间的门牌号&#xff0c;其重要性不言而喻。长久以来&#xff0c;英文域名占据了主导地位&#xff0c;但随着国际化域名&#xff08;IDN&#xff0c;Internationalized Domain Name&#xff09;技术的发展&#xff0c;注册中…

检索增强生成RAG系列2--提高RAG准确度的关键点

上一章讲到了RAG的基本流程&#xff0c;但是如果只是完成一个基本流程&#xff0c;想要在商业上使用还是不行&#xff0c;因为正常商业上的使用其准确度至少有个90%甚至更高。那么如何提高RAG的准确度&#xff0c;那么需要看看RAG有哪些关键点。 目录 1 RAG结构图2 文档处理3 …

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用

【PyQt5】一文向您详细介绍 QVBoxLayout() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&a…

前端面试题(基础篇十一)

一、DOCTYPE 的作用是什么&#xff1f; <!DOCTYPE> 声明一般位于文档的第一行&#xff0c;它的作用主要是告诉浏览器以什么样的模式来解析文档。一般指定了之后会以标准模式来进行文档解析&#xff0c;否则就以兼容模式进行解析。在标准模式下&#xff0c;浏览器的解析规…