计算机网络八股文(三)

news2024/12/23 13:45:36

目录

41.为什么每次建立TCP连接时,初始化的序列号都不一样?

42.初始序列号ISN如何随机产生?

43.既然IP层会分片,为什么TCP层需要根据MSS分片呢?

44.TCP第一次握手丢失,会发生什么?

45.TCP第二次握手丢失,会发生什么?

46.TCP第三次握手丢失,会发生什么?

47.什么是SYN攻击?如何避免SYN攻击?

48.TCP四次挥手过程?   

49.第一次挥手丢失了,会发生什么?

50.第二次挥手丢失了,会发生什么?

51.第三次挥手丢失了,会发生什么?

52.第四次挥手丢失了,会发生什么?

53.为什么TIME_WAIT时间是2MSL?

54.为什么需要TIME_WAIT状态?

55.服务器出现大量TIME_WAIT的原因有哪些?

56.服务器出现大量CLOSE_WAIT状态的原因?

57.如果已经建立了连接,但是客户端突然宕机或者断电了怎么办?

58.如果已经建立了连接,服务端的进程崩溃会发生什么?

59.TCP如何进行Socket编程?

60.connect和accept分别发生在三次握手的哪一步?


41.为什么每次建立TCP连接时,初始化的序列号都不一样?

        1)防止历史报文被下一个相同四元组的连接接收;

        2)安全性好,防止黑客伪造相同序列号的TCP报文窃取数据。

42.初始序列号ISN如何随机产生?

        ISN = M + F(源ip,源端口、目的ip,目的端口)

        M:计数器,每4微秒加1;

        F:哈希函数,根据源ip,源端口、目的ip,目的端口生成一个随机数。

        Tips:序列号(SEQ)是一个32位的无符号数,初始化序列号(ISN)可以被视为一个32位的计数器,它们都不是无限递增的,都会发生回绕为初始值的情况,所以无法通过序列号来判断数据传输的数据是新数据还是老数据

43.既然IP层会分片,为什么TCP层需要根据MSS分片呢?

        先介绍两个概念:

                MTU:网络包的最大长度,一般1500字节。

                MSS:除去IP头和TCP头之后,包能容纳数据的最大长度。

        如果TCP的整个报文(TCP头+TCP数据)交给IP层分片,由于IP层没有超时重传机制,当某一个IP分片丢失了, 目的主机无法组成完整的报文,就不能响应ACK给发送端,则会触发TCP的超时重传机制,TCP层就会重新发送整个TCP报文,重新发送全部的IP分片,重传的效率很低

        如果TCP层根据MSS分片,分片后的数据 + TCP头 + IP头的长度小于MTU,所以不用MTU分片,当某个TCP分片丢失后,只用重传该分片,提高了重传效率。

44.TCP第一次握手丢失,会发生什么?

        第一次握手报文发送后,客户端迟迟收不到服务端发送的第二次握手报文,就会触发超时重传机制,重传的SYN报文的序列号都是一样的

        每次重传的时间都是上一次重传时间2倍。当客户端的重传次数达到最大重传次数后,再等待一段时间(上一次超时时间的2倍),如果还没有收到第二次握手报文,客户端就断开连接。

45.TCP第二次握手丢失,会发生什么?

        客户端会认为自己的第一次握手报文丢失,会触发超时重传机制,重传SYN报文;服务端迟迟收不到第三次握手报文,也会触发超时重传机制,重传SYN-ACK报文。

        当双端都达到最大重传次数后,各自都等待一段时间(上次超时时间的2倍),如果还没有收到对应的报文,则各自都会断开连接。

46.TCP第三次握手丢失,会发生什么?

        客户端收到SYN-ACK报文后,就会进行第三次握手,发送ACK报文给服务端,客户端进入ESTABLISHED状态。

        服务端迟迟收不到ACK报文,服务端就会触发超时重传,重传SYN-ACK报文,直到收到第三次握手,或者达到最大重传次数,一直收不到则会断开连接。

