计算机网络 - 2.基础协议
1.TCP协议
- 1.
TCP
(Transmission Control Protocol
):传输控制协议- 2.
TCP
协议是一种面向连接的
、可靠的
、 基于字节流
的传输层通信协议
- 1.
面向连接
:两个使用TCP
协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP
连接- 2.
可靠的
- 1.数据传输之前都要建立连接(
三次握手
),数据传输结束后都要释放连接(四次挥手
)- 2.数据被分割成
TCP
认为适合发送的数据块,而采用UDP
协议的数据长度将保持不变- 3.由
TCP
传递给IP
的信息单位称为报文段或段segment
- 4.当
TCP
发出一个段后将启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段- 5.等待协议:客户发送一次数据到服务端,必须等到服务端响应后才发第二次数据,中间的等待时间占了大部分时间,中间如果出现差错(超时或确认丢失)都需要重新传输
- 5.
TCP
将保存首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化,如果收到段的检验和有差错,TCP
将丢弃这个报文段并不确认收到此报文段,发送端需要重新发送- 3.
TCP
位码即TCP
标志位共有六种
- 1.
SYN
(建立)- 2.
ACK
(确认)- 3.
PSH
(传送)- 4.
FIN
(结束)- 5.
RST
(重置)、- 6.
URG
(紧急)- 7.
Sequence number
(顺序号码)- 8.
Acknowledge number
(确认号码)
1.三次握手
- 1.
TCP
协议中建立连接需要经过三次握手,开始时客户端处于CLOSED
的状态,服务端处于LISTEN
状态
- 1.
第一次握手
- 1.客户端发送
SYN
报文(包
)到服务器并指明客户端的初始化序列号seq
,此时客户端处于SYN_SEND
状态,等待服务器确认- 2.首部的同步位
SYN=1
,初始化序列号sqe=x
,x
是一个随机生成的值- 2.
第二次握手
- 1.服务器收到客户端的
SYN
报文,发送一个SYN+ACK
报文作为应答并且指定自己的初始化序列号- 2.将客户端的初始化序列号加一,即
x + 1
作为ack
的值,表示已经收到了客户端的SYN
报文,此时服务器处于SYN_REVD
的状态- 3.确认报文段中
SYN=1
,ACK=1
,确认号ack=x+1
,初始化序列号seq=y
- 3.
第三次握手
- 1.客户端收到服务器
SYN+ACK
报文后,会向服务器发送一个ACK
报文表示已经收到了服务端的报文- 2.此时客户端处于
ESTABLISHED
状态,服务器收到ACK
报文之后,也处于ESTABLISHED
状态,此时双方已建立起了连接,完成三次握手- 3.确认报文段中
ACK=1
,确认号ack=y+1
,初始化序列号seq=x+1
- 2.三次握手(
Three-way Handshake
)本质:指建立一个TCP
连接时需要客户端和服务器总共发送3
个包- 3.三次握手的作用:确认双方的接收能力和发送能力是否正常,指定自己的初始化序列号为后面的可靠性传送做准备,实质上是连接服务器指定端口建立
TCP
连接并同步连接双方的序列号和确认号,交换TCP
窗口大小信息- 4.理想状态下
TCP
连接一旦建立,则在通信双方中的任何一方主动关闭连接之前TCP
连接都将被一直保持下去- 5.一般握手过程中传送的包里不包含数据,三次握手完成后客户端与服务器才正式开始传送数据
- 6.注意
- 1.
SYN=1
报文段不能携带数据,ACK
报文段可以携带数据,不携带数据则不消耗序号,即三次握手的前两次不能携带数据,而第三次可以携带数据- 2.
ACK
和ack
的区别
- 1.三次握手发送的数据包中有两个
ACK
,习惯通过一个大写一个小写加以区分- 2.
ACK
:确认标志(Acknowledgement
),值为1
表示确认连接- 3.
ack
:确认编号(Acknowledgement Number
),值为发送方
传来的seq+1
,表示已经成功接收上一次所有数据- 3.需要三次握手的原因
- 1.第一次握手:客户端发送网络包,服务端接收;结论:
服务端可知客户端的发送能力正常
- 2.第二次握手:服务端发送网络包,客户端接收;结论:
客户端可知服务端的接收,发送能力正常
,但是此时服务端并不能确认客户端的接收能力正常所以需要第三次的确认- 3.第三次握手:客户端发送网络包,服务端接收;结论:
服务端可知客户端的接收,发送能力正常
- 4.两次握手的问题
- 1.客户端发出连接请求但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求
- 2.服务端后来收到了确认,建立了连接,数据传输完毕后,就释放了连接
- 3.客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留,从而延误到连接释放以后的某个时间才到达服务端
- 4.此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接
- 5.不采用三次握手,只要服务端发出确认就建立新的连接,此时客户端忽略服务端发来的确认也不发送数据,则服务端一致等待客户端发送数据,浪费资源
- 5.半连接队列和全连接队列
- 1.服务器第一次接收到客户端的
SYN
报文后会处于SYN_RCVD
状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,把这种队列称之为半连接队列- 2.全连接队列:已经完成三次握手建立起连接的会放在全连接队列中,如果队列满了有可能会出现丢包现象
- 3.服务器发送完
SYN+ACK
包后如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除,且每次重传等待的时间不一定相同,一般会是指数增长
1.初始化序列号ISN
- 1.客户端和服务端在建立
TCP
连接时,双方都会发送SYN
报文并初始化序列号(Initial Sequence Number
,ISN
)- 2.使用相同
ISN
导致的问题
- 1.假设
A
和B
使用固定的序号,A
使用序号1
和B
建立TCP
连接,发送一个SYN
报文,此时seq = 1
,经过三次握手后A
和B
之间建立TCP
连接完成- 2.当
A
和B
建立TCP
连接后,A
又使用相同的序号1
向B
发送了200
字节数据,不过因为网络拥塞问题,这个TCP
数据报一直在网络中逗留并没有立即到达B
- 3.由于
A
发送的TCP
数据报一直没到达B
,正好此时A发生故障并重启,于是B
就释放这条TCP
连接,然后A
重启后又使用序号1
和B
建立新的TCP
连接- 4.当
TCP
连接建立后A
又使用序号1
向B
发送了240
字节的数据,不过这次网络很稳定B
马上就收到A
发送的数据,注意此时A
发送数据使用新的TCP
连接- 5.
A
之前发送的TCP
数据报经过一段时间后终于到达B
,不过该TCP
数据报属于之前已经释放的旧TCP
连接,B
应该把这个数据报丢弃掉,但是由于A
每次发送报文都使用了相同的序号(seq = 1
)从而会让B
误认为该数据报属于新建立的TCP
连接,因此B
会对该数据照收不误导致B
在收到新TCP
连接的数据后又收到旧TCP
连接的数据从而出现数据乱序的问题- 3.
ISN
的作用:保证消息的顺序性
- 1.由于
A
和B
之间的一个TCP
连接通常是由A
和B
的2
个ip
地址,2
个端口号构成的四元组- 2.因此当
A
出现了故障把该TCP
连接断开之后再以相同的四元组建立新的TCP
连接(A
和B
两次建立TCP
连接都是使用相同的ip
地址和端口),就会出现数据乱序的问题- 3.因为只要
A
发送了一个TCP
报文段且这个TCP
报文段的四元组和序号和之前的TCP
连接(四元组和序号)相同的话就会被B
确认- 4.这反映了
TCP
的一些缺点,如果被一些恶意攻击者加以利用TCP
的这种缺点,选择合适的序号,ip
地址和端口就能伪造出一个TCP
报文段从而打断正常的TCP
连接- 5.但是初始化序号的方式(通过算法来随机生成序号)就会使序号难以猜出,也就不容易利用这种缺点来进行一些恶意攻击行为,且如何序号不同那么
B
在接收到这个序号为1
的TCP
报文时,发现该TCP
报文的序号不在新TCP
连接的接收范围内时会把这个TCP
报文丢弃掉从而避免了数据乱序的问题
2.四次挥手
- 1.
TCP
协议中断开连接需要经过四次挥手,开始时客户端和服务端都处于ESTABLISHED
状态,假定客户端先发起关闭请求
- 1.
第一次挥手
相关文章:

