计算机网络面试题——第二篇

news2024/9/30 13:37:52

1. TCP拆包和粘包

  1. 现象
  • 粘包:指在TCP传输中,发送方的多个数据包在接收方被合并在一个包接收,导致多条消息数据粘在一起,接收方无法正确区分这些消息的边界。
  • 拆包:指的是发送方的一个数据包在接收方被分成了多个包接收,导致一条完整的消息被拆分成多个部分,接收方无法一次性接收到完整的数据。
  1. 原因
  • 粘包:主要原因是TCP是面向字节流的协议,他不关心数据边界,数据在发送方可能被一次发送,接收方在读取时可能会将多个消息拼接在一起。
  • 拆包:可能由于网络传输中的MTU(最大传输单元)限制或者发送缓冲区大小限制,一个大包被分成了多个小包传输。
  1. 解决方法
  • 使用定长消息:每个消息都有固定的长度,接收方按照固定长度读取数据。
  • 添加消息分隔符:在每个消息之间添加特定的分隔符,接收方可以通过分隔符来区分消息。
  • 使用消息头:在消息的头部添加一个长度字段,指示消息的长度,接收方根据这个长度来读取相应长度的数据。

2. TCP的三次握手

具体流程为

  1. 客户端首先发送一个SYN消息给服务器
  2. 服务器收到后回复一个SYN-ACK消息
  3. 最后客户端在发送一个ACK消息确认已收到

为什么需要三次握手
有两个原因:

  • 避免历史错误连接的建立,减少通信双方不必要的资源消耗。
  • 帮助通信双方同步初始化序列号。
  1. 为什么三次握手,可以避免历史错误连接的建立
  • 因为网络情况比较复杂,发送方第一次发送请求后,可能由于网络原因被阻塞住了,此时发送方可能又会再次发送请求。
  • 如果握手只有两次,那么接收方应对发送方的请求只能拒绝或者接受,但是他无法识别当前的请求是旧的请求还是新的请求。
    在这里插入图片描述
    并且 如果网络阻塞时间较长,发送方可能多次发送请求,且接收方还可能全部接受这些连接,这就造成了资源的不必要浪费。
    如果要避免这种情况发生,两次通信是不够的。发送方需要知晓接收方到底接收了哪个链接,如果接受的是老连接,那么发送方需要告知接收方,这个连接不对,也就是RST通知,如果对,那么就返回ACK告知接收方OK。这就使得一次握手至少需要三次。
    在这里插入图片描述
  1. 帮助通信双方同步初始化序列号
    因为网络本身的不稳定性可能会导致
  • 数据丢失
  • 数据重复传输
  • 数据乱序
    而TCP是一个可靠的传输协议,需要保证数据不丢失且有序的传输,基于上述问题,TCP引入了序列号,他使得
  • 接收方可以根据序列号去重
  • 接收方可以根据序列号排序
  • 发送方针对未接收到ACK序列号对应的数据包,可以重传。
    序列号是有序的,因此在通信的初始阶段,双方就需要同步序列号,不然数据对不上。
    在这里插入图片描述
  • 发送方通过SYN控制消息并携带自己期望的初始序列号SEQ给接收方
  • 接收方收到SYN消息之后,通过ACK控制消息以及SEQ+1来进行确认,并带上自己的SEQ。
  • 发送方通过ACK控制消息以及接收方的SEQ+1来进行确认,并且还能够在三次握手通信的同时,直接携带数据进行传输。

3. TCP初始序列号ISN怎么取值

初始序列号ISN是以时间戳为基础生成的。

为什么序列号不能写死,比如从0开始

如果写死一个值,比如0,那么建设已经建立好连接了,client也发了很多比如已经发了20个包了,然后网络断了之后client重新连接,端口号还是之前那个,序列号又从0开始,此时服务端返回第20个包的ack,此时就会乱序。

4. TCP三次握手时,发送SYN之后就宕机了会怎么样

client发送SYN至server后宕机了,此时server发送syn+ack就一直得不到回复,此时会进行阶段性重试,多次重试后还没有收到ACK则断开连接,释放资源。

重试次数由系统参数tcp_synack_retries决定,在linux中默认重试5次,分别间隔为1s、2s、4s、8s、16s。

5. 什么是SYN Flood攻击

SYN Flood是一种拒绝服务攻击(Dos),攻击者通过发送大量的SYN包来耗尽服务器的资源,从而使得服务器无法响应用户的连接请求。

攻击是利用TCP三次握手的机制,攻击者发送大量的SYN包,但是不完成后续的握手步骤,导致服务器在等待未完成连接的状态下耗尽资源。

如何防御SYN Flood攻击

  1. SYN Cookies:根据第一次握手的客户端信息,生成cookies,随着第二次握手返回给客户端,后续客户端第三次握手时携带cookies,最终建连接,这个过程不会使用SYN队列
  2. 缩短连接超时时间
  3. TCP半连接队列扩展:增大服务器的半连接队列,使其能够容纳更多的未完成的连接。

