【面试八股总结】传输控制协议TCP(一)
一、什么是TCP协议
TCP是传输控制协议Transmission Control Protocol
TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
- 面向连接的:每条TCP连接杜只能有两个端点,每一条TCP连接只能是点对点的(一对一)
- 可靠的:可靠交付
- 基于字节流的:
- TCP中的“流”的概念是流入或流出进程的字节序列
- 基于字节流:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流
- TCP不保证接收方应用程序收到的数据块和发送方应用程序所发出的数据块具有对应的大小关系,但是接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
二、TCP的连接建立
1. 三报文握手
- TCP 建立连接的过程叫做握手。
- 握手需要在客户和服务器之间交换三个 TCP 报文段。称之为三报文握手。
- 三报文握手主要作用是为了确认通信双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。
- 采用三报文握手可以防止已失效的连接请求报文段突然又传送到了,因而产生错误。
1) 初始状态:
客户端处于 closed(关闭) 状态,服务器处于 listen(监听) 状态。
2) 第一次握手:
客户端给服务器发⼀个 SYN 报⽂,指明客户端的初始化序列号 ISN(c)。此时客户端处于SYN_SEND 状态。
该报文首部的同步位 SYN = 1,初始序号 seq = x,SYN = 1。
该报文段不能携带数据,但要消耗掉⼀个序号。
3) 第二次握手:
服务器收到客户端的 SYN 报文之后,以自己的 SYN 报⽂作为应答,并且指定自己的初始化序列号 ISN(s)。同时把客户端的 ISN + 1 作为 ACK 的值,表示已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态
在确认报文段中 SYN = 1,ACK = 1,确认号 ack = x + 1,初始序号 seq = y。
4) 第三次握手:
客户端收到 SYN 报文之后,会发送⼀个 ACK 报⽂,把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报⽂,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报⽂ 之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
确认报文段 ACK = 1,确认号 ack = y + 1,序号 seq = x+1(初始为 seq = x,第⼆个报文段所以要+1)
该ACK报文段可以携带数据,不携带数据则不消耗序号。
2. 为什么需要三次握手?
1) 阻止重复历史连接的初始化
网络阻塞时,客户端向服务器发送两次SYN请求报文,旧的SYN报文先到达服务器,服务器回复一个ACK+SYN报文,客户端根据自身上下文判断这是一个历史连接(序列号过期或者超时),那么客户端就会发送RST报文给服务端,终止这次连接,服务器收到RST报文后,释放连接。这样新的SYN报文到达后,客户端与服务器就可以正常进行三次握手。
若采用两次握手,服务器在收到SYN报文后,进入ESTABLISHED状态,服务器并不知道这是历史连接,直接与客户端建立并向客户端发送数据,造成资源浪费,但是客户端会判定这次连接是历史连接,忽略客户端确认消息,也不发送数据,服务端一直等待客户端发送数据。
2) 同步双方初始序列号
TCP协议的通信双方,都必须维护一个序列号,序列号是可靠传输的一个关键因素。
- 接收端 -> 去除重复元素 ,并且按照序列号顺序接收数据
- 发送端 -> 确认发送的数据包哪些已经被收到
三次握手确认初始化序列过程:
- 第一次握手:客户端发送携带客户端初始化序列号的SYN报文;
- 第二次握手:服务器发送携带服务器初始化序列号以及客户端初始化序列号+1的ACK + SYN应答报文,表示收到客户端SYN报文;
- 第三次握手:客户端发送携带服务器初始化序列号+1的ACK应答报文。
两次握手只能保证服务器成功接收了客户端的初始化序列号,但无法确认服务器的初始化序列号是否被成功接收。
3. 半连接队列
半连接队列(SYN队列)⽤于存放已经发送了 SYN(同步)包,但还未完成三次握⼿的连接。服务器第⼀次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双⽅还没有完全建⽴其连接,服务器会把此种状态下请求连接放在⼀个队列⾥,我们把这种队列称之为半连接队列。
全连接队列(Accept队列)⽤于存放已经完成三次握⼿,处于完全建⽴连接状态的连接。
4. 三次握手可以携带数据吗?
三次握手中,第一次和第二次连接不可以携带数据,第三次连接可以携带数据。主要原因是如果第一次握手如果携带数据,会让服务器更加容易被攻击,但是第一次握手会消耗一个序列号,对于第三次握手,客户端已经处于ESTABLISHED状态,确认服务器接收、发送能力没有问题,可以发送数据。
5. SYN洪泛攻击
SYN攻击指Client在短时间内伪造大量不存在的IP地址,并向Server不断发送SYN包,Server则回复确认包,等待Client确认。由于源地址不存在,因此Server需要不断重新发送直到超时,这些伪造的SYN包会长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而导致网络拥塞甚至系统瘫痪。
检测SYN攻击:在服务器上发现大量半连接状态,特别其源地址IP是随机的,基本确认为SYN攻击。Linux系统下可使用 netstats 命令检测:
netstat -n -p TCP | grep SYN_RECV
防御SYN攻击:
-
缩短超时(SYN Timeout)时间
-
增加最大半连接数
-
过滤网关防护
-
SYN Cookies技术
三、TCP的连接释放
1. 四报文挥手
- 数据传输结束后,通信的双方都可释放连接。
- TCP 连接释放过程是四报文握手。
- TCP的半关闭(half-close):TCP提供了连接的⼀端在结束它的发送后还能接收来⾃另⼀端数据的能力。
- 客户端和服务器均可以主动发起挥手。
1) 初始状态:
双方都处于 ESTABLISHED 状态 (假设客户端发起挥手)
2) 第一次挥手:
客户端发送⼀个 FIN 报⽂,报⽂中会指定⼀个序列号(FIN=1,序号seq=u)。此时客户端停止再发送数据,主动关闭TCP连接,进⼊FIN_WAIT1状态,等待服务端的确认。
3) 第二次挥手:
服务端收到以后,向客户端发送ACK应答报文,且把客户端的 序列号值+1 作为 ACK 报文的序列号值(ACK=1,确认号ack=u+1,序号seq=v),表明已经收到客户端的报文,服务器处于 CLOSE_WAIT 状态,此时TCP处于半关闭状态,客户端到服务端的连接释放。
客户端收到服务端的确认后,进⼊FIN_WAIT2状态,等待服务端发出的连接释放报文段。
4) 第三次挥手:
如果服务器也想断开连接了,和客户端的第⼀次挥手⼀样,发出 FIN 连接释放报文(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),且指定⼀个序列号。此时服务器处于LAST_ACK 的状态,等待客户端的确认。
5) 第四次挥手:
客户端收到 FIN 之后,发送⼀个 ACK 报文作为应答,且把服务器的序列号值 +1 作为自己 ACK 报文的确认号值(ACK=1,seq=u+1,ack=w+1),客户端处于 TIME_WAIT 状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
2. 为什么需要四次挥手?
关闭连接时,客户端发送FIN报⽂,表示其不再发送数据,但还可以接收数据。服务端收到FIN报文,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是⽤来同步的。但是关闭连接时,服务端可能还有数据需要处理和发送,所以先回⼀个ACK应答报文,等到其不再发送数据时,才发送 FIN报文给客户端表示同意关闭连接。
服务端通常需要等待完成数据的发送和处理,所以服务端的ACK和FIN⼀般都会分开发送,因此需要四次挥手。
3. 为什么TIME_WAIT状态时间为2MSL?
1)MSL是Maximum Segment Lifetime,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
2)网络中可能存在发送方的数据包,当这些发送方的数据包被接收方处理后⼜会向对方发送响应,所以⼀来⼀回需要等待 2 倍的时间。
3)1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端;1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达。
2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报⽂,那么 2MSL 时间将重新计时。
4. 为什么需要 TIME_WAIT 状态(2MSL状态)?
1) 防止历史连接中的数据,被后面相同四元组的连接错误的接收
如果网络出现拥塞或延迟,数据包可能会在网络中滞留⼀段时间,甚⾄超过了原始连接关闭的时间。如果没有 TIME_WAIT 状态,客户端直接进入到CLOSE状态,这些滞留的数据包可能会被传递给新连接,导致新连接的数据被旧连接的数据干扰。经过 2MSL 这个时间,足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络都自然消失,再出现的数据包⼀定都是新建立连接所产生的。
2) 保证被动关闭连接的⼀方能被正确的关闭,即保证最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。
如果最后的⼀次ACK报文丢失(第四次挥手),客户端没有 TIME_WAIT 状态,直接进⼊ClOSE,服务端⼀直在等待 ACK状态,⼀直没有等到,就会重发FIN报文,客户端已经进入到关闭状态,在收到服务端重传的 FIN 报⽂后, 就会回 RST 报文,服务端收到这个 RST 并将其解释为⼀个错误,。为了防止这种情况出现,客户端必须等待足够长的时间,确保服务端能够收到 ACK,如果服务端没有收到 ACK,那么就会触发 TCP 重传机制,服务端会重新发送⼀个 FIN,这样⼀去⼀来刚好两个 MSL 的时间。
相关文章:

