计算机网络——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&…...
torch.is_storage()
torch.is_storage() 判断给定的对象是否是一个 PyTorch 存储对象 PyTorch 存储对象:PyTorch 中,存储对象(Storage)是一个低级别的对象,它表示一个存储数据的连续内存块。存储对象不包含任何关于数据如何解释的信息&a…...
2411rust,编译时自动检查配置
原文 Cargo和编译器团队很高兴地宣布,从Rust1.80(或nightly-2024-05-05)开始,会自动检查每个可访问的#[cfg],看看是否与期望的配置名和值匹配. 这帮助验证crate,是否正确处理不同目标平台或函数的条件编译.它确保在期望和使用设置的配置间保持一致,帮助在开发过程的早期抓住潜…...
在 Ubuntu 中用 VSCode 配置 C 语言项目的编译与调试(详解教程)
目录 一、准备工作二、配置 VSCode 的编译任务三、配置 VSCode 的调试任务四、编译与调试流程五、常见问题排查六、总结 在 C 语言开发过程中,调试与编译是不可缺少的环节,而 VSCode(Visual Studio Code)作为一个强大且轻量级的编…...
MATLAB绘制克莱因瓶
MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…...
HTML5实现趣味飞船捡金币小游戏(附源码)
文章目录 1.设计来源1.1 主界面1.2 游戏中界面1.2 飞船边界框效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143799554 HTML5实现趣味飞船捡金币小游戏(附源码)&…...
Excel表数学于三角函数、统计函数
一、数学与三角函数 函数说明ABS返回数值的绝对值ACOS反余弦函数ACOSH反双曲余弦函数ASIN反正弦函数ASINH反双曲正弦函数ATAN反正切函数ATAN2以 x、y 坐标返回反正切值ATANH反双曲正切函数CEILING向上舍入(指定倍数的整数)COMBIN组合公式COS余弦函数COS…...
小试银河麒麟系统OCR软件
0 前言 今天在国产电脑上办公,需要从一些PDF文件中复制文字内容,但是这些PDF文件是图片转换生成的,不支持文字选择和复制,除了手工输入,我们还可以使用OCR。 1 什么是OCR OCR (Optical Character Recogni…...
Dubbo RPC线程模型
消费端线程模型,提供者端线程模型 消费端线程模型 对 2.7.5 版本之前的 Dubbo 应用,尤其是一些消费端应用,当面临需要消费大量服务且并发数比较大的大流量场景时(典型如网关类场景),经常会出现消费端线程…...
三角波生成函数
% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒,步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…...
使用Python实现对接Hadoop集群(通过Hive)并提供API接口
安装必要的库 首先,确保已经安装了以下库: pip install flask pip install pyhive代码实现 1. app.py(主应用文件) from flask import Flask, jsonify, request, abort from pyhive import hive import re from datetime impo…...
资阳优化团队资讯/镇江seo
概述 继承是指这样一种能力: 通过继承创建的新类可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 继承就是一个从一般到特殊的过程,是面向对象编程(OOP)语言的主要特征。一个子类可…...
微网站建设费用/seo手机端排名软件
SQL46 列出供应商及其可供产品的数量 描述 有 Vendors 表含有 vend_id 供应商id. vend_ida0002a0013a0003a0010 有 Products 表含有供应商 id 和供应产品 id vend_idprod_ida0001egga0002prod_id_iphonea00113prod_id_teaa0003prod_id_vivo phonea0010prod_id_huawei phone…...
dedecms 生成网站地图/开网店如何运营和推广
传送门:bzoj4036 Min-Max容斥 设max(S)\max(S)max(S)为集合SSS中的最大值,min(S)\min(S)min(S)为集合SSS中的最小值,∣S∣|S|∣S∣为集合SSS的大小,则存在: max(S)∑T⊆S(−1)∣T∣1min(T)min(S)∑T⊆S(−1)∣T∣1max…...
海口网站建设就q479185700上墙/宁波seo怎么做优化
实例可数的类,注意枚举也是类 可以修改构造,添加成员 可以提升代码的表现力。也有一定的性能开销 code package com.yzdzy.kotlinenum class LogLevel(val id: Int) {VERBOSE(0), DEBUG(1), INFO(2), WARN(3), ERROR(4), ASSERT(5);fun getTag(): St…...
旅游网站建设报价单/软文发布平台有哪些
在手机应用领域为何有那么多失败的开发者? 10个开发者不约而同看上同一项目,第1个开发出来的卖9元一个,第2个开发出来的卖8元一个,第3个开发出来的卖7元一个,……第10个开发出来的,就只能免费发布了。中国开…...
复制网站模板/网络营销学什么内容
http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#1732 深入Java核心Java内存分配原理精讲 url:http://xwood.iteye.com/blog/762286 Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及…...