计算机网络 - 2.基础协议
1.TCP协议 1.TCP(Transmission Control Protocol):传输控制协议2.TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 1.面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接2.可靠的 1.数据传输之前都要建立…...
Kafka消息路由分区机制深度解析:架构设计与实现原理
一、消息路由系统的核心架构哲学 1.1 分布式系统的三元悖论 在分布式消息系统的设计过程中,架构师需要平衡三个核心诉求:数据一致性、系统可用性和分区容忍性。Kafka的分区路由机制本质上是对CAP定理的实践解: 一致性维度:通过…...
机器学习中采样哪些事
在机器学习中采样主要分为两种,过采样(Oversample)和欠采样(Undersample)。过采样就是通过增加少数类样本的数量来平衡数据集。而欠采样就是通过减少多数类样本的数量来平衡数据集。 通常在进行采样中以下是几种常用的方法: 1. 随机采样 随…...

初识css,css语法怎样学好css以及常见问题与避坑
一、CSS 是什么? CSS(Cascading Style Sheets)是一种用于描述网页文档(HTML 或 XML)呈现样式的语言。它负责控制网页元素的视觉表现,如颜色、字体、布局等,使内容与展示分离。 二、CSS 语法结构…...
MySQL如何快速删除数据库中所有表数据
首先运行下面指令生成TRUNCATE TABLE语句 -- 生成的TRUNCATE TABLE语句 SELECT CONCAT(TRUNCATE TABLE , table_name, ;) FROM information_schema.tables WHERE table_schema axe_elder; 再运行下面指令禁用外键关联检查 -- 禁用外键检查 SET FOREIGN_KEY_CHECKS 0; 运…...
计算机视觉与深度学习 | Python实现ARIMA-LSTM时间序列预测(完整源码和数据)
ARIMA-LSTM混合模型 1. 环境准备2. 数据生成(示例数据)3. 数据预处理4. ARIMA建模5. LSTM残差建模6. 混合预测7. 结果可视化完整代码说明1. **数据生成**2. **ARIMA建模**3. **LSTM残差建模**4. **混合预测**5. **性能评估**参数调优建议扩展方向典型输出以下是使用Python实现…...

Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…...