【面试八股总结】传输控制协议TCP(一)
一、什么是TCP协议 TCP是传输控制协议Transmission Control Protocol TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。 面向连接的:每条TCP连接杜只能有两个端点,每一条TCP连接只能是点对点的(一对一)可靠的:…...

【系统架构师】-第13章-层次式架构设计
层次式体系结构设计是将系统组成一个层次结构,每一层 为上层服务 ,并作为下层客户。 在一些层次系统中,除了一些精心挑选的输出函数外, 内部的层接口只对相邻的层可见 。 连接件通过决定层间如何交互的协议来定义,拓扑…...

【操作系统】想要更好的学习计算机,操作系统的知识必不可少!!!
操作系统的概念 导言一、日常生活中的操作系统二、计算机系统层次结构三、操作系统的定义3.1 控制和管理计算机资源3.2 组织、调度计算机的工作与资源的分配3.3 给用户和其他软件提供方便接口与环境3.4 总结 四、操作系统的目标和功能4.1 作为管理者4.1.1 处理机管理4.1.2 存储…...
AtCoder Grand Contest 066 B. Decreasing Digit Sums(构造 打表找规律)
题目 给定一个n(n<50),记f(x)是x各数位的加和,例如f(331)3317 要求输出一个x(),且对于任意i∈[1,n],均有成立 思路来源 jiangly B站讲解 题解 首先n没啥用,构造一个n50成立的case即可, 给定一个x…...
Hadoop系列总结
一、Hadoop linux基本操作 前提掌握Linux基本操作 参考 Linux基本操作-CSDN博客 1、查看hadoop指定路径下文件大小前6的文件信息 hdfs dfs[hadoop fs] -du -h /path/to/directory|sort -hr|head -n 6...

