【每日八股】复习计算机网络 Day3:TCP 协议的其他相关问题

文章目录

  • 昨日内容复习
    • TCP 的四次挥手?
    • TCP 为什么要四次挥手?
    • 在客户端处于 FIN_WAIT_2 状态时,如果此时收到了乱序的来自服务端的 FIN 报文,客户端会如何处理?何时进入 TIME_WAIT 状态?
    • TCP 四次挥手丢了怎么办?
    • TCP 的延迟应答和累积应答?
    • TCP 会出现三次挥手吗?
    • TCP 的 MSL?
  • 复习计算机网络 Day3:TCP 协议的其他相关问题
    • 已经建立了 TCP 连接,客户端突然出现故障了怎么办?
    • 什么时候用长连接,什么时候用短连接?
    • TCP 的半连接队列和全连接队列?
    • 什么是 SYN 攻击?如何避免?
    • TIME_WAIT 的作用?过多如何解决?
    • TIME_WAIT 为什么要经过 2MSL?
    • CLOSED_WAIT 过多如何解决?

昨日内容复习

TCP 的四次挥手?

TCP 的四次挥手过程可以总结如下,为了方便描述,我们将客户端认定为主动关闭方,将服务端认定为被动关闭方:

  • 第一次挥手:客户端发送 FIN 置位的报文到服务端,并从 ESTABLISED 状态进入 FIN_WAIT_1 状态,此时客户端为半关闭状态,客户端仍然可以接收数据,但是不会再发送数据;
  • 第二次挥手:服务端接收到客户端的 FIN 报文后,发送 ACK 报文对 FIN 报文进行确认,同时进入 CLOSED_WAIT 状态,再次期间服务端将继续处理应用层还没有发送完的数据。客户端收到 ACK 后进入 FIN_WAIT_2 状态;
  • 第三次挥手:服务端处理好数据后,发送 FIN 报文,随后进入 LAST_ACK 状态;
  • 第四次挥手:客户端接收到来自服务端的 FIN 报文后,进入 TIME_WAIT 状态,等待 2MSL 时间后客户端关闭。服务端收到 ACK 报文后立即关闭。

TCP 为什么要四次挥手?

TCP 进行四次挥手而不是三次挥手的原因是服务端可能在收到客户端的 FIN 后仍然有数据要发送,因此服务端确认客户端发来的 FIN 报文的 ACK 报文与服务端发送给客户端的 FIN 报文在有数据没有处理完的情况下不能合并,因此 TCP 需要四次挥手。

当然,需要注意的是,TCP 可以三次挥手,当服务端没有数据发送给客户端时,服务端将 ACK 与 FIN 合并,发送 FIN-ACK 报文。

在客户端处于 FIN_WAIT_2 状态时,如果此时收到了乱序的来自服务端的 FIN 报文,客户端会如何处理?何时进入 TIME_WAIT 状态?

如果客户端收到了乱序的来自服务端的 FIN 报文,会将其存入缓冲区,等待服务端的其他数据到达,一并放入缓冲区。当客户端接收不到数据时,按顺序比对报文的序列号,如果 FIN 报文的序列号顺序且合法,则将其视为正确的 FIN 报文,回发 ACK 报文并进入 TIME_WAIT 状态;否则丢弃 FIN 报文,等待正确的 FIN 报文。

TCP 四次挥手丢了怎么办?

  • 第一次挥手丢失:客户端发送给服务端的 FIN 报文丢失,此时客户端收不到来自服务端的 ACK 报文,触发超时重传;
  • 第二次挥手丢失:服务端确认客户端的 FIN 报文的 ACK 报文丢失,此时客户端会认为自己的 FIN 报文丢失,客户端触发超时重传;
  • 第三次挥手丢失:客户端没有收到服务端的 FIN 报文,此时客户端处于 FIN_WAIT_2 状态,不会给服务端发送 ACK 报文,因此服务端会触发超时重传,重新发送 FIN 报文;
  • 第四次挥手丢失:服务端没有收到客户端的 ACK 报文,此时服务端会重新发送 FIN 报文给客户端。客户端发送 ACK 之后进入 2MSL 的 TIME_WAIT 状态,当再次收到 FIN 报文后,会重置 2MSL 计时器,并再次发送 ACK 报文。如果客户端此时已经到达 2MSL 并关闭,那么服务端会在超时重传最大次数上限后关闭连接。