6. 什么是TCP的四次挥手

TCP的四次挥手用于完全关闭一个以建立连接的过程,他确保双方都能完成数据传输并且安全的释放连接资源。

步骤

  1. 第一次挥手(FIN->ACK): 客户端主动关闭连接,发送FIN包,进入FIN_WAIT_1状态,服务器收到fin后,表示不再接受数据,但仍可能继续发送数据。
  2. 第二次挥手(ACK):服务器发送ACK后,确认已经收到FIN。此时服务器进入close_wait状态,客户端进入fin_wait_2状态。
  3. 第三次挥手(FIN->ACK):服务器完成所有数据传输后,发送fin包,进入last_ack状态,客户端收到fin后,准备关闭连接。
  4. 第四次挥手(ACK):客户端发送最后一个ACK包,进入time_wait状态,等待可能迟到的fin包。服务器收到ACK后,关闭连接,进入closed状态。客户端在TIME_WAIT计时结束后,正式关闭连接。
    在这里插入图片描述

1. 为什么挥手需要四次
主要是为了 确保数据完整性。TCP是一个全双工协议,也就是说双方都要关闭,每一方都向对方发送FIN和响应ACK。

  • 客户端发起连接断开,代表客户端没数据要发送,但是服务器可能还有数据没有返回客户端。
  • 服务器发送完成,发送FIN,客户端再向服务端发送ACK。
    所以,一个FIN+ACK代表一方数据结束传输,因此,需要两对FIN+ACK,加起来就是四次通信。

2.挥手一定要四次吗
不一定,有时候可以变成三次挥手

在这里插入图片描述
如果client发送FIN给server的时候,server已经没数据发送给client了,那么Server就可以将ACK和他的fin一起发送给client,这样一来就变成三次挥手。

7. 为什么TCP挥手需要有TIME_WAIT状态

  1. 确保最后的ACK被成功接收
  • 在TCP四次挥手过程中,主动关闭连接的一方在发送最后一个ACK确认后进入TIME_WAIT状态。
  • 如果这个ACK丢失了,另一方(被动关闭连接的一方)没有收到确认包,会重发FIN报文。主动关闭的一方需要在TIME_WAIT状态下保持一段时间,以便能够重发ACK,确保连接能够被正确的关闭。
  1. 防止旧的重复分段干扰新连接
  • TCP连接在关闭后,可能会有一些延迟的或者已经失效的报文还在网络中传输,如果立即重新使用相同的IP地址和端口建立新的连接,可能会受到这些旧报文干扰。
  • TIME_WAIT状态可以确保在旧连接的所有报文都超时失效后,才允许新的连接使用相同的IP地址和端口,从而避免数据混乱。
    在这里插入图片描述

为什么TIME_WAIT等待的是2MSL

MSL是TCP报文段在网络中可以存活的最大时间。Linux是30s。

为什么设置了2MSL

假设被动关闭方没有客户端的最后一个ACK,此时就会触发超时重发FIN。当客户端收到FIN后,会重发ACK给被动关闭方,这一来一回就需要2MSL时间。

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

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

相关文章

CHARLS数据库系列教程(4)--多模型效应分析、Per SD、P for trend及限制立方样条图绘制

CHARLS 是一项具备中国大陆 45 岁及以上人群代表性的追踪调查,旨在建设一个高质量的公共微观数据库,采集的信息涵盖社会经济状况和健康状况等多维度的信息,以满足老龄科学研究的需要。 为利用国际上最佳的数据采集方式,并确保研究…

shinyproxy部署streamlit记录

shinyproxy部署streamlit记录 streamlit 也是构建shinyproxy的后段是docker,所以不但可以部署shiny应用,还可以部署streamlit应用以及其它的应用程序。 部署的过程分两步,第一步是构建streamlit应用的docker镜像,就是构建Docker…

Linux高级编程_26_shell

文章目录 shell概述:分类:语法:1、#!2、#3、执行:方式1:方式2:方式3: 注意: 第一个shell脚本变量变量的定义:变量的修改变量的取值撤销变量声明只读变量导出变量&#xf…

【HDP】zookeeper未授权漏洞修复

目录 一、禁用四字命令 二、ZK-Client增加kerberos 一、禁用四字命令 Zookeeper四字命令的使用方式非常简单,通常有两种方式。第一种是通过Telnet方式,使用Telnet客户端登录ZooKeeper的对外服务端口,然后直接使用四字命令即可;第…

Kafka快速实战与基本原理详解

笔记:https://note.youdao.com/ynoteshare/index.html?id=b0357bdb4821ed2e35ecdbdacd65aa06&type=note&_time=1727570043631 启动kafka之前先启动zookper 看看ZK里面都有什么数据 : 刚开始什么数据都没有 接下来启动kafka,启动好后,日志在这里看: 启动好了kaf…