【第三方登录】Twitter
创建应用 APPID 和 相关回调配置 重新设置api key 和 api secret 设置回调和网址 还有 APP的类型 拿到ClientID 和 Client Secret 源码实现 获取Twitter 的登录地址 public function twitterUrl() {global $db,$request,$comId;require "inc/twitter_client/twitte…...
C++经典面试题目(十七)
1、请解释拷贝构造函数的作用,并说明其调用时机。 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,其内容与另一个对象相同。它将一个已存在的对象作为参数,并使用该对象的值来初始化新创建的对象。拷贝构造函数的调用时机…...
DFS2 C++
一、指数型枚举 1、题目: 从 1∼n1∼ 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。 对于没有选任何…...
2021-08-06
yarn的简介: Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点: 速度超快。 Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。 在执行代码…...

Centos服务器Open Gauss 部署
近期很多的项目由于信创要求使用一些国产的数据库,比如OpenGauss。OpenGuass是华为高斯DB的开源版,内核还是PostgreSQL,商业版是收费的。这里记录一下是如何安装部署 的。 官方中文文档 官方下载地址 部署要求 操作系统要求 ARMÿ…...
Vue与Electron融合之道:从Web App到桌面App的华丽转身
Vue与Electron融合之道:从Web App到桌面App的华丽转身 引言Vue 与 Electron 的天然契合共享技术栈高效开发与部署用户体验升级 Vue 与 Electron 融合实战初始化项目调整Vue项目结构利用 Electron API 增强功能定制桌面应用外观构建与部署 结语 引言 Vue.js 作为一款…...

Higress 基于自定义插件访问 Redis
作者:钰诚 简介 基于 wasm 机制,Higress 提供了优秀的可扩展性,用户可以基于 Go/C/Rust 编写 wasm 插件,自定义请求处理逻辑,满足用户的个性化需求,目前插件已经支持 redis 调用,使得用户能够…...
Mysql的库函数
MySQL是一个流行的开源关系型数据库管理系统,它提供了大量的内置库函数,用于在查询时执行各种操作。这些函数可以帮助开发者在数据检索、转换和处理过程中实现更复杂的逻辑。 1 字符串函数 函数描述ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。CHA…...

绿联 安装onlyoffice容器并启用Cloudreve的office在线预览与编辑功能
原文:绿联 安装onlyoffice容器并启用Cloudreve的office在线预览与编辑功能 本篇教程以配合Cloudreve扩展文档预览/编辑为目的编写,OnlyOffice的其他用途未深入研究也不做探讨,仅使用WOPI能力。 硬件要求 镜像大小:2.91Gb或更大 …...

金钱卦起卦
前言 本文目的: 1.了解什么是《易经》 2.了解什么是八卦/六十四卦 3.金钱卦起卦方法 4.如何解卦 一、什么是易经? 1、易经就是一本书、一本著作 2、它的成书经历了三个阶段 第一阶段:在5000多年前,由人类的始祖伏羲通过观察时…...

学透Spring Boot 003 —— Spring 和 Spring Boot 常用注解(附面试题和思维导图)
这是 学透 Spring Boot 专栏 的第三篇,欢迎关注我,与我一起学习和探讨 Spring Boot 相关知识,学透 Spring Boot。 从面试题说起 今天我们通过一道和Spring Boot有关的常见面试题入手。 面试题:说说 Spring Boot 中有哪些常用注解…...

新能源汽车充电桩常见类型及充电桩站场的智能监管方案
随着新能源汽车市场的迅猛发展,充电桩作为支持其运行的基础设施,也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异,更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩(交…...

让工作自动化起来!无所不能的Python
文章目录 前言一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一编辑推荐内容简介作者简介目录前言为什么要写这本书 读者对象如何阅读本书赠书活动 前言 随着我国企业数字化和信息化的深入…...

Facebook轮播广告是什么?投放过程中有哪些需要注意的吗?
轮播广告是Facebook广告形式中的一种,可以把3—5个广告合并到一个可滚动的广告单元中。轮播广告会出现在新鲜事即News Feed中,是独立站卖家常用的一种广告形式 为什么选择轮播广告? 转化率更高:相较于单图广告,轮播广…...

3、jvm基础知识(三)
如何判断堆上的对象没有被引用? 常见的有两种判断方法:引用计数法和可达性分析法。 引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1。 引用计数法的优点是实现简单,缺点有两点࿱…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
MySQL基本操作(续)
第3章:MySQL基本操作(续) 3.3 表操作 表是关系型数据库中存储数据的基本结构,由行和列组成。在MySQL中,表操作包括创建表、查看表结构、修改表和删除表等。本节将详细介绍这些操作。 3.3.1 创建表 在MySQL中&#…...

【Axure高保真原型】图片列表添加和删除图片
今天和大家分享图片列表添加和删除图片的原型模板,效果包括: 点击图片列表的加号可以显示图片选择器,选择里面的图片; 选择图片后点击添加按钮,可以将该图片添加到图片列表; 鼠标移入图片列表的图片&…...