TCP 的延迟应答和累积应答?

  • 延迟应答:TCP 不会立即发送 ACK 应答接收到的报文,而是积累一定的数据后,与 ACK 报文一并发送;
  • 累积应答:TCP 头部当中的确认号表示的是发送报文的一方期望下一次收到的序列号,说明该序列号之前的字节已经全部收到,这就是累积应答。

TCP 会出现三次挥手吗?

会,当被动关闭方收到主动关闭方 FIN 报文后,没有数据要发送时,将 ACK 和 FIN 合并发送,此时就出现了三次挥手。

TCP 的 MSL?

指的是报文的最长生命周期,即报文在网络中被丢弃之前的最长生存时间。TCP 报文被包裹在 IP 数据报中,IP 数据报的报头有 TTL 字段。

复习计算机网络 Day3:TCP 协议的其他相关问题

在这里插入图片描述

已经建立了 TCP 连接,客户端突然出现故障了怎么办?

TCP 存在保活计时器,如果客户端发生故障,服务端不会一直等待。计时器通常设置为两个小时,每当客户端有消息发送过来,服务端都会重置计时器。超时之后,服务端每隔一定的时间周期(75 s)向客户端发送探测报文,如果连续十次都没有回复,服务端会认为客户端发生故障,断开连接。

什么时候用长连接,什么时候用短连接?

长连接多用于操作频繁的点对点通讯,而且连接数不能太多。例如,数据库的连接就是长连接。

Web 网站的 HTTP 服务一般使用短连接,短连接可以快速释放资源。

TCP 的半连接队列和全连接队列?

半连接队列:也称 SYN 队列。服务端收到客户端的 SYN 请求连接报文后,内核会把该连接存储到半连接队列中,并向客户端发送 SYN-ACK 报文。换句话说,半连接队列(SYN 队列)存储的就是已经向服务端发起了连接请求但是还没有完成连接建立的客户端。

全连接队列:也称 ACCEPT 队列。服务端收到第三次握手客户端发送的 ACK 报文后,内核就会把该客户端从 SYN 队列中移除,并转入到 ACCEPT 队列。

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

SYN 攻击指的是恶意攻击方通过合法手段不断向服务端发送 SYN 报文,从而使得合法用户无法得到服务响应。当大量的 SYN 请求到来时,服务端会进入 SYN_RECV 状态,将连接加入到 SYN 队列并分配进程控制块,同时回发 SYN-ACK 报文,当服务端等不到 ACK 报文时,还会不断触发超时重传重新发送 SYN-ACK 报文,最终导致服务端资源耗尽。

解决办法

  • Cache:收到 SYN 报文后使用 Hash 表保存 SYN 报文的信息,发送 SYN-ACK 后,收到 ACK 才为该连接分配 TCB,节省资源;
  • Cookie:服务端收到 SYN 报文后,不直接分配资源,而是通过加密算法生成一个 SYN Cookie 作为初始序列号。只有收到客户端发送的合法的 ACK 后才分配连接资源。
  • Proxy 防火墙:设立中间层防火墙,确认连接有效后,才向内部服务器发送 SYN 请求。
  • 减少 SYN-ACK 重传次数;
  • 监视半连接队列和全连接队列当中的无效连接;
  • 增大半连接队列的数量;

TIME_WAIT 的作用?过多如何解决?

TCP 常用的三种状态:ESTABLISHED 表示连接建立,CLOSED_WAIT 表示被动关闭,TIME_WAIT 表示主动关闭。

