TCP协议(建议收藏)
1. TCP特点
- 有连接:需要双方建立连接才能通信,在socket编程中服务端new ServerSocket(port)需要绑定端口,在客服端new Socket(serverIp, serverPort)与服务端建立连接
- 可靠传输:确认应答机制,超时重传机制
- 面向字节流:传输单位是字节
- 全双工:双向通信类似双行道
2. TCP的报文格式
- 源端口,目的端口:TCP的核心
- 32位序号,32位确认序号:确认应答机制中引入序号,防止后发先至的情况,32位序号针对请求数据进行编号,32位确认序号只针对ACK报文有效
- 选项:该部分可有可无,可以有以个选项也可以多个选项,选项可以是0个字节,最多40个字节
- 4位首部长度:描述TCP报头长度,单位是4字节,那就意味着报头长度最大是60字节(1111就是15*4=60)
- 保留位:现在没用,先占个位置
- 16位窗口大小:滑动窗口的大小,16位并不是说窗口最大是64kb,选项中有窗口大小的扩展因子,可以表示更大的窗口
- 16位校验和:校验发送和接收的时候数据是否一致
如果是第一次学可能会看懵掉,没关系,把下面内容看完再来看报文格式你就会很通透
3. 确认应答机制
当男生看到女生的回复后,就说明男生发的信息已经成功到达了,如果没有收到回复就可以认为上次发的数据丢失了。这就是确认应答机制,女生回复的“好的好的”就是应答报文ack。普通报文,ack为0;应答报文,ack为1
确认应答机制是TCP保证可靠性的最核心机制
当发送多条信息时可能出现下面情况:
此时女生后发的信息,男生先收到,让男生误以为女生答应了做他女朋友的请求,这是由于网络情况很复杂,很有可能“后发先至”。
解决方案就是对请求和返回的信息进行编号。
TCP是字节流协议,编号的时候,也是以字节为单位
4. 超时重传
当数据在传输过程中可能会发生丢包,因为网络环境很复杂,中间要经过很多路由器/交换机,某个交换机不但要传输我的数据还要传输别人的数据报,有很多很多数据报都要经过这个交换机,而交换机转发的能力是有上限的,很多数据报都经过该交换机,就会达到交换机的转发上限,就有可能导致有一部分数据报超时了。(类似于堵车)
当数据丢包的时候就要进行“超时重传”,丢包有两种情况一种是数据丢包,一种是应答报文丢了
- 数据丢包
当男生等了一段时间没收到女生的回应后,男生又在发了一次。这就是超时重传
第一次发生丢包时,发送方就会在达到超时时间的阈值之后,进行重传。如果重传的数据仍然没响应,就会继续重传,但是第二次超时的时间比第二次长,超时时间是逐渐变大的(假设一次丢包的概率10%,那两次都丢包的概率就是1%,说明网络情况比较差,后序在重传大概率也无法成功,不如降低传输频率,节省点主机开销)。如果重传几次后,仍然无法传输,就会尝试重置TCP连接(断开重连),如果还是连不上,就会释放连接。
- ack丢包
站在发送者的角度看,只知道没收到ACK,无法区分是发的数据丢了还是ACK丢了,因此发送者都会重传。如果是ACK丢包,发送者又重传就会导致接收方收到两份相同的数据,所以TCP会对相同的信息进行去重(根据序号进行去重)
5. 连接管理
TCP的连接是逻辑上虚拟连接,主机A和主机B建立连接,主机A的系统内核里有一个数据结构,包含了和他连接的是谁(IP,端口,使用的协议);主机B的内核的一个数据结构也记录了和他连接的谁(IP,端口,使用的协议)
5.1 三次握手
A发送syn尝试和B建立连接,主机B的内核立即返回ack接收对方的连接,内核同时也发送syn尝试和主机A建立连接,主机A返回ack接收对方的连接。建立连接的过程有四次数据交互过程,只不过主机B返回的ack和syn都是内核同时立即发送的,所以看起来就是三次的。
三次握手的意义:
- 投石问路,检查当前网络情况是否通畅,这个期间并不传输任何业务数据
- 检查通信双方发送能力和接收能力是否正常,比如我约妹子打游戏
所以握手必须握三次才能够测试完整
- 协商一些重要的参数
例如TCP的序号并不是从1开始的,通常都是建立连接的时候协商一个数字,目的是保证两次连接的序号有差别,如果连接断开又快速重连,接收方就可以区分当前收到的数据是当前连接的还是上一个连接的。
两个重要的TCP状态
- LISTEN:服务器启动,绑定端口之后(new ServerSocket完成),服务器良好,可以让客服端连接(类似手机信号良好,可以让别人打电话给我)
- ESTABLISHED:连接建立好之后的稳定状态(类似于电话拨通,可以说话了)
5.2 四次挥手
通信双方,各自向对方申请断开连接,再各自给对方回应
四次挥手在某些情况下也会变成三次:TCP的捎带应答机制,会让ACK晚点发送,有可能和FIN(结束报文端)一起发送
两个重要的TCP状态
6. 滑动窗口
在没有引入滑动窗口之前是一问一答,主机A大量的时间都消耗在等待ACK上。因此提高效率的方法就是不等ACK,直接发送下一条数据。当然这里说的不等也不是完全不等而是每次批量发送一波数据,然后再等一波ACK,再发一波数据。这里不需要等待直接发送的数据的量,就称为“窗口大小”
批量发送4条数据,批量等待4条ACK,此时窗口大小就是4000字节。注意:主机A收到一条ACK就继续发一条数据,而不是等所有的ACK都到了,才统一发下一组。
发生一整波数据如果出现丢包/乱序时怎么办?
- 响应ACK丢了
这里的1001表示小于1001的数据都收到了,2001表示小于2001的数据都收到了,所以即使返回1001这个ACK丢了,下一次返回的2001就说明1-2000的数据已经收到了,包括了第一次的数据。这就类似于别人问你现在是高几呀?你说我已经大二了。
因此ACK丢包不需要任何处理
- 数据报丢了
在上面的过程中只是把丢的包进行了重传,没丢的包,没有重传,效率比较高,因此被称为“快速重传”(搭配滑动窗口机制的超时重传)
有了快速重传,超时重传还有意义吗?
在传输数据量很多,批量传输时自然是遵守快速重传的方式,如果传输的数据很少,此时仍然是按照超时重传的方式进行。在滑动窗口中如果是最后一个包丢了就是按照超时重传的方式。
窗口越大发送的速度越快,那窗口可以无限大吗?
发送的速度快了但是接收方的处理速度跟不上就会导致接收方丢弃一部分数据,而TCP需要保证可靠性的,TCP就要重传这些数据,这就导致了恶性循环。
7. 流量控制
在滑动窗口的基础上对发送速率做出限制的机制,根据接收方的接收能力,来反向影响发送方的发送速率。
接收方的接收速率如何衡量?
接收方使用接收缓冲区的剩余空间大小,来作为发送方发送速率(窗口大小)的参考数值
主机B收到的数据,就会先放到系统内核的接收缓冲区中,所谓缓冲区就是一个内存空间(字节数组)等待B这边的应用程序,通过Socket把数据从接收缓冲区中读取走。这就类似于生产者消费者模型A是生产者,往B的接收缓冲区生产数据,B的应用程序,从缓冲区中消费数据。
接收方B收到A的数据后,就会在ACK应答报文中,把当前接收缓冲区的剩余空间大小的值,反馈给发送方。
8. 拥塞控制
流量控制是通过接收方的接收速率,接收缓冲区剩余空间大小来衡量发送方的速率。在网络中不仅要考虑接收方还要考虑中间转发节点的情况。
如何衡量中间节点的情况?
把中间设备视为一个整体,通过实验来验证发送速度多少合适。开始的时候,发的慢一点,如果网络通畅就提高速度,提高到一定程度,发生丢包了,就再降低速度;速度降低后,发现又通畅了,就再提高速度。
9. 延迟应答
基于流量控制,引入的提高效率的机制,尽量让返回的接收缓冲区空间大一些,这样滑动窗口也就大一些,效率提高了。
10. 捎带应答
基于延时应答的基础上引入的
在4次挥手中说过,在某些情况下由于捎带应答机制可以变成3次
TCP中只要把数据传输过去,对方收到之后,就会立即由内核返回一个ack报文,响应数据则是在应用程序中负责传输。由于这两操作是不同时机传输的,因此不能合并在一起,但是延时应答机制让这成为了可能。ACK原本是要立即返回的,但是由于延迟应答,稍等一会才返回,在某些情况下业务也正好在这个时候返回响应,此时就可以把这两个报文,合二为一了。
11. 面向字节流
面向字节流中存在一个典型问题“粘包问题”,举个例子
解决方案
要想解决粘包问题就要在应用层协议进行区分,只要定义应用层数据协议的时候,明确包和包之间的边界即可
1.通过分隔符,比如约定使用 ; 作为包结束的标记
2.指定包的长度,比如在数据包的开头位置声明长度
自定义应用层协议的几个典型实现,像xml,json,http这些都解决了粘包问题
12. TCP的异常处理
- 程序崩溃
进程异常退出,操作系统会回收进程资源,包括释放文件描述符表,这样的释放操作就相当于调用了对应的socket的close方法,执行close就会触发FIN结束报文,进一步进行四次挥手。
- 正常关机
关机的时候,系统会强制结束所有用户进程,和上述的进程崩溃类似。系统内核会进行文件描述符表的释放操作,进一步进行四次挥手
- 主机掉电
- 掉电的是接收方
此时发送方不知道对方挂了,继续发送数据,没有收到ACK,发送方就会触发超时重传,重传几次还没有应答就会尝试重置连接,失败后就会断开连接。
- 掉电的是发送方
接收方等了一段时间后,就会发送一个“心跳包”(心跳包是周期性触发的,只是一个简单的不携带任何业务数据的包)存在的意义就是确认一下对方是否存在,如果对方不返回心跳包就说明对方挂了,此时就放弃连接了。
- 网线断开
情况和主机掉电一样,只不过通信双方主机是正常的,通信双方各自按照上述的两种情况进行
13. 常见面试题
如何将UDP实现为可靠传输?
基于UDP的应用层实现确认应答机制,引入序列号,超时重传机制。
相关文章:

