TCP 协议
文章目录
- 协议格式
- 1面向连接:
- 1.1三次握手(建立连接)
- 1.2包序管理
- 1.2四次挥手(断开连接)
- 2可靠传输:
- 一。保证数据可靠有序的到达对端:
- 确认应答机制
- 超时重传机制
- 二。提高传输效率:
- 1.提升自身发送数据量
- 滑动窗口机制 rwnd
- 滑动窗口丢包了咋办?
- 快重传机制
- 2.提升对端接收能力
- 流量控制机制
- 延时应答机制
- 捎带应答机制
- 3.提升网络转发能力
- 拥塞控制机制cwnd
- 拥塞控制的三个阶段:
- 保活计时器/心跳机制
- 面向字节流
TCP协议特点:
面向连接:发数据前先建立连接,沟通发送数据的细节。
可靠传输:保证数据高效,有序的到达对方。
面向字节流:数据没有明显的边界,接收方可按任意字节接收。
协议格式
32位序号:请求方数据的起始序号。
32位确认序号:响应方发送,期望收到的下一个报文段的序号,告诉请求方下一次该发送的报文段序号。
4位首部长度:1111 B*4=60(20字节固定长度+40字节选项)。
16位窗口大小:告诉发送方最多还能接收多少数据。
16位紧急指针:指向紧急数据。(不用在发送和缓冲区停留)
URG: 紧急指针是否有效
ACK: 确认号是否有效
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
TCP选项:MSS:
最大报文长度该值只包括TCP段的数据部分,一个TCP数据包中一次发送的最大字节数。在三次握手中最后取两者MSS最小值。MSS的默认值是536字节长,最大1460字节。
注意:udp没有MSS的概念。
MTU:最大传输单元(字节),数据链路层属性,是网卡传输数据帧的限制,取决于传输设备。
MTU>=IP头部 + 传输层头部 + 有效载荷 。MSS受MTU限制,防止报文过大而丢包引发重传。
底层物理接口默认 MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte。
1面向连接:
1.1三次握手(建立连接)
在发起起连接方调用connect(),后发起连接。
第三次握手的意义在于接送方确定自己的响应被请求方收到,否则状态还是SYN_RCVD.此时响应端的连接处于未完成连接队列,当第三次握手结束后,响应端的状态为ESTABL ISHED,此时的连接就放在了已完成队列,等着accept()来拿。
1.2包序管理
为了可靠传输,方便计算重传,TCP为每个发出的数据报进行了编号。
对于没有有效载荷的包,每次用一个编号就行,对于含有有效载荷是包,每个字节都占一个编号。
通信双发各自维护一套编号。
确认序号ACK = 发送方发送的序号+1(无有效载荷)
确认序号ACK = 发送方发送的序号+数据长度(有有效载荷)
ACK:ACK之前的数据都确认收到了,比如ACK = x+1,说明X+1之前的包都收到了下次可以从X+1开始发送了。
纯ACK包无需确认,也不消耗序号。
1.2四次挥手(断开连接)
MSL:报文最大生存时间,TCP认为此包在网络上后收到多方ACK的最大时间,若超过这个时间就得重传。
2MSL:丢失ACK+重传FIN的总MSL.
2可靠传输:
一。保证数据可靠有序的到达对端:
确认应答机制
发送方发送的消息需要接收方确认,通过对序号的确认告诉对方期望发送的下一个序号,隐含意义是告诉对方此序号之前的数据都收到了。
超时重传机制
发出一个数据包时,如果发送端在
RTO
时间内没有收到此数据包的确认包时会触发超时重传机制,重新将此包发出。
TCP发生缓冲区是一段环形队列,在没有收到某个数据的确认之前是不可以被覆盖的,为了防止万一重传时方便重传。
RTO:超时重传时间,根据当时网络环境而动态变化。
RTO=2RTT.
RTT:报文往返时间 SRTT = ( ALPHA * SRTT ) + ((1-ALPHA) * RTT)
一个平滑的RTT称置为SRTT, alpha是一个平滑因子,取值为0.8或者0.9
二。提高传输效率:
1.提升自身发送数据量
之前建立连接那样,没法一个包都必须确认,效率实在太低。
滑动窗口机制 rwnd
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 比如下图的1001-4000。
首次发送窗口内的数据时, 不需要等待任何ACK, 直接发送;
允许tcp将窗口内的数据(多个分组),同时发送,并行传递,暂时不用确认。
当发送端窗口内最早发送送的数据得到确认应答,窗口就可以继续向为发送的区域滑动。
滑动窗口机制很大的提升了TCP的发送效率。
设滑动窗口最多容纳包序为1001-3001。
如果收到了确认应答且ACK= 2001,则窗口向右移动一个包:2001-4001。
如果收到了确认应答且ACK= 4001,则窗口向右移动3个包:4001-6001。
如果:窗口内最左边的数据收到了确认,那么窗口就可以向右滑动以此类推,否则不能滑动,等待其他数据的确认。
滑动窗口丢包了咋办?
- 如果是部分ACK包丢失,没关系
由于窗口内的数据发送暂时不需要确认。
当接收方给发送方回复的ACK=2001包丢了,那么当发送方继续发2001-3000后,接收方会继续恢复确认包ACK=3001,隐含意思就是3000极其之前的数据都收到了。
如果是发送方的数据包丢了:
发送方发1001-2000的数据包丢了,接收方在收到2001及其之后的包后都会给发送回复ACK=1001而不是当前新收的包(比如,2001-4000),将后续收到的包缓存在接收缓存区。如果发送方连续三次都收到同一个确认的ACK序号(1001),说明从此序号(1001)开始的包丢失了,立刻触发快速重传机制
。发送方立刻重新发送此包,当接收方收到此包后立刻挥发ACK=目前已经连续接收到的最大的包序(4001);
快重传机制
当发送方方连续收到3次同样的ACK包确认序号,在触发超时重传之前立刻重发次包。
2.提升对端接收能力
流量控制机制
问题引入:当发送方发了大量数据时,接收方的TCP接收缓冲区有限。
做法:接收方没发一次数据接收方给应答的时候都带上自己的接收能力,通知发送方控制下次的发送量。
0号窗口通告
:给发送说自己堵住了,接收能力为0.
恢复的方法:
- 接收方给发送方一个窗口更新通知。
- 发送方给接收方一个窗口探测数据包来探测对方的接收能力。
延时应答机制
接收方在应答的时候会在包头带上窗口大小,告诉对方自己的接收能力。
但是接收方并不是立马回应,而是适当托一会,期待应用层进量多取走数据,从而给发送方回应一个更大的窗口大小。
捎带应答机制
和延时应答机制一样,不过不是等待窗口的扩大,而是期望短期还有从接收方发给发送方的数据包,如果有就稍待将ACK置1,这样就可以顺便捎带应答。
3.提升网络转发能力
TCP的流滑动窗口是对收发数据量的控制手段,简称流控,但这只依赖于发送端和接收端(端对端的情况),并没有考虑网络模型4层一下点对点的影响,因此TCP专门为网络转发能力开辟了一个窗口。
拥塞控制机制cwnd
基于对网络转发能力的探测,TCP还维护了庸拥塞窗口cwnd,是由发送方维护的一个状态变量,会根据网络拥塞程度实时变化,对于发送方而言,
发送数据量=min(cwnd,rwnd);
发送窗口:取决于接收方的接收能力。
拥塞窗口:取决网络转发能力。
拥塞控制的三个阶段:
少量的丢包是触发超时重传; 大量的丢包认为网络拥塞;
慢启动阶段:开始阶段,先发少量数据试探网络转发能力,窗口大小(发送量)为1个报文段556字节,是以指数能力增长,直到达到阈值(窗口最大值),开始到达拥塞避免阶段。
拥塞避免阶段:发送量继续以线性增长,直到发生拥塞(丢包),到达快恢复阶段。
快恢复阶段: 当发生丢包触发超时重传,每发生一次超时重传,就重新进行慢启动,且阈值变为当前转发发量的一半,窗口大小变为1个报文段。
MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。
保活计时器/心跳机制
- 服务端每收到一次响应就重置保活计时器,通常为2小时。
- 若2小时已过,服务端就发一个探测报文,并且每隔75秒发送一个,当连续发送10次以后,仍没有收到对端的来信,则服务器端认为客户端出现故障,并会终止连接。
面向字节流
每建立一个连接,系统会创建一个socket,同时在内核中维护一个发送缓冲区和一个接收缓冲区。这两个缓冲区各干各的,互不干扰,读写数据自由匹配。因此也称为
全双工
。
对于发送冲区
:调用write()系统调用按照字节进行写入,如果一次写入的数据太多(>MSS),那么先把数据放在缓冲区,然后对数据进行分包发送;如果写入的太少,那么就在缓冲区中等到数据量差不多后择机而发。
对于接收冲区
:数据从网卡到达接收缓冲区,通过系统调用read()按照字节进行读取数据。
相关文章:

TCP 协议
文章目录 协议格式1面向连接:1.1三次握手(建立连接)1.2包序管理1.2四次挥手(断开连接) 2可靠传输:一。保证数据可靠有序的到达对端:确认应答机制超时重传机制 二。提高传输效率:1.提升自身发送数据量滑动窗口机制 rwnd滑动窗口丢包…...

Azure机器学习 - 在 Azure 机器学习中上传、访问和浏览数据
目录 一、环境准备二、设置内核三、下载使用的数据四、创建工作区的句柄五、将数据上传到云存储空间六、访问笔记本中的数据七、创建新版本的数据资产八、清理资源 机器学习项目的开始阶段通常涉及到探索性数据分析 (EDA)、数据预处理(清理、特征工程)以…...

新建包含cuda和cudnn的docker
背景:服务器的cudnn版本太低了,没有权限去修改。故新建包含cuda和cudnn的docker 步骤 一、拉取镜像及创建docker 拉取相关的镜像 从镜像列表选出相关版本的镜像https://gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.md …...
Opensips安装配置(以下操作均已centOS 6.3系统为准)
1. 安装依赖软件: a) Yum update //更新系统到最新 b) 安装以下所需依赖软件 gcc bison flex make openssl libmysqlclient-dev mysql-server c) 安装radiusclient: 1. wget http://pkgs.repoforge.org/radiuscli…...
第03章 用户与权限管理
第03章 用户与权限管理 1. 用户管理 1.1 登录MySQL服务器 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"-h参数后面接主机…...