TIME_WAIT 的作用

  • 确保主动关闭方发送的最后一个 ACK 到达被动关闭方:主动关闭方在接收到 FIN 报文后,发送 ACK 予以确认,并进入 2MSL 的 TIME_WAIT 状态。如果这个 ACK 丢失,那么被动关闭方会重发 FIN,主动关闭方收到后会重发 ACK。如果没有 TIME_WAIT,那么被动关闭方在没有收到 ACK 之后,会不断触发超时重传重新发送 FIN 报文,导致资源的消耗。
  • 避免旧连接的延迟报文干扰新的连接:TCP 连接通过四元组唯一标识。如果旧的连接中存在由于网络阻塞而没有到达对端的报文,则接收方会误认为这些报文是新的连接发送的,导致数据错乱。旧的连接等待 2MSL 再关闭可以确保旧的报文在网络中全部消亡;
  • 确保全双工通道的可靠关闭:TCP 是全双工协议,双方都需要关闭自己的连接。TIME_WAIT 可以确保双方都能完成关闭流程,即使主动关闭方发送给被动关闭方的 ACK 丢失,由于主动方处于 TIME_WAIT,仍然可以接收 FIN 并重发 ACK。

TIME_WAIT 的副作用
过多的 TIME_WAIT 会占用端口和内存资源(高并发短连接场景下),导致新的连接无法建立。

解决办法:

  • 快速回收 TIME_WAIT;
  • 调整 MSL 时间;
  • 负载均衡或连接池:复用长连接以减少短连接数量。

TIME_WAIT 为什么要经过 2MSL?

第一个 MSL:确保主动关闭方的 ACK 到达对端;
第二个 MSL:确保对端重传的 FIN 可以到达本端;

CLOSED_WAIT 过多如何解决?

CLOSED_WAIT 过多代表被动关闭方为能正确地关闭连接,导致连接资源长期占用。可能是由于程序 Bug 及配置问题导致的,应该去检查程序。

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

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

相关文章

学习笔记十五——rust柯里化,看不懂 `fn add(x) -> impl Fn(y)` 的同学点进来!

🧠 Rust 柯里化从零讲透:看不懂 fn add(x) -> impl Fn(y) 的同学点进来! 🍔 一、什么是柯里化?先用一个超好懂的生活比喻 假设你在点一个汉堡: 你说:我要点一个鸡腿汉堡! 店员…

深入理解 TCP 协议 | 流量、拥塞及错误控制机制

注:本文为 “TCP 协议” 相关文章合辑。 原文为繁体,注意术语描述差异。 作者在不同的文章中互相引用其不同文章,一并汇总于此。 略作重排,如有内容异常,请看原文。 TCP 三向交握 (Three-way Handshake) 2016-12-21 …

PCL库编译指南

PCL(Point Cloud Library)的编译过程会根据不同操作系统有所差异。以下是详细的编译步骤: Linux/Ubuntu系统编译 1. 安装依赖项 bash sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get install cmake cmake-gui sud…

