计算机网络——TCP篇
TCP篇
基本认知

TCP和UDP的区别?



TCP 和 UDP 可以使用同一个端口吗?
可以的
传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。
TCP 连接建立
TCP 三次握手过程是怎样的?

- 一次握手:客户端发送带有 SYN=1同步标志和SEQ序号=x 的数据包 -> 服务端,该报文不包含应用层数据,然后客户端进入 SYN_SENT 状态,等待服务端的确认;
- 二次握手:服务端发送带有 SYN=1和ACK=1的标志位以及确认应答号x+1+自己的序号y 的数据包 –> 客户端,该报文也不包含应用层数据,然后服务端进入 SYN_RECD 状态;
- 三次握手:客户端发送带有 ACK=1的标志位和确认应答号ACK=y+1的数据包 –> 服务端,这次报文可以携带客户到服务端的数据,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。
为什么是三次握手?不是两次、四次?
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
如果第一次握手的时候,客户端宕机了,而且这个 SYN 报文还被网络阻塞了,服务端并没有收到,接着客户端重启后,又重新向服务端建立连接,这时候如果旧的连接比新的连接先到达,如果是两次握手,就会直接建立了连接,浪费了资源。只有在服务器发送了ack客户端新连接发现不是自己想要的时候才会去终止旧连接。而如果是三次握手,服务器还会有一个ack确认的过程,新的握手发现不是自己想要的ack确认号就会去终止旧的握手信号,在连接之前就能终止。
- 三次握手才可以保证双方的通信的可靠
由于要保证发出去的消息并且收到确认,所以要一来一回,因为服务器的确认和发序号合在了一起,所以只需要三次握手就可以,而不是四次。
- 三次握手才可以避免资源浪费

为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?
- 为了防止历史报文被下一个相同四元组的连接接收(主要方面);
即如果有历史报文没发送出去,初始化序列号还是和之前一样,就有可能导致历史数据刚好落在服务器接受窗口范围内被接受。
- 为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收;

第一次握手丢失了,会发生什么?
会超时重传,而且重传的 SYN 报文的序列号都是一样的,重传的次数可以设置,超时的时候每次是之前的二倍。达到最大重传次数后,再等待一段时间(时间为上一次超时时间的 2 倍),客户端则会断开连接。
第二次握手丢失了,会发生什么?
客户端迟迟没有收到确认,就会触发超时重传机制,重传 SYN 报文。
服务端这边由于发送了SYN标志的报文,但是没有没法出去,会触发超时重传机制,重传 SYN-ACK 报文。
第三次握手丢失了,会发生什么?
由于服务器一直收不到客户端发送的ACK确认号,所以会超时重传,达到最大重传次数后会断开连接。
TCP断开连接
TCP 四次挥手过程是怎样的?
在断开TCP连接时,需要通过四次挥手来断开,过程是:

(1)客户端向服务端发送FIN=1和序列号SEQ=x的数据包,用来关闭客户端到服务端的数据传送。然后客户端进入 FIN-WAIT-1 状态。
(2)服务端接收FIN后,向客户端发送ACK(ACK=x+1),表示我接收到了断开连接的请求,客户端可以不发数据了,不过服务端这边可能还有数据正在处理。这时候然后服务端进入 CLOSE-WAIT 状态,客户端收到ACK确认号后进入 FIN-WAIT-2 状态。
(3)服务端处理完所有数据后,向客户端发送FIN=1和序列号SEQ=y的数据包,表示服务端现在可以断开连接,然后服务端进入 LAST-ACK 状态。
(4)客户端接收到服务端的FIN,向服务端发送ACK(ACK=y+1),表示客户端也会断开连接。客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也进入CLOSE状态。
为什么挥手需要四次?

第一次挥手丢失了,会发生什么?
如果第一次挥手丢失了,那么客户端迟迟收不到被动方的 ACK 的话会超时重传,重传的次数可以设置,超时的时间每次是之前的二倍。达到最大重传次数后,再等待一段时间(时间为上一次超时时间的 2 倍),客户端则会断开连接。
第二次挥手丢失了,会发生什么?
第三次挥手丢失了,会发生什么?
和上面一样,服务端第三次挥手发送FIN数据包,如果丢失,也是会超时重传,超过最大重传次数后,再等待一段时间后断开连接。
而客户端由于是通过 close 函数关闭连接的,处于 FIN_WAIT_2 状态是有时长限制的,如果在tcp_fin_timeout 时间内还是没能收到服务端的第三次挥手(FIN 报文),客户端就会断开连接。