47.什么是SYN攻击?如何避免SYN攻击?

       SYN攻击:攻击者短时间内伪造不同ip发送SYN报文和服务器进行第一次握手,服务端收到SYN报文后,创建半连接队列(SYN队列)并将该连接加入队列中,服务器发送SYN-ACK报文给攻击者进行第二次握手,攻击者不发送ACK给服务器进行第三次握手,导致服务器的半连接队列装满,后续收到SYN报文就丢弃,此时服务器就无法和真正的客户端建立连接

        避免SYN攻击的方式:

                1)增大TCP半连接队列

                2)开启net.ipv4.tcp_syncookies:绕过SYN半连接就直接建立TCP连接;

                3)减少SYN-ACK报文最大重传次数:超出最大重传次数后就断开连接。

                4)调大netdev_max_backlog:该值设置保护队列的大小,当网卡接收数据包的速度 > 内核处理数据的速度时,就会将数据包放入保护队列中。

48.TCP四次挥手过程?   

第一次挥手:客户端想与服务端断开连接,就会发送FIN=1的报文给服务端,客户端由ESTABLISHED -> FIN_WAIT_1;

第二次挥手:服务端收到报文后,发送ACK报文给客户端,服务端由ESTABLISHED -> CLOSED_WAIT;

客户端收到ACK后,由FIN_WAIT_1 -> FIN_WAIT_2;

第三次挥手:当服务端没有数据要传输时,就会发送FIN=1的报文给客户端,服务端由CLOSE_WAIT -> LAST_ACK;

第四次挥手:客户端收到FIN报文后,就会发送ACK报文给服务端,客户端由FIN_WAIT_2 -> TIME_WAIT;

服务端收到客户端的ACK报文后,由LAST_ACK -> CLOSE,服务端完成连接关闭;

客户端经过2MSL后,自动进入CLOSE状态,客户端也完成连接关闭。

49.第一次挥手丢失了,会发生什么?

        客户端发送FIN后,状态由ESTABLISH -> FIN_WAIT_1,若迟迟收不到服务端的ACK报文,就会触发超时重传机制,如果重传次数到达了最大重传次数后,再等待一段时间(上一次超时时间的2倍)后,没有收到ACK就直接进入CLOSE状态。

50.第二次挥手丢失了,会发生什么?

       服务端发送ACK报文后状态由ESTABLISH -> CLOSE_WAIT。因为ACK报文是不会重传的。所以客户端会触发重传机制,重新发送FIN报文,重传次数到达最大重传次数后,如果一直没有收到ACK,就直接进入CLOSE状态。

        小Tips:如果客户端收到ACK后,客户端状态由FIN_WAIT_1 -> FIN_WAIT_2(该状态有时间限制),之后等待第三次挥手,等待服务端的FIN报文。如果客户端断开连接使用的是close()函数(使用此函数后不可以再收发数据了),那么如果迟迟收不到服务端的FIN报文,则会在默认值60秒后自动断开连接,进入CLOSE状态;如果客户端断开连接使用的是shutdown()函数(使用此函数还可以接收数据),那么如果客户端收不到服务端的FIN报文,就会进行死等。。。。

51.第三次挥手丢失了,会发生什么?

        服务端发送FIN报文后,状态由CLOSE_WAIT -> LAST_ACK。客户端此时处在FIN_WAIT_2状态(该状态有时间限制)。如果服务端迟迟收不到客户端的ACK报文,就会进行超时重传重新发送FIN报文,如果达到最大超时重传次数后,等待一段时间(上一次超时时间的2倍)后,还没收到ACK报文,服务端就会断开连接。客户端也会在默认值60秒后关闭连接(调用close()函数的情况下)。

52.第四次挥手丢失了,会发生什么?

        客户端收到FIN后,回复ACK报文,状态由FIN_WAIT_2 -> TIME_WAIT状态,开启2MSL的定时器。服务端此时处于LAST_ACK状态,迟迟收不到ACK就会超时重传发送FIN报文给客户端,客户端收到FIN后重新发送ACK,并重置定时器,重新等待2MSL。服务端到达最大重传次数后,等待一段时间后(上一次超时时间的2倍),服务端就会自动关闭连接。客户端也会在2MSL后断开连接。