vue2.0 组件生命周期
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
Next.js 是一个基于 React 的服务端渲染框架,它提供了很多开箱即用的功能,如自动路由、API 路由、静态生成、增量静态再生等。本文将带你一步步创建一个 Next.js 项目,并实现一个简单的 TodoList 功能。 效果地址 🧱 安装 Next.j…...

在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问
Jupyter notebook版本7.4.2(这个版本AI提示我Jupyter7(底层是 jupyter_server 2.x) 服务器开启服务 安装Jupyter notebook 7.4.2成功后,终端输入 jupyter notebook --generate-config 这将在 ~/.jupyter/ 目录下生成 jupyter_…...

GPU 超级节点:AWS Trainium2 UltraServer
目录 文章目录 目录时间线Inferentia1Trainium1Inferentia2Trainium2Trainium2 ServerTrainium2 UltraServerTrainium2 UltraClustersTrainium3AWS GPU 实例矩阵与竞品分析SuperNode RackTrn2 ServerTrn2U Server ScaleUp 网络PCIe Gen5:CPU-Trainium2 ScaleUpNeuro…...
代码随想录算法训练营Day37 | 完全背包基础理论 518. 零钱兑换II 377. 组合总和Ⅳ 57. 爬楼梯(第八期模拟笔试)
完全背包基础理论 不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i - 1][j]。 放物品i:背包空出物品i的容量后,背包容量为j - weight[i],dp[i][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值…...

git仓库中.git 文件很大,怎么清理掉一部分
查询 .git 文件大小,在 git-bash 里执行(后面有些命令不能执行,也请在 git-bash 里执行) windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份,避免推送到远程时出错…...

MySQL安装实战指南:Mac、Windows与Docker全平台详解
MySQL作为世界上最流行的开源关系型数据库,是每位开发者必须掌握的基础技能。本指南将手把手带你完成三大平台的MySQL安装,从下载到配置,每个步骤都配有详细说明和截图,特别适合新手学习。 一、Mac系统安装MySQL 1.1 通过Homebre…...

Rocky Linux 远程服务器画面GUI传输到本地显示教程——Xming
Rocky Linux 远程服务器画面GUI传输到本地显示教程——Xming 下载Xming安装Xming安装Xming字体Xming的使用设置测试 Xming可以提供GUI环境,在Linux服务器上执行GUI应用时,可通过Xming在Windows上执行GUI操作。 下载Xming 下载链接:https://…...
出现 org.apache.catalina.starup.HostConfig.deployDirectory 把web 应用程序部署到目录 解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)临近毕业,很多人问的项目都是JSP这一类,普遍都是tomca…...

游戏引擎学习第283天:“让‘Standing-on’成为一个更严谨的概念
如果同时使用多个OpenGL上下文,并且它们都有工作负载,GPU或GPU驱动程序如何决定调度这些工作?我注意到Windows似乎优先处理活动窗口的OpenGL上下文(即活动窗口表现更好),挺有意思的…… 当多个OpenGL上下文…...