第四次挥手丢失了,会发生什么?
由于第四次挥手是发送ACK确认好,不会重传,所以第四次挥手丢失了,服务器会超时重传FIN的报文。客户端在重新收到这个FIN报文后,就会重置这个2MSL的等待时间。
为什么 TIME_WAIT 等待的时间是 2MSL?
也就是说MSL是报文最大的生存时间
因为2MSL可以保证在2MSL内,如果客户端发送的ACK确认报文丢失,服务端超时重发FIN能够被客户端接受到,这样一来一回刚好两个MSL。
为什么需要 TIME_WAIT 状态?

1、防止历史连接中的数据,被后面相同四元组的连接错误的接收

2、保证「被动关闭连接」的一方,能被正确的关闭
TIME-WAIT 作用是等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。即:如果主动关闭连接的一方没有这个等待时间而直接关闭,当它的ACK丢失的时候,被动关闭方就不能被正确关闭,有这个等待时间,就会在等待时间内查看是否FIN会超时重发。
TIME_WAIT 过多有什么危害?

服务器出现大量 TIME_WAIT 状态的原因有哪些?

1、不管是客户端还是服务器端关闭了长连接机制,都会导致服务器使用完一次HTTP后,主动断开连接。
服务器出现大量 CLOSE_WAIT 状态的原因有哪些?

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

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

拔掉网线后,原本的TCP连接还存在吗?



Socket 编程
针对 TCP 应该如何 Socket 编程?



即:
第一次握手,Connect主动打开,发起连接请求
第二次握手,服务端accept阻塞,connect返回成功
第三次握手,accept返回成功

没有 accept,能建立 TCP 连接吗?

没有 listen,能建立 TCP 连接吗?

为什么可以?
半连接队列和全连接队列保存TCP三次握手时的连接的信息,但是半连接队列和全连接队列都是在执行 listen 方法时,内核自动创建的。
如果没有listen,就没有半连接队列和全连接队列保存TCP的连接信息,但内核还有个全局 hash 表,可以用于存放 sock 连接的信息,因此客户端和客户端之间如果没有listen也是可以进行TCP连接的。
相似的问题:
服务端没有 listen,客户端发起连接建立,会发生什么?
服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,由于没有listen,就没有半连接队列和全连接队列保存TCP的连接信息,就无法找到相应的socket,客户端对服务端发起了连接建立,服务端会回 RST 报文,连接失败。
TCP 重传、滑动窗口、流量控制、拥塞控制
TCP的可靠性怎么保证的?
TCP 是通过序列号、确认应答、重传机制、连接管理以及滑动窗口控制等机制实现可靠性传输的。
重传机制
超时重传

<font style="color:rgb(71, 101, 130);">RTT</font> 指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。
超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。
快速重传

SACK 方法

Duplicate SACK
Duplicate SACK 又称 <font style="color:rgb(71, 101, 130);">D-SACK</font>,其主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。
滑动窗口



流量控制

拥塞控制



慢启动


拥塞避免算法

拥塞发生
拥塞发生的情况:
1、超时重传:重传计时器超时才会重传
2、快速重传:收到三次同一个数据包的ACK,就会立即重传,不必等到计时器超时

即快恢复:

课本:

快速恢复??和课本不一样



