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后面,满足<…...
Qwen3-14B镜像免配置部署教程:Python 3.10+PyTorch 2.4开箱即用指南
Qwen3-14B镜像免配置部署教程:Python 3.10PyTorch 2.4开箱即用指南 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是一款专为RTX 4090D 24GB显存显卡优化的开箱即用解决方案。这个镜像最大的特点就是"零配置"——所有环境依赖、模型权重、优化组件都已预…...
AI基础设施运维黑盒曝光:实时监控127个关键指标、自动定位集群间token吞吐偏差>15%的根因分析流程
第一章:AI基础设施运维黑盒曝光:实时监控127个关键指标、自动定位集群间token吞吐偏差>15%的根因分析流程 2026奇点智能技术大会(https://ml-summit.org) 现代大模型推理集群已演变为多租户、跨地域、异构加速卡混合部署的复杂系统,传统…...
Jetson 启动视觉定制全攻略:从cboot到桌面背景的深度修改
1. Jetson视觉定制全景概览 当你拿到一台崭新的Jetson设备,第一眼看到的往往是那个熟悉的绿色NVIDIA logo。但对于产品开发者来说,这个默认界面就像穿着别人的工作服上班——专业但缺乏品牌个性。我经手过十几个基于Jetson的机器人项目,每次客…...
hadoop+Spark+django基于大数据技术的网络小说推荐系统(源码+文档+调试+可视化大屏)
前言随着计算机技术的发展和普及,采用信息化管理技术取代人工管理是现在管理的主流方式。一些行业依然还是以人工记录为主,office软件为辅,来完成一些简单的数据录入和查询工作。可面对大量的数据信息就很难实现数据共享,数据的重…...
SwiftUI DatePicker实战:打造一个旅行计划App(含完整代码)
SwiftUI DatePicker实战:构建旅行计划App的进阶技巧 每次规划旅行时,最让人头疼的莫过于安排行程日期。作为iOS开发者,我们可以用SwiftUI的DatePicker组件为用户打造流畅的日期选择体验。不同于基础教程,本文将带你深入实战&…...
Gemini-CLI 从零到精通的命令行AI开发指南
1. 认识Gemini-CLI:你的命令行AI助手 第一次听说Gemini-CLI时,我也觉得这不过又是一个AI玩具。直到在本地终端里用它5分钟写完一个Python爬虫脚本,才意识到这个命令行工具的强大。简单来说,Gemini-CLI就像把Google最先进的AI模型…...
轻松下载网页视频:VideoDownloadHelper浏览器扩展完全指南
轻松下载网页视频:VideoDownloadHelper浏览器扩展完全指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法保存网页视频…...
SpringBoot + ShardingSphere实战:如何优雅地处理千万级订单表分库分表?
SpringBoot与ShardingSphere深度整合:千万级订单系统的分库分表实战指南 电商平台的订单系统往往是最先遭遇性能瓶颈的模块。当单表数据突破5000万条时,即使是最优化的SQL查询也会变得举步维艰。我曾参与过一个日订单量超30万的电商平台改造项目…...
系统流程图绘制技巧与Visio实战指南
1. 系统流程图基础与Visio入门 第一次接触系统流程图时,我也被那些奇怪的符号搞得一头雾水。直到接手一个库存管理系统项目,才真正理解这些图形背后的逻辑。系统流程图就像建筑师的蓝图,用标准化符号展示数据在系统中的流动路径。Visio作为流…...
通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI开发实战:Java八股文智能复习与面试模拟
通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI开发实战:Java八股文智能复习与面试模拟 1. 引言:当Java面试准备遇上AI助手 如果你正在准备Java面试,大概率对“八股文”这个词又爱又恨。爱的是,它确实划定了复习范围;恨的是…...