赋能制造业高质量发展,释放采购数字化新活力——企企通亮相武汉2023国际智能制造创新论坛
摘要 “为应对成本上升、供应端不稳定、供应链上下游协同困难、决策无数据依据等问题,利用数字化手段降本增效、降低潜在风险十分关键。在AI等先进技术发展、供应链协同效应和降本诉求等机遇的驱动下,采购供应链数字化、协同化成为企业激烈竞争的优先选…...

洗地新天花板:CEYEE希亦顶配机皇T800 Pro洗地机多点发力上市开售
2023年11月1日,CEYEE希亦正式发布高端清洁产品无线洗地机希亦T800 PRO,创新性地实现了洗地场景深度清洁体验的新突破,彻底解决了清洁行业20多年来技术发展难题,颠覆式引领行业向水汽混动时代迈进,推动了整个市场向“智…...

如何创建一个react项目
文章目录 前言前言打开小黑窗口npm init vite后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:react.js 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&am…...

面试算法49:从根节点到叶节点的路径数字之和
题目 在一棵二叉树中所有节点都在0~9的范围之内,从根节点到叶节点的路径表示一个数字。求二叉树中所有路径表示的数字之和。例如,图8.4的二叉树有3条从根节点到叶节点的路径,它们分别表示数字395、391和302,这3个数字…...

http1,https,http2,http3总结
1.HTTP 当我们浏览网页时,地址栏中使用最多的多是https://开头的url,它与我们所学的http协议有什么区别? http协议又叫超文本传输协议,它是应用层中使用最多的协议, http与我们常说的socket有什么区别吗? …...

stable-diffusion-webui环境部署
stable-diffusion-webui环境部署 1. 环境创建2. 安装依赖库3.下载底模4. 获取lora参数文件5.运行代码6. 报错信息报错1报错2 1. 环境创建 创建虚拟环境 conda create -n env_stable python3.10.0进入虚拟环境 conda activate env_stableclone源码 git clone https://github.com…...

使用Ansible中的playbook
目录 1.Playbook的功能 2.YAML 3.YAML列表 4.YAML的字典 5.playbook执行命令 6.playbook的核心组件 7.vim 设定技巧 示例 1.Playbook的功能 playbook 是由一个或多个play组成的列表 Playboot 文件使用YAML来写的 2.YAML #简介# 是一种表达资料序列的格式,类似XML #特…...

模型应用系实习生-模型训练笔记(更新至线性回归、Ridge回归、Lasso回归、Elastic Net回归、决策树回归、梯度提升树回归和随机森林回归)
sklearn机械学习模型步骤以及模型 一、训练准备(x_train, x_test, y_train, y_test)1.1 导包1.2 数据要求1.21 导入数据1.22 数据类型查看检测以及转换1.22 划分数据 二、回归2.1 线性回归2.2 随机森林回归2.3 GradientBoostingRegressor梯度提升树回归2…...

【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计
FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。 FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域…...

【音视频 | wav】wav音频文件格式详解——包含RIFF规范、完整的各个块解析、PCM转wav代码
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

人工智能基础_机器学习012_手写梯度下降代码演示_手动写代码完成梯度下降_并实现梯度下降可视化---人工智能工作笔记0052
可以看到上面我们那个公式,现在我们用梯度下降实现一下,比如我们有一堆数据,但是没有方程的情况下,我们来看一下如果计算,对应的w值也就是seta值对吧,没有方程我们可以使用梯度下降 这里首先我们可以设置一个0.0001.我们知道梯度下降的公式, 梯度下降刚开始的时候,下降会快,然…...

Docker安装部署[8.x]版本Elasticsearch+Kibana+IK分词器
文章目录 Docker安装部署elasticsearch拉取镜像创建数据卷创建网络elasticsearch容器,启动!踩坑:虚拟机磁盘扩容 Docker安装部署Kibana拉取镜像Kibana容器,启动! 安装IK分词器安装方式一:直接从github上下载…...

折纸达珠峰高度(forwhile循环)
对折0.1mm厚度的纸张多少次,高度可达珠峰高度8848180mm。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅…...
探索网络攻防技术:自学之道
在当今数字化时代,网络攻防技术的重要性日益凸显。无论是个人用户还是企业组织,都需要具备一定的网络安全意识和基本技能来应对日益复杂的网络威胁。自学网络攻防技术成为许多人的选择,今天我们将探讨如何高效、有序地自学网络攻防技术。 如果…...

图像二值化阈值调整——cv2.threshold方法
二值化阈值调整:调整是指在进行图像二值化处理时,调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限,大于阈值的像素被设置为白色,小于等于阈值的像素被设置为黑色。 方法一: 取阈值为 127,…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...