TCP协议(建议收藏)
1. TCP特点 有连接:需要双方建立连接才能通信,在socket编程中服务端new ServerSocket(port)需要绑定端口,在客服端new Socket(serverIp, serverPort)与服务端建立连接可靠传输:确认应答机制,超时重传机制面向字节流&a…...

Interactive Analysis of CNN Robustness
Interactive Analysis of CNN Robustness----《CNN鲁棒性的交互分析》 摘要 虽然卷积神经网络(CNN)作为图像相关任务的最先进模型被广泛采用,但它们的预测往往对小的输入扰动高度敏感,而人类视觉对此具有鲁棒性。本文介绍了 Pert…...
Java,多线程,线程的通信机制
线程间通信的理解: 当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律地执行,那么多线程之间需要一些通信机制。可以协调它们的工作,以此实现多线程共同操作一份数据。 关于线程间的通信,以下代码为例&am…...

ArcGIS进阶:栅格计算器里的Con函数使用方法
本实验操作为水土保持功能重要性评价: 所用到的数据包括:土地利用类型数据(矢量)、植被覆盖度数据(矢量)和地形坡度数据(栅格)。 由于实验数据较少,其思路也较为简单&a…...

小程序多文件上传 Tdesign
众所周知,小程序文件上传还是有点麻烦的,其实主要还是小程序对的接口有诸多的不便,比如说,文件不能批量提交,只能一个个的提交,小程序的上传需要专门的接口。 普通的小程序的页面也比普通的HTML复杂很多 现…...
Java多线程锁
AQS 互斥锁,悲观锁 public class Demo1 {// 从0累加到1000 悲观锁static Integer num 0;public static void main(String[] args) {for (int i 0; i < 3; i) {Thread t new Thread(() -> {while (num < 1000) {synchronized (num.getClass()) {if (nu…...
【Docker】Web应用通过jar打包成WAR文件
把当前目录下的所有文件打包成game.war jar -cvfM0 game.war ./ -c 创建war包 -v 显示过程信息 -f -M -0 这个是阿拉伯数字,只打包不压缩的意思 解压game.war jar -xvf game.war 解压到当前目录 环境 RedHat Linux 9 VWWare 8.0 SSH 3.2.9 Putty 0.62 问题…...
Elasticsearch 外部词库文件更新
本文所使用的ES集群环境可在历史文章中获取,采用docker部署的方式。 Elasticsearch 是一个功能强大的搜索引擎,广泛用于构建复杂的全文搜索应用程序。在许多情况下,为了提高搜索引擎的性能和精度,我们可以使用外部词库来定制和扩展…...

OpenTiny Vue 组件库支持 Vue2.7 啦!
之前 OpenTiny 发布了一篇 Vue2 升级 Vue3 的文章。 🖖少年,该升级 Vue3 了! 里面提到使用了 ElementUI 的 Vue2 项目,可以通过 TinyVue 和 gogocode 快速升级到 Vue3 项目。 有朋友评论替换button出错了,并且贴出了…...
蒙特卡罗算法
介绍 蒙特卡罗算法是一种基于随机采样的数值计算方法,常用于解决复杂问题和优化求解。它的核心思想是通过生成大量的随机样本,利用概率统计的方法来估计问题的解或者优化目标的最优值。 蒙特卡罗算法的具体步骤如下: 1. 定义问题:…...

python爬虫hook定位技巧、反调试技巧、常用辅助工具
一、浏览器调试面板介绍 二、hook定位、反调试 Hook 是一种钩子技术,在系统没有调用函数之前,钩子程序就先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,也可以强制结束消息的传递。简单…...

Jmeter —— jmeter参数化实现
jmeter参数化 在实际的测试工作中,我们经常需要对多组不同的输入数据,进行同样的测试操作步骤,以验证我们的软件的功能。这种测试方式在业界称为数据驱动测试, 而在实际测试工作中,测试工具中实现不同数据输入的过…...
Day57_《MySQL索引与性能优化》摘要
一、资料 视频:《尚硅谷MySQL数据库高级,mysql优化,数据库优化》—周阳 其他博主的完整笔记:MySQL 我的笔记:我的笔记只总结了视频p14-p46部分,因为只有这部分是讲解了MySQL的索引与explain语句分析优化…...

蓝桥杯每日一题2023.11.11
题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 对于此题首先想到的是暴力分析,使用前缀和,这样方便算出每一区间的大小,枚举长度和其实位置,循环计算出所有区间的和进行判断,输出答案。 非满分暴力写法&#…...

『Linux升级路』基础开发工具——vim篇
🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、vim的基本概念 📒1.1命令模式 📒1.2插入模式 &…...

【Excel】补全单元格值变成固定长度
我们知道股票代码都为6位数字,但深圳中小板代码前面以0开头,数字格式时前面的0会自动省略,现在需要在Excel表格补全它。如下图: 这时我们需要用到特殊的函数:TEXT或者RIGHT TEXT函数是Excel中一个非常有用的函数。TEX…...

HackTheBox-Starting Point--Tier 2---Base
文章目录 一 题目二 过程记录2.1 打点2.2 权限获取2.3 横向移动2.4 权限提升 一 题目 Tags Web、Vulnerability Assessment、Custom Applications、Source Code Analysis、Authentication、Apache、PHP、Reconnaissance、Web Site Structure Discovery、SUDO Exploitation、Au…...

算法导论笔记4:散列数 hash
一 了解一些散列的基本概念,仅从文字角度,整理了最基础的定义。 发现一本书,《算法图解》,微信读书APP可读,有图,并且是科普性质的读物,用的比喻很生活化,可以与《算法导论》合并起…...

知识蒸馏概述及开源项目推荐
文章目录 1.介绍2.知识2.1 基于响应的知识(response-based)2.2 基于特征的知识(feature-based)2.3 基于关系的知识(relation-based) 3.蒸馏机制3.1 离线蒸馏3.2 在线蒸馏3.3 自蒸馏 4.教师-学生架构5.蒸馏算法5.1 对抗性蒸馏(Adversarial Dis…...

jupyter notebook中markdown改变图像大小
文章目录 🕮原始图像🕮改变图像大小🕮使图像靠左 在 jupyter notebook中,导入的图片过大,想要改变图像的大小 🕮原始图像 🕮改变图像大小 复制小括号里面的内容到src后面,满足<…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...