53.为什么TIME_WAIT时间是2MSL?

        MSL(Maximum Segment Lifetime,报文在任何网络上的最大生存时间)。任何报文超过这个时间就会被丢弃。

        当发送方将数据包发送给接收方后,到接收方收到这个数据需要花费1MSL,接收方回应数据给发送方直到接收方收到数据也需要1MSL,所以一来一回就需要2MSL。

        2MSL时间可以至少允许网络中的报文丢失一次。若第四次挥手的ACK报文在一个MSL内丢失了,则被动关闭方重发的FIN会在第2个MSL内到达,此时可以客户端会重新计时2MSL,并回复ACK报文。

54.为什么需要TIME_WAIT状态?

        主动关闭方,才会有TIME_WAIT状态!!!

        1)2MSL能够保证原来连接里的数据都完全的消失,防止历史连接中的数据被后面相同的四元组连接错误的接收,产生数据混乱的问题;

        2)保证被动关闭方可以正确的关闭。

55.服务器出现大量TIME_WAIT的原因有哪些?

        1)HTTP没有使用长连接:检查客户端和服务端是否都开启了HTTP Keep-Alive

        2)HTTP长连接超时:检查是否是因为网络问题,导致客户端发送的数据一直没有被服务端接收到,以至于 HTTP 长连接超时

        3)HTTP长连接的请求数量达到上限:调大服务器软件的请求数量

56.服务器出现大量CLOSE_WAIT状态的原因?

        CLOSE_WAIT状态是被动关闭方才有的。因为服务器没有调用close()函数关闭连接,无法由CLOSE_WAIT -> LAST_ACK。

        没有调用close()函数的可能原因:

                1)没有将服务端的监听socket注册到epoll;

                2)没有将新连接进行accept;

                3)没有将已经连接的socket注册到epoll;

                4)客户端要断开连接,服务端没有调用close()关闭连接。

57.如果已经建立了连接,但是客户端突然宕机或者断电了怎么办?

        在一段时间内没有任何连接相关的活动,TCP的保活机制开始起作用。每隔一段时间就会发送一个探测报文给对端,该探测报文的数据非常少,如果连续几个探测报文都没有回应,则默认该TCP连接死亡,系统内核将错误信息通知给上层应用程序。

        应用程序若想使用 TCP 保活机制需要通过 socket 接口设置SO_KEEPALIVE选项才能够生效,如果没有设置,那么就无法使用 TCP 保活机制。

        情况1:客户端正常,服务端发送探测报文后,对端正常响应,TCP保活时间会被重置,等待下一次保活机制的启动。

        情况2:客户端宕机并重启,服务端发送探测报文发给对端是会响应的,但是没有该连接的有效信息,会产生一个RST报文,就会发现该连接已被重置。

        情况3:客户端宕机,服务端发送连续的探测报文都没有响应,则表明该TCP连接已经死亡

     

58.如果已经建立了连接,服务端的进程崩溃会发生什么?

        当服务端的进程崩溃后,内核会回收该进程的所有TCP连接资源,内核会发送第一次挥手FIN报文给客户端,后续的挥手过程也是有内核完成,所以即使进程崩溃了,也可以与客户端完成四次挥手。

59.TCP如何进行Socket编程?

60.connect和accept分别发生在三次握手的哪一步?

        客户端connect函数调用发生第一次握手,accept调用发生第二次握手,connect成功返回表示第二次握手完成,accept成功返回表示第三次握手成功。

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

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

相关文章

一个python脚本解决新版剪映导出字幕收费问题

如果你是希望我能完全解决剪映收费问题,我无法帮你; 两个文件,可生成不带时间线的纯文案,MD 格式,也可以生成带时间线的 SRT 文件。 因为剪映国内版对 JSON 文件进行了加密,所以请选择国际版 Cutcap&#x…

《javaEE篇》--阻塞队列详解

阻塞队列 阻塞队列概述 阻塞队列也是一种队列,和普通队列一样遵循先进先出的原则,但是阻塞队列相较于普通队列多了两项功能阻塞添加和阻塞移除,使得阻塞队列成为一种线程安全的数据结构 阻塞添加:当队列满的时候继续入队就会阻…

电脑虚拟摄像头软件分享|用手机打破电脑摄像头的极限

随着手机摄像头的不断更新迭代,手机已经接近专业电脑摄像头的画质。这让我们可以花费更低的成本获取优质的电脑录像画面。今天小编给大家详细讲解电脑虚拟摄像头的在我们日常生活中的妙用,以及分享几款口碑不错的电脑虚拟摄像头软件。有需要的小伙伴可以…