相关文章:
计算机网络——TCP篇
TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗? 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的? 一次握手:客户端发送带有 …...
【网络安全面经】技术性问题3
11. 一次完整的 HTTP 请求过程 域名解析:通过 DNS 将域名转换为 IP 地址,如上述 DNS 的工作原理。建立 TCP 连接:客户端向服务器发送 SYN 报文段,经过三次握手建立 TCP 连接。发送 HTTP 请求:客户端向服务器发送 HTTP…...
前后端交互之动态列
一. 情景 在做项目时,有时候后会遇到后端使用了聚合函数,导致生成的对象的属性数量或数量不固定,因此无法建立一个与之对应的对象来向前端传递数据,这时可以采用NameDataListVO向前端传递数据。 Data Builder AllArgsConstructo…...
递归(3)----力扣40组合数2,力扣473火柴拼正方形
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,1…...
十一:HTTP 状态码详解:解读每一个响应背后的意义
HTTP(超文本传输协议)是网络通信的基石之一,主要用于客户端(例如浏览器)和服务器之间的通信。为了让服务器能准确地向客户端反馈请求的处理状态,HTTP设计了一套标准的状态码。每一个状态码代表了特定的含义,指示了请求的状态、潜在的问题或成功的信息。 1. 信息响应 (1…...
《译文》2024年11月数维杯国际大学生数学建模挑战赛题目
# 赛题正式发布 2024年第十届数维杯国际大学生数学建模挑战赛顺利开赛,竞赛开始时间为北京时间2024年11月15日09:00至北京时间2024年11月19日09:00,共计4天,竞赛题目正式发布,快来一起围观,你认为今年的哪个题目更具有…...
shell命令统计文件行数之和
你可以使用以下 shell 命令来统计每个 .txt 文件的行数,并将其加和在一起: find . -name "*.txt" -not -name "*.json" -exec wc -l {} + | awk {sum += $1} END {print sum} 解释: find . -name "*.txt" -not -name "*.json": f…...
第02章 CentOS基本操作
2.文件基本操作【文件操作(一)】 目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标…...
241113.学习日志——[CSDIY] [ByteDance] 后端训练营 [02]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...
【HOT100第三天】和为K的子数组,最大子数组和,合并区间,轮转数组
今天练的是子串和子数组专题 ~ (前缀和那里差点学死了) 560.和为K的子数组 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 先写个暴力法,用昨天刚学…...
设计模式-Adapter(适配器模式)GO语言版本
前言 个人感觉Adapter模式核心就在于接口之间的转换。将已有的一些接口转换成其他接口形式。并且一般用于对象上,而不是系统上 问题 就用一个简单的问题,懂数据结构的同学可能知道双端队列。那么就用双端队列实现一个栈(stack)或…...
SAM_Med2D 训练完成后boxes_prompt没有生成mask的问题
之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记(续):训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…...
游戏引擎学习第18天
clang-format 相关的配置可以参考下面 .clang-format 是用来配置代码格式化规则的文件,主要用于 Clang-Format 工具。以下是 .clang-format 文件中的一些常用设置: 1. 基础设置 Language: Cpp # 指定语言 (C, C, Java, JavaScript, etc…...
Kotlin return与return@forEachIndexed
Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过,继续下一个forEachIndexed迭代returnforEachIndexed}println("…...
基于Canny边缘检测和轮廓检测
这段代码实现了基于Canny边缘检测和轮廓检测,从图像中筛选出面积较大的矩形,并使用OpenCV和Matplotlib显示结果。主要流程如下: 步骤详解: 读取图像: img cv2.imread(U:/1.png)使用cv2.imread()加载图像。 转换为灰…...
力扣题目解析--合并k个升序链表
题目 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下…...
Linux:调试器-gdb/cgdb
文章目录 一、编译成debug1、-g 选项 二、gdb调试命令1、在CentOS系统下检查安装gdb2、进入gdb模式3、quit 退出gdb4、list (简写 l)显示文件内容5、b 打断点6、 r / run运行程序7、c 让程序直接运行完 三、cgdb1、info b查看打的所有断点2、d 删除断点3…...
『VUE』30. 生命周期的介绍(详细图文注释)
目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板…...
Python 人脸检测:使用 Dlib 和 OpenCV
简介 本文用Python、Dlib 和 OpenCV 库来检测图像中的人脸,并在人脸上绘制矩形框进行窗口显示。 环境准备 在开始之前,请确保您的计算机上已安装 Python。此外,您还需要安装以下库: dlib:一个包含多种机器学习算法…...
【大数据学习 | flume】flume的概述与组件的介绍
1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到HDFS、Hbase,简单来说flume就是收集日志的。 Flume两个版本区别: 1&…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