处于风口期的本地生活服务项目有哪些?如何入局才能赚得更多?

随着多家互联网大厂在本地生活服务板块的投入力度不断加大,越来越多的人都养成了在其本地生活服务板块消费的习惯,令各大平台本地生活业务日渐兴盛的同时,也让许多创业者发现了本地生活服务赛道中所蕴含着的商机,本地生活服务项目…

苏州 数字化科技展厅展馆-「世岩科技」一站式服务商

数字化科技展厅展馆设计施工是一个综合性强、技术要求高的项目,涉及到众多方面的要点。以下是对数字化科技展厅展馆设计施工要点的详细分析: 一、明确目标与定位 在设计之初,必须明确展厅的目标和定位。这包括确定展厅的主题、目标受众、展…

四DHCP服务实验

复习 :DHCP基础实验: 1. 在server端安装dhcp yum -y install dhcp 2. 找回dhcp的配置文件:/etc/dhcp/dhcpd.conf cp -a /usr/share/doc/dhcp-4.25/dhcpd.conf.example /etc/dhcp/dhcpd.conf 3. 修改/etc/dhcp/dhcpd.conf配…

抽象类、比较器和接口

一.抽象类 1.抽象类的概念:如果一个类中没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。(图例说明:) 2.抽象方法的概念:当一个方法被abstract来修饰,此时代表着这个方法可以不进…

C#知识|基于反射和接口实现抽象工厂设计模式

哈喽,你好啊,我是雷工! 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中; 02 抽象工厂组成 抽象工厂包括抽象产品(即业务接口,可以通过抽象类或抽象接口设计)…

WSL2Linux 子系统(十一)

WSL 网络改为桥接模式(默认NAT) 上一篇文章 《WSL2Linux 子系统(十)》 详细讲述 WSL(Windows Subsystem for Linux)WSL 显示画面的几种方法。本篇讲述 WSL 网络转为桥接模式的两种方法。 桥接模式允许 WSL 实例获得一个与宿主机在同一子网中…

【包教包会】CocosCreator3.x框架——音频声音模块(无需导入、无需常驻节点)

下载地址:AudioDemo3.x: CocosCreator3.x框架——音频模块 注意事项: 1、gi.musicPlay、gi.soundPlay是同步函数,使用前必须先将音频加载到缓存 Demo通过SceneLoading实现了一个极简的Loading页面,将音频全部加载后进入游戏&…

JAVA智慧社区系统跑腿家政本地生活商城系统小程序源码

智慧社区系统集成跑腿家政与本地生活商城 —— 打造便捷高效的社区生活圈 🏠 智慧社区新时代:一站式服务新体验 在快节奏的都市生活中,智慧社区系统正悄然改变着我们的生活方式。它不再只是一个居住的空间,而是集成了跑腿家政、本…

AI换脸技术新纪元:直播与视频创作的新利器

在数字媒体时代,实时面部交换技术正变得越来越流行。它不仅为视频创作者提供了新的表达方式,也为直播行业带来了革命性的变化。以下是一些目前市场上领先的实时面部交换软件: 🌟 FaceFusion FaceFusion 是一款功能强大的实时面部…

2023ICPC区域赛杭州站

VP链接:Dashboard - The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: Hangzhou) - Codeforces D. Operator Precedence 一道构造题,将序列构造成 1 2 -1 2 -1 ...... 2 -1 x。根据题目条件,可以推出来 x …

全新带货思路,用AI美女数字人做情感赛道,27天销量1559单

本期就另外分享一个全新的AI美女数字人带货思路,如果你正好对AI视频带货感兴趣,那么本期内容直接给你抹平“视频号上AI美女数字人玩法信息差”,最主要还是趁这类内容还不卷的时候,赶紧行动起来! 更多实操教程和数字人工…

智能AI对话绘画二合一网站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 智能AI对话绘画二合一网站源码系统是一款基于先进的人工智能技术开发的综合性网站源码系统。该系统将AI对话功能和AI绘画功能完美融合,用户可以通过简单的对话指令,让系统生成符合要求的绘画作品,或者通过对话了解绘画相关的知识和…

世优科技出席36氪2024具身智能大会圆桌对话,入选创新应用案例

具身智能,作为人工智能领域的前沿分支,聚焦于构建能够通过集成感知与交互机制,在物理环境中实现动态适应与实时互动的智能系统及机器人平台。 9月26日,由36氪主办的“2024具身智能大会”以“让AI通向物理世界”为主题,…

Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.

报错代码: Failed to connect to server. 报错截图: 解决办法: 服务端:绑定127.0.0.1和端口 客户端:写好对应服务端ip和端口 如何查看服务端所在局域网IP,192.xxx.xxx.xx,就不用教了吧。 注意这个钩,得点下,默认不勾选。 意…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中,当主键为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。 注意:自增长约束通常与主键放在一起使用。 通过给…