从业务到数据,大模型应用成功的再思考!

自2022年底OpenAI发布ChatGPT以来,大模型在企业的应用方兴未艾。 大模型必须要结合落地应用,才算是长出手跟脚,真正应用于实际业务场景的解决方案中,配合“大脑”完成任务。从医疗诊断到自动驾驶,从个性化营销到智能客…

数据结构重置版(概念篇)

本篇文章是对数据结构的重置,且只涉及概念 顺序表与链表的区别 不同点 顺序表 链表 存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换,做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如,在两页PPT中,使用同一个形状对象,修改了大小和颜色。 选择切换为平滑后,可以完成如下的动画显示。 …

milvus的collection操作

milvus的collection操作 创建collection import uuidfrom pymilvus import (connections,FieldSchema, CollectionSchema, DataType,Collection, )collection_name "hello_milvus" host "192.168.230.71" port 19530 username "" password…

JavaScript:数组排序(冒泡排序)

目录 一、数组排序 二、sort()方法 1、基本语法 2、默认排序 3、自定义排序 三、冒泡排序 1、基本概念 2、实现步骤 3、过程解析 4、代码示例 5、时间复杂度 一、数组排序 对一个给定数组进行处理,使其从无序变为有序,这个过程就是数组排序&…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来,制造图形界面的移动使用,那接下来我会与你一同使用它,并进行study,如有困惑,可随时联系。 然后,需要使用pysimplgui,如果…

Vue3+.NET6前后端分离式管理后台实战(三十一)

1,Vue3.NET6前后端分离式管理后台实战(三十一)

数据开发/数仓工程师上手指南(一)数仓概念总览

前言 笔者毕业最开始从事的就是大数据开发和数据仓库建设工作,途中曾担任过人工智能工程师和计算机视觉工程师,没想到最后兜兜转转还是回到了最原本的工作数据开发工程师。但很少有写关于本职工作的技术内容输出。 之前笔者撰文内容大部分都是关于算法…

Spring Boot集成screw实现数据库文档生成

1.什么是screw? 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中&…

Postman接口测试工具的使用

一、postman简介 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。作用:常用于进行接口测试。不需要安装。 特征:简单,实用,美观,大方。 二、Postman接口测试工具的使用 Postman不需要安…

qt 自定义样式 switch开关,已解决

在日常需求中,需要对功能增加一个开关,因此做了简单封装。结果能正常使用。自定义信号接收! 实现 QWidget* switchBtn new CCendSwitchWidget(btn_value);connect(switchBtn, SIGNAL(clicked(bool,QString)), this, SLOT(clickedSlot(bool,…

【吊打面试官系列-ZooKeeper面试题】Zookeeper 的典型应用场景

​大家好,我是锋哥。今天分享关于 【Zookeeper 的典型应用场景 】面试题,希望对大家有帮助; Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布…

Zabbix监控应用

目录 一.监控tomcat 二.Zabbix监控TCP 三.zabbix监控nginx 四.snmp监控 五.监控web 六.聚合图形 一.监控tomcat 1.在tomcat服务器上安装zabbix-agent服务 [rootnode2 etc]#vim zabbix_agentd.conf 94 Server192.168.240.13 #指向当前zabbix server ##### Passive chec…

Web 性能入门指南-3.5 优化单页应用程序 (SPA)

🌸 欢迎来到前端后花园!这里是一个温馨的小角落,专为热爱前端技术的你打造。没有华丽的辞藻,只有真诚的分享。希望你能在这里找到实用的内容,学到新知识,同时也欢迎你畅所欲言,分享你的思考和见…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好,办公人…

jenkins替换配置文件

1.点击首页的【Manage Jenkins】-【Manage Plugins】,在选项【Available plugins】安装 Config File Provider Plugin ,安装后重启jenkins 2.安装完成后会有这个图标,点进去 3.点击新建,选择自定义,填入要替换的文件…

C语言 | Leetcode C语言题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; /* 求和运算 */ /* 对[0,n]求和, 减去数组每个元素, 得出丢失的元素 */ int missingNumber(int* nums, int numsSize){int i;int sum numsSize;for (i 0; i < numsSize; i) {sum i - nums[i];}return…