【Linux】条件变量、基于阻塞队列的生产者消费者模型

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 进程是资源分配的基本单位,线程是调度的基本单位,线程是在进程内部运行的(是进程内部…

32-工艺品商城小程序

技术: 基于 B/S 架构 SpringBootMySQLvueelementuiuniapp 环境: Idea mysql maven jdk1.8 node 可修改为其他类型商城 用户端功能 1.系统首页展示轮播图及工艺品列表 2.分类模块:展示产品的分类类型 3.购物车:进行商品多选结算 或者批量管理操作 4.…

SLAM | 激光SLAM中的退化问题

在激光SLAM中,判断退化环境的核心是通过数学建模分析环境特征对位姿估计的约束能力。除了LOAM中提出的退化因子D外,还存在多种基于表达式和阈值设定的方法。以下是几种典型方法及其实现原理: 1. 协方差矩阵特征值分析 原理:通过分析点云协方差矩阵的特征值分布,判断环境中…

【2025最新版】火鸟门户v8.5系统源码+PC、H5、小程序 +数据化大屏插件

一.介绍 火鸟地方门户系统V8.5源码 系统包含4端: PCH5小程序APP 二.搭建环境 系统环境:CentOS、 运行环境:宝塔 Linux 网站环境:Nginx 1.2.22 MySQL 5.6 PHP-7.4 常见插件:fileinfo ; redis 三.测…

PHP腾讯云人脸核身获取NONCE ticket

参考腾讯云官方文档: 人脸核身 获取 NONCE ticket_腾讯云 前提条件,已经成功获取了access token。 获取参考文档: PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getTxFaceNonceTicket($uid) {$access_token file_get_c…

多人3D游戏完整实现方案

以下是一份完整的代码实现方案,涵盖架构设计、核心模块实现和部署流程。我们以 多人3D游戏 为例,结合之前讨论的Nano服务端框架和Unity客户端: 技术栈 模块技术选型服务端Golang + Nano框架 + MongoDB客户端Unity 2022 + C# + Mirror Networking通信协议Protobuf + WebSock…

【Linux我做主】GDB调试工具完全指南

Linux下GDB调试工具完全指南:25个核心命令详解与实战示例 github地址 有梦想的电信狗 前言 GDB(GNU Debugger)是Linux开发中不可或缺的调试工具,尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验&#xff0…

QT中栅格模式探索

1、Qt中选择了栅格模式,如下图所示: 2、在进行整个大的UI界面布局时,需了解每个控件所需要选择的属性sizePolicy。 sizePolicy包含如下几种选择: 3、举个例子:此时整个UI界面,我采用了栅格模式&#xf…

【计算机网络】3数据链路层①

这篇笔记专门讲数据链路层的功能。 2.功能 数据链路层的主要任务是让帧在一段链路上或一个网络中传输。 2.1.封装成帧(组帧) 解决的问题:①帧定界②帧同步③透明传输 实现组帧的方法通常有以下种。 2.1.1.字符计数法 原理:在每个帧开头,用一个定长计数字段来记录该…

[区块链lab2] 构建具备加密功能的Web服务端

实验目标: 掌握区块链中密码技术的工作原理。在基于Flask框架的服务端中实现哈希算法的加密功能。 实验内容: 构建Flash Web服务器,实现哈希算法、非对称加密算法的加密功能。 实验步骤: 哈希算法的应用:创建hash…

蓝桥杯之前缀和

一维前缀 解题思路 看到“区间之和”问题,直接想到“前缀和” 前缀和的核心公式: sum[i]sum[i−1]a[i] 利用前缀和求区间和 [l,r] 的公式: 区间和sum[r]−sum[l−1] 解题步骤模板 输入数组: 读取数组长度 n 和查询次数 m。 读…

【学习笔记】计算机网络(八)—— 音频/视频服务

第8章 互联网上的音频/视频服务 文章目录 第8章 互联网上的音频/视频服务8.1概述8.2 流式存储音频/视频8.2.1 具有元文件的万维网服务器8.2.2 媒体服务器8.2.3 实时流式协议 RTSP 8.3 交互式音频/视频8.3.1 IP 电话概述8.3.2 IP电话所需要的几种应用协议8.3.3 实时运输协议 RTP…

【WRF运行】解决metgrid生成文件太大无内存!

目录 方法:改变工作目录运行 metgrid.exe参考由于我的运行内存过小,当研究区较大时,metgrid生成文件内存太大,导致每次运行都报错,此时可更改工作目录(空余文件夹)以运行 metgrid.exe(并非必须在wrf安装目录下运行!!!)。 metgrid.exe 本身不支持直接通过参数或 nam…

基于 Django 进行 Python 开发

基于 Django 进行 Python 开发涉及多个方面的知识点,以下为你详细介绍: 1. Django 基础 项目与应用创建 借助django-admin startproject project_name来创建新的 Django 项目。利用python manage.py startapp app_name创建新的应用。项目结构 理解项目各文件和目录的作用,像…

【sylar-webserver】8 HOOK模块

文章目录 知识点HOOK实现方式非侵入式hook侵入式hook ⭐⭐⭐ 覆盖系统调用接口获取被全局符号介入机制覆盖的系统调用接口 具体实现C 模板成员函数继承 和 成员函数指针类型匹配 ⭐⭐⭐⭐⭐FdCtx 和 FdManager ⭐⭐判断socket的小技巧FdCtxFdManager connect hook ⭐do_io模板 …

SpringAI+DeepSeek大模型应用开发——1 AI概述

AI领域常用词汇 LLM(LargeLanguage Model,大语言模型) 能理解和生成自然语言的巨型AI模型,通过海量文本训练。例子:GPT-4、Claude、DeepSeek、文心一言、通义干问。 G(Generative)生成式: 根据上…

SpringBoot 基本原理

SpringBoot 为我们做的自动配置,确实方便快捷,但一直搞不明白它的内部启动原理,这次就来一步步解开 SpringBoot 的神秘面纱,让它不再神秘。 目录 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…