React集成百度【JSAPI Three】教程(001):快速入门
文章目录 1、快速入门1.1 创建react项目1.2 安装与配置1.3 静态资源配置1.4 配置百度地图AK1.5 第一个DEMO1、快速入门 JSAPI Three版本是一套基于Three.js的三维数字孪生版本地图服务引擎,一套引擎即可支持2D、2.5D、3D全能力的地理投影与数据源加载,帮助开发者轻松搞定平面…...

python学习day2
今天主要学习了变量的数据类型,以及如何使用格式化符号进行输出。 一、认识数据类型 在python里为了应对不同的业务需求,也把数据分为不同的类型。 代码如下: """ 1、按类型将不同的变量存储在不同的类型数据 2、验证这些…...
VAPO:视觉-语言对齐预训练(对象级语义)详解
简介 多模态预训练模型(Vision-Language Pre-training, VLP)近年来取得了飞跃发展。在视觉-语言模型中,模型需要同时理解图像和文本,这要求模型学习二者之间的语义对应关系。早期方法如 VisualBERT、LXMERT 等往往使用预先提取的图像区域特征和文本词嵌入拼接输入,通过 T…...
C语言学习笔记之函数
文章目录 1、函数的基本用法2、函数的参数传递2.1 全局变量2.2 复制传递方式2.3 地址传递方式 3、函数的传参—数组4、指针函数5、递归函数和函数指针5.1 递归函数5.2 函数指针5.3 函数指针数组 1、函数的基本用法 函数是一个完成特定功能的代码模块,其程序代码独立…...
集合进阶2
Java不可变集合、Stream流与方法引用深度解析 一、不可变集合(Immutable Collections)进阶指南 1.1 不可变集合核心特性 防御性编程:防止外部修改数据(如传递集合给第三方库时)线程安全:天然支持多线程读…...
2025云上人工智能安全发展研究
随着人工智能(AI)技术与云计算的深度融合,云上AI应用场景不断扩展,但安全挑战也日益复杂。结合2025年的技术演进与行业实践,云上AI安全发展呈现以下关键趋势与应对策略: 一、云上AI安全的主要挑战 数据泄露…...

【C++】模版(1)
目录 1. 泛型编程 2. 函数模版 2.1 函数模版概念 2.2 函数模版格式 2.3 函数模版的原理 2.4 函数模版实例化方式 隐式实例化 显式实例化 2.5 模版参数的匹配原则 3. 模版类 模版类的定义格式 模版类的实例化 1. 泛型编程 如何实现一个通用的交换函数呢?…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究
摘要:本文探讨在去中心化商业趋势下,开源AI智能名片链动21模式S2B2C商城小程序源码如何助力企业挖掘数据价值、打破信息孤岛,实现商业高效扩散。通过分析该技术组合的架构与功能,结合实际案例,揭示其在用户关系拓展、流…...

5月19日day30打卡
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...

白杨SEO:不到7天,白杨SEO博客网站百度搜索显示和排名恢复正常!顺带说说上海线下GEO聚会分享和播客红利
大家好,我是白杨SEO,专注SEO十年以上,全网SEO流量实战派,AI搜索优化研究者。 5月开始,明显就忙起来了,不管是个人陪跑还是企业顾问,不管是需要传统SEO还是新媒体流量,还是当下这个A…...
Windows软件插件-音视频捕获
下载本插件 音视频捕获就是获取电脑外接的话筒,摄像头,或线路输入的音频和视频。 本插件捕获电脑外接的音频和视频。最多可以同时获取4个视频源和4个音频源。插件可以在win32和MFC程序中使用。 使用方法 首先,加载本“捕获”DLL,…...
go 与面向对象编程(OOP)
Go 语言在设计上与传统面向对象(OOP)语言(如 Java、C)有明显差异,官方明确表示它并非纯面向对象语言。然而,它通过独特的方式实现了部分面向对象的核心特性。以下是关键分析: 1. Go 对传统 OOP…...
Mergekit——任务向量合并算法Ties解析
Mergekit——高频合并算法 TIES解析 Ties背景Ties 核心思想具体流程总结 mergekit项目地址 Mergekit提供模型合并方法可以概况为四大类:基本线性加权、基于球面插值、基于任务向量 以及一些专业化方法,今天我们来刷下基于任务向量的ties合并方法…...