传输层 TCP 协议深度解析:从可靠性机制到实战要点

Linux 网络深度剖析:传输层协议 UDP/TCP 原理详解 摘要:传输层协议是网络通信的核心环节,UDP和TCP作为两种主要协议各有特点。UDP采用无连接方式,协议简单高效但不可靠,适用于实时性要求高的场景;TCP通过三次握手建立可靠连接,提供有序、无丢失的数据传输,但开销较大。在Linux系统中,可通过调整内核参数对两种协议进行优化,如UDP的内存管理和TCP的窗口设置。实际应用中需要根据业务需求选择合适的协议,并通过工具监控网络状态,以获得最佳性能表现。 阅读详情

        TCP(传输控制协议)是互联网的基石,以 “可靠、面向连接” 的特性支撑着 HTTP、HTTPS、SSH 等核心应用。它的设计充满了对 “可靠性” 与 “性能” 的平衡智慧 —— 既要保证数据不丢失、不重复、按序到达,又要尽可能提升传输效率。本文将从 TCP 协议格式入手,逐一拆解确认应答、超时重传、连接管理、滑动窗口等核心机制,最后对比 TCP 与 UDP 的差异,帮你彻底理解 TCP 的工作原理与实战应用。

一、TCP 协议基础:首部格式与核心字段

TCP 协议通过 “首部 + 数据” 的形式传输数据,首部包含了控制数据传输的关键信息,理解这些字段是掌握 TCP 机制的前提。

1.1 TCP 首部格式(20 字节基础版)

TCP 首部最小长度为 20 字节(不含选项字段),结构如下(按 32 位对齐):

字段(位宽)含义核心作用
源端口号(16)发送端应用程序端口标识数据来源进程
目的端口号(16)接收端应用程序端口标识数据目标进程
序列号(32)数据字节的编号保证数据按序到达,去重
确认序号(32)期望接收的下一字节编号确认已收到的数据,触发发送方后续传输
首部长度(4)TCP 首部的 32 位字个数计算首部总长度(如值为 5 表示 20 字节)
保留位(6)预留未来扩展固定为 0
标志位(6)控制连接与数据传输URG(紧急数据)、ACK(确认有效)、PSH(立即读走数据)、RST(重置连接)、SYN(请求连接)、FIN(关闭连接)
窗口大小(16)接收端可用缓冲区大小实现流量控制,告诉发送方可发送的最大字节数
检验和(16)校验首部与数据完整性接收端校验失败则丢弃数据
紧急指针(16)紧急数据的偏移量配合 URG 使用,标识紧急数据范围

1.2 关键字段解读

        序列号(Seq):TCP 将每个字节的数据都编号,例如发送 1000 字节数据,序列号为 1,则数据字节编号为 1~1000,后续数据从 1001 开始。

        确认序号(Ack):总是等于 “已收到的最大字节编号 + 1”。例如接收方收到 1~1000 字节,确认序号为 1001,告诉发送方 “下次从 1001 开始发”。

        标志位:最常用的是 SYN(建立连接)、ACK(确认)、FIN(关闭连接),三次握手和四次挥手的核心就是这些标志位的交互。

        窗口大小:接收端通过该字段告知发送方 “我还能接收多少字节”,是流量控制的核心字段。

二、TCP 可靠性机制:如何保证数据不丢、不重、有序

TCP 的 “可靠性” 是其核心价值,通过一系列机制实现,包括确认应答、超时重传、序列号去重等,这些机制共同构成了 TCP 可靠传输的基石。

2.1 确认应答(ACK)机制

确认应答是 TCP 可靠性的基础,原理类似 “签收快递”—— 接收方收到数据后,必须向发送方返回 “确认报文”,告知已收到的数据范围。

工作流程
  1. 发送方发送数据段(如序号 1~1000);
  2. 接收方收到后,返回 ACK 报文,确认序号为 1001(表示 “已收到 1~1000,下次等 1001 开始的数据”);
  3. 发送方收到 ACK 后,继续发送 1001~2000 的数据,以此类推。
示例
发送方(A)          接收方(B)
  |                    |
  | 数据(1~1000,Seq=1) |
  |--------------------->|
  |                    |
  |        ACK(Ack=1001) |
  |<---------------------|
  |                    |
  | 数据(1001~2000,Seq=1001) |
  |--------------------->|

2.2 超时重传机制

若数据或 ACK 因网络故障丢失,发送方会在 “超时时间” 后重传数据,确保数据最终到达。

核心逻辑
  1. 发送方发送数据后,启动 “超时定时器”;
  2. 若在定时器到期前收到 ACK,关闭定时器;
  3. 若超时未收到 ACK,重传数据,并调整超时时间(指数退避):
    • 首次超时:等待 500ms 重传;
    • 若仍超时:等待 1000ms(2×500)重传;
    • 再次超时:等待 2000ms(4×500),以此类推,直到重传次数上限(通常为 10 次),则关闭连接。
去重机制

接收方通过 “序列号” 识别重复数据 —— 若收到的数据序列号已在 “已接收范围” 内,则直接丢弃,不交给应用层,避免重复处理。

2.3 滑动窗口机制:提升传输效率的 “大杀器”

确认应答机制若 “一发一收”(发送 1 段数据→等 ACK→再发下一段),会浪费大量时间(尤其是网络延迟高时)。滑动窗口机制通过 “一次发送多段数据”,将等待时间重叠,大幅提升效率。

核心原理

        窗口:发送方无需等待 ACK 即可连续发送的数据范围,大小由 “接收方窗口大小” 和 “拥塞窗口大小” 中的最小值决定(后续会讲拥塞窗口)。

        滑动:每收到一个 ACK,窗口向 “已确认数据” 的后方滑动,继续发送新数据。

示例(窗口大小 = 4 段数据,每段 1000 字节)
发送方窗口:[1~4000](可连续发送4段数据:1~1000、1001~2000、2001~3000、3001~4000)
1. 发送方一次性发送4段数据,无需等待ACK;
2. 接收方收到1~1000,返回ACK=1001;
3. 发送方窗口滑动为[1001~5000],继续发送4001~5000;
4. 后续每收到一个ACK,窗口持续滑动,直到所有数据发送完成。
丢包处理(快重传)

滑动窗口中若某段数据丢失,接收方会重复返回 “丢失数据的确认序号”,触发发送方 “快重传”:

        例如:发送方发送 1~1000、1001~2000、2001~3000,其中 1001~2000 丢失;

        接收方收到 1~1000,返回 ACK=1001;收到 2001~3000,仍返回 ACK=1001(表示 “我还在等 1001”);

        若发送方连续收到 3 次相同的 ACK=1001,立即重传 1001~2000,无需等待超时(快重传)。

三、TCP 连接管理:三次握手与四次挥手

TCP 是 “面向连接” 的协议,通信前必须通过 “三次握手” 建立连接,通信结束后通过 “四次挥手” 关闭连接,这两个过程是 TCP 连接管理的核心。

3.1 三次握手:建立可靠连接

三次握手的目标是 “确认双方的发送和接收能力正常”,并协商初始序列号。

流程(客户端 C→服务器 S)
  1. 第一次握手(C→S):客户端发送 SYN 报文(标志位 SYN=1),携带初始序列号(如 Seq=100);客户端进入SYN_SENT状态。
  2. 第二次握手(S→C):服务器收到 SYN 后,返回 SYN+ACK 报文(SYN=1,ACK=1),携带服务器的初始序列号(如 Seq=200)和确认序号(Ack=101,即客户端 Seq+1);服务器进入SYN_RCVD状态。
  3. 第三次握手(C→S):客户端收到 SYN+ACK 后,返回 ACK 报文(ACK=1),携带确认序号(Ack=201,即服务器 Seq+1);客户端进入ESTABLISHED状态;服务器收到 ACK 后也进入ESTABLISHED状态,连接建立完成。
为什么需要三次握手?

        核心是 “防止历史无效连接干扰当前连接”。例如:客户端发送的 “过期 SYN 报文”(因网络延迟滞留)到达服务器,服务器若直接建立连接(两次握手),会浪费资源;三次握手时,客户端会识别出 “过期 ACK”,不发送第三次握手,服务器超时后释放连接。

3.2 四次挥手:关闭连接(全双工的体现)

TCP 连接是 “全双工”(双方可同时发送数据),因此关闭连接需双方分别确认 “我已无数据发送”,即四次挥手。

流程(客户端主动关闭)
  1. 第一次挥手(C→S):客户端调用close(),发送 FIN 报文(FIN=1),表示 “我已无数据发送”;客户端进入FIN_WAIT_1状态。
  2. 第二次挥手(S→C):服务器收到 FIN 后,返回 ACK 报文(ACK=1),确认序号为 “客户端 Seq+1”;服务器进入CLOSE_WAIT状态(此时服务器仍可向客户端发送数据);客户端收到 ACK 后进入FIN_WAIT_2状态。
  3. 第三次挥手(S→C):服务器处理完剩余数据后,调用close(),发送 FIN 报文(FIN=1),表示 “我也无数据发送”;服务器进入LAST_ACK状态。
  4. 第四次挥手(C→S):客户端收到 FIN 后,返回 ACK 报文(ACK=1),确认序号为 “服务器 Seq+1”;客户端进入TIME_WAIT状态;服务器收到 ACK 后进入CLOSED状态;客户端等待 2MSL(报文最大生存时间,通常 1 分钟)后,也进入CLOSED状态,连接彻底关闭。
关键状态解读

        TIME_WAIT:客户端主动关闭后需等待 2MSL,确保:

                最后一个 ACK 被服务器收到(若丢失,服务器会重发 FIN,客户端可再次发送 ACK);

                        避免历史报文干扰新连接(2MSL 内,网络中残留的报文会过期)。

        CLOSE_WAIT:服务器若长时间处于该状态,通常是 “未调用close()关闭 Socket”,属于代码 BUG(需检查是否漏写关闭逻辑)。        

四、TCP 性能优化:流量控制与拥塞控制

        TCP 不仅要保证可靠性,还要兼顾性能 —— 避免接收方处理不过来(流量控制),也避免给网络造成压力(拥塞控制),这两个机制是 TCP 高效传输的关键。

4.1 流量控制:根据接收方能力调整发送速度

流量控制的目标是 “不让发送方发得太快,导致接收方缓冲区溢出”,通过 “窗口大小” 字段实现。

工作流程
  1. 接收方在 ACK 报文中,将 “当前可用缓冲区大小” 填入 “窗口大小” 字段;
  2. 发送方的发送窗口大小 = 接收方窗口大小(若为 0,发送方停止发送,仅定期发送 “窗口探测包”);
  3. 接收方处理数据后,缓冲区空闲空间增加,会通过 ACK 报文更新 “窗口大小”,通知发送方继续发送。
示例
接收方缓冲区大小=1000字节,已用500字节:
1. 接收方向发送方返回ACK,窗口大小=500;
2. 发送方最多发送500字节;
3. 接收方处理完500字节,缓冲区空闲=1000,返回ACK,窗口大小=1000;
4. 发送方窗口扩大到1000,可继续发送更多数据。

4.2 拥塞控制:根据网络状态调整发送速度

拥塞控制的目标是 “不让发送方发得太快,导致网络拥堵”,通过 “拥塞窗口(cwnd)” 和 “慢启动阈值(ssthresh)” 实现。

核心机制
  1. 慢启动:连接初始时,cwnd=1(仅发送 1 段数据),每收到一个 ACK,cwnd 翻倍(指数增长),直到 cwnd 达到 ssthresh(初始为窗口最大值);
  2. 拥塞避免:cwnd 超过 ssthresh 后,不再指数增长,而是每轮次 + 1(线性增长),避免网络突然拥堵;
  3. 拥塞处理:
    • 若超时重传(严重拥塞):ssthresh = 当前 cwnd/2,cwnd 重置为 1,重新慢启动;
    • 若快重传(轻微丢包):仅重传丢失数据,cwnd 和 ssthresh 调整更平缓,避免性能大幅下降。
示例(ssthresh 初始 = 16)

plaintext

1. 慢启动阶段:cwnd=1→2→4→8→16(达到ssthresh);
2. 拥塞避免阶段:cwnd=17→18→19...(每轮次+1);
3. 若超时重传:ssthresh=8,cwnd=1,重新慢启动。

五、TCP 实战要点:粘包问题与异常处理

在实际开发中,TCP 的 “面向字节流” 特性会导致粘包问题,同时需处理连接异常,这些是 TCP 编程的常见坑点。

5.1 粘包问题:为什么会出现 “数据粘在一起”?

TCP 是 “面向字节流” 的协议,内核会将应用层数据缓存到发送 / 接收缓冲区,可能合并小数据或拆分大数据,导致应用层收到 “粘在一起” 的数据(粘包)。

粘包原因

        发送方:小数据合并发送(如连续调用write(10字节)两次,内核可能合并为 20 字节发送);

        接收方:缓冲区数据未及时读取,后续数据写入后,应用层一次读取到多段数据。

解决方案:明确数据边界

粘包的本质是 “应用层无法识别数据边界”,需在应用层协议中定义边界,常见方案:

  1. 定长包:约定每个数据包固定长度(如每次发送 100 字节,不足补 0),接收方每次读取固定长度;
  2. 长度前缀:数据包开头添加 “数据长度” 字段(如 4 字节整数),接收方先读长度,再读对应字节数;
  3. 分隔符:用特殊字符(如\r\n)分隔数据包,接收方按分隔符拆分数据(如 HTTP 协议的\r\n\r\n)。

5.2 TCP 异常处理

实际网络中可能出现进程终止、机器掉电、网线断开等异常,TCP 需通过内置机制或应用层逻辑处理:

        进程终止:进程终止会释放 Socket,发送 FIN 报文,等同于正常关闭;

        机器掉电 / 网线断开:TCP 内置 “保活定时器”(默认 2 小时),定期发送探测包,若对方无响应,关闭连接;

        应用层保活:若 TCP 保活时间太长,可在应用层实现心跳机制(如每隔 30 秒发送 “心跳包”),检测连接状态。

六、TCP vs UDP:如何选择传输层协议?

TCP 与 UDP 各有优劣,选择的核心是 “业务优先级”—— 可靠性优先选 TCP,效率 / 实时性优先选 UDP。

维度TCPUDP
连接性面向连接(三次握手)无连接
可靠性可靠(确认、重传、去重)不可靠(无确认、无重传)
数据边界面向字节流(需应用层处理粘包)面向数据报(无粘包,一次收发完整数据报)
效率较低(首部大、机制复杂)较高(首部小、无额外机制)
适用场景文件传输(HTTP/FTP)、登录认证、支付(需可靠性)实时通信(语音 / 视频)、广播 / 组播、DNS(需低延迟)
经典面试题:用 UDP 实现可靠传输?

参考 TCP 的可靠性机制,在应用层实现:

  1. 引入序列号,保证数据按序到达;
  2. 实现确认应答(ACK),确保数据被接收;
  3. 超时重传,丢失数据后重新发送;
  4. 流量控制(基于接收方窗口)和拥塞控制(基于网络状态)。

七、总结:TCP 的核心价值与应用场景

TCP 是一个 “复杂但强大” 的协议,通过确认应答、超时重传、滑动窗口、流量控制、拥塞控制等机制,在可靠性和性能之间取得了极佳的平衡。它支撑了互联网中绝大多数需要可靠传输的场景,如网页浏览(HTTP)、文件传输(FTP)、远程登录(SSH)等。

核心收获

  1. 可靠性机制:确认应答是基础,超时重传和序列号去重是补充,滑动窗口提升效率;
  2. 连接管理:三次握手建立连接(确认双方能力),四次挥手关闭连接(全双工特性);
  3. 性能优化:流量控制(照顾接收方),拥塞控制(照顾网络);
  4. 实战要点:粘包问题需定义应用层边界,异常处理需依赖 TCP 保活或应用层心跳。
【网络协议】【TCP】精讲TCP序列号和确认号!图解超赞超详细!!! 这里我们可以看到,服务端发的包,序列号一直是1,因为当前服务端只是接收数据,并没有发送数据,所以服务端的序列号一直是1,而客户端的确认号也一直是1,表示期待服务端发送第一个字节过来。:确认号通常是接收方期望接收的下一个字节的序列号。上一次发送时为【5】,【5】中seq为1,但【5】为ACK数据包,所以数据长度为0且不会驱使seq加1,所以这一次的seq为1(1+0)。在TCP通信中,接收方会向发送方发送一个确认数据包,其中包含了确认号,表示接收到的数据包中的最后一个字节的下一个字节的序列号。 阅读详情

相关推荐

TCP与UDP协议:你应该知道的传输层协议

在互联网通信的宏伟架构中,传输控制协议(TCP, Transmission Control Protocol)与用户数据报协议(UDP, User Datagram Protocol)如同两颗璀璨的星辰,各自扮演着不可或缺的角色。它们作为传输层的两大支柱,奠定了现代互联网通信的基础。本文旨在深入剖析TCP与UDP的机制、特点、应用场景及其相互之间的差异,为读者构建一个全面而深入的理解框架。讨论TCP与UDP之前,有必要先回顾一下互联网协议栈——OSI七层模型或更为常用的TCP/IP四层模型。

Programming Talk 1520

深入解析 TCP:可靠传输的基石

你有没有想过,当你刷微博、看视频、玩游戏时,数据是如何稳定地从服务器传输到你的设备上的?这背后有个关键角色——!

m0_53518956的博客 829

【技术解析】华为智算中心:昇腾AI算力与无损网络如何驱动大模型训练

本文深入解析了华为智算中心如何通过昇腾AI算力与超融合以太无损网络的协同,驱动千亿参数大模型的高效训练。昇腾NPU提供专用计算引擎,而基于RoCE的无损网络则通过PFC、ECN等技术确保万卡集群间的高带宽、零丢包通信,实现算力利用率最大化,解决大规模AI训练的核心瓶颈。

weixin_29311017的博客 191

用大白话来讲清楚--《传输层协议UDP与TCP核心要点》

传输层协议对比:UDP与TCP的核心差异与应用场景 传输层负责端到端通信,主要通过UDP和TCP两大协议实现。UDP是无连接的"快递小哥",提供简单快速但不可靠的数据传输,适用于视频直播、在线游戏等实时性要求高的场景。TCP则是可靠的"大管家",通过确认应答、超时重传、连接管理和流量控制四大机制确保数据准确送达,并利用滑动窗口、拥塞控制和快速重传三大机制提升性能,适用于网页浏览、文件传输等需要可靠传输的场景。 选择依据取决于需求:追求速度选UDP,要求可靠选TCP。有

weixin_47151388的博客 511

无源定位入门(二):FDOA(2)信号模型和原理

信号模型 假设地面固定目标信号源位置为 ,有M架飞机随机分布在空中,并作匀速直线运动。时刻t的时候第i架飞机的位置为,飞行速率为 , 假设目标的信号中心频率为 ,电磁波的传播速度为 ,则此时每个飞机接收目标信号的频率为 以第1架飞机为参考基站,目标信号到达第n架飞机和参考基站之间的FDOA 测量值可表示为 ...

syy_1797的博客 5956

华为P30/pro (ELE-AL00) 鸿蒙4.2降级 EMUI 9

分享

m0_52356707的博客 1万+

《计算机网络》深入学:传输控制协议 (TCP)

TCP 协议是计算机网络的基石,它通过复杂的算法在混乱的网络中构建了秩序。从简单的握手到复杂的 BBR 拥塞控制,TCP 的演进史就是一部人类与网络不确定性抗争的历史。虽然 TCP 极其成功,但其设计也有局限性。例如,TCP 的队头阻塞 (Head-of-Line Blocking)问题——一个包丢失会导致后续所有包被阻塞,这限制了 HTTP/2 等多路复用协议的性能。为此,新一代的传输层协议如QUIC(基于 UDP 构建,被 HTTP/3 采用) 正在崛起。

计算机科学、人工智能、数据分析和大数据方向的研发和教学。 878

HPC软件使用之ANSYS Fluent

本文介绍了如何在超级计算机上使用ANSYS Fluent进行科学计算和工程仿真。文章首先对Fluent软件进行了简要介绍,强调了其在计算流体力学领域的广泛应用和强大功能。接着,详细说明了如何编写jou脚本文件和slurm脚本文件,以控制Fluent的计算流程和作业提交。文章还提供了作业提交和查看的具体命令,并通过一个鼓风机仿真的案例演示了从网格模型准备、脚本编写、作业提交到结果查看的完整流程。最后,展示了使用Fluent进行结果可视化的方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 2208

深入理解TCP:序列号、确认号和自动ACK的艺术

TCP的设计精妙绝伦,它通过序列号和确认号的使用,加上自动ACK报文的发送机制,提供了一种在不可靠的网络环境中可靠传输数据的方法。这些机制的自动化和对应用层的透明性,使得开发者可以在构建网络应用时,将注意力集中在应用逻辑上,而不是底层的传输细节。正是这种设计,使TCP成为了互联网数据传输的基石之一。

波波诸葛伟 924

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单)

本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。

silver的专栏 618

UG\NX二次开发 获取三平面交点

//如果返回值不为0 则此三个面没交点 int three_faces_point(tag_t tagFace1, tag_t tagFace2, tag_t tagFace3, double *dou_x, double *dou_y, double *dou_z)

王牌飞行员_里海的博客 674

【网络】TCP 协议深度解析:从连接建立到可靠性机制

本文系统介绍了TCP协议的核心特性和工作机制。TCP作为传输层核心协议,通过三次握手建立可靠连接、四次挥手优雅断开连接。其首部格式包含端口号、序号、确认号等关键字段,支持连接管理、流量控制和拥塞控制。TCP通过确认应答、超时重传、滑动窗口等机制确保数据可靠传输,同时采用延迟应答、捎带应答优化性能。TIME_WAIT和CLOSE_WAIT状态处理连接关闭问题,而字节流特性导致的粘包问题可通过定义数据边界解决。TCP为HTTP、FTP等应用层协议提供可靠传输基础。

CodeByV的博客 2664

华为OD机试 - 直捣黄龙 - 广度优先搜索BFS(Python/JS/C/C++ 新系统 200分)

从样例 1 可知:5 / 2,2 -> 输出 2 9如果按“移动步数”计算应该是 8,但题目输出是 9,说明这里的“路径长度”统计的是 路径上经过的节点数量。最短路径条数:ways[end]路径长度:dist[end] + 1。

学Java,找哪吒 125

TCP 与 UDP 深度解析:从原理到实战,一文看懂传输层两大协议的核心区别

在开始对比前,我们需要先明确二者的本质定位 —— 它们都是运行在传输层TCP(Transmission Control Protocol,传输控制协议):面向连接、可靠、有序的字节流协议。它像 “挂号信”,会在通信前建立连接,通信中确保数据不丢失、不重复、按序到达,通信后优雅释放连接,适合对可靠性要求高的场景。UDP(User Datagram Protocol,用户数据报协议):无连接、不可靠、无序的数据包协议。

AC的博客 4334

镜头像差之五——场曲

什么是场曲? 场曲[curvature of field] 物面上所有的点经过系统后,最佳焦点位置不在同一平面上,若这些像点所成的面为曲面,则称为系统有场曲。 与物高二次方、入射光瞳口径一次方成正比的像差。若仅存在场曲,则所有物平面上的点都有相应的像点,但分布在一个球面上;若采用弯成此种形状的底片,则可获得处处清晰的像。此时在理想像平面上,像点呈现为圆斑。 第一张图是最简单也是最容易理解的场曲,也就是对焦点锐利,其余部分逐渐松散,但实际上大多现代镜头的场曲都呈现为图二的形态:对焦点与边缘锐度.

camerall 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux网络】深入TCP 协议(一):从报头结构到可靠性机制

本文深入解析TCP协议的核心机制,重点关注其在Linux系统中的实现:首先介绍了TCP在网络分层中的传输层定位,强调数据发送本质是内核缓冲区的拷贝与调度;详细剖析TCP报头结构,包括32位序号/确认序号、4位首部长度(以4字节为单位)等关键字段,并解读了Linux内核中struct tcphdr的实现;重点阐述了TCP可靠性的两大基石——确认应答(ACK)和动态计算超时重传(RTO)机制,通过序列号、累积确认和自适应超时来保障可靠传输。文章还对比了TCP与UDP报头的差异,揭示了TCP如何在不可靠IP网络上

心向往之,行必能至 5797

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TCP协议深度解析:从基础到实战

TCP协议是网络通信的基石,其可靠性和效率在各种应用场景中得到了广泛验证。通过深入理解TCP的工作原理、可靠性机制、流量控制与拥塞控制,我们能够更好地设计和优化网络应用,提升用户体验。希望本文能帮助你更全面地掌握TCP协议,并在实际开发中灵活应用。

xycxycooo的博客 2141

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

计算机网络—TCP协议详解:协议构成、深度解析(1)

本文是总结了对于计算机网络中常见的TCP协议的组成,本文主要是在于介绍TCP协议段的格式,对于TCP协议的每一个部分构成都做了详细的介绍~(˶‾᷄ꈊ‾᷅˵)~

B1ue还在专注 8802

TCP与UDP:传输层协议深度解析

目录一. UDP 协议1.1 UDP协议端格式1.2 UDP的特点1.3 基于UDP的应用层协议二. TCP协议2.1 TCP协议端格式2.2 TCP核心机制2.2.1 核心机制1:确认应答2.2.2 核心机制2:超时重传2.2.3 核心机制3:连接管理2.2.4 核心机制4:滑动窗口2.2.5 核心机制5:流量控制2.2.6 核心机制6:拥塞控制2.2.7 核心机制7:延时应答2.2.8 核心机制8:捎带应答2.2.9 核心机制9:面向字节流2.2.10 核心机制10:异常处理 总结:适用场景UDP和TC

2401_89176842的博客 954

TCP 协议深度解析:从原理到实战优化

TCP 协议作为互联网的基石,其设计思想和实现机制蕴含着计算机网络的核心智慧。从三次握手的状态机设计到滑动窗口的流量控制,从拥塞控制的自适应算法到网络异常的恢复机制,每一个细节都体现着工程实践中的权衡与优化。在实际应用中,只有深入理解 TCP 协议的工作原理,结合具体业务场景进行参数调优和问题排查,才能充分发挥网络性能,构建稳定高效的网络应用。​

XDLYSJ的博客 2098

【linux网络(四)】传输层协议详解(上)

传输层协议: TCP和UDP协议详解

杭电码农-NEO的博客 1908

TCP与UDP协议深度解析:从理论到工程实践

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的协议。它在传输数据前,需要先建立连接,数据传输过程中保证数据的顺序和完整性,传输完成后需要关闭连接。由于其可靠性高,TCP广泛用于HTTP、FTP、SMTP等协议中。面向连接:在发送数据之前,发送方与接收方需要先建立连接。可靠传输:保证数据的完整性,通过重传机制确保数据不会丢失。流量控制:通过滑动窗口机制,控制数据的发送速度,避免接收方的缓存溢出。拥塞控制:避免网络拥塞,提高网络利用率。

和舒貌的博客 1432

【计算机网络-传输层】传输层协议-TCP核心机制与可靠性保障

本文全面剖析TCP协议的核心机制,深入探讨其如何保障网络通信的可靠性。从协议段格式、确认应答、超时重传、连接管理(三次握手与四次挥手)等基础原理出发,详解流量控制、滑动窗口、拥塞控制等性能优化策略。同时解析粘包问题、延迟应答、捎带应答等实际场景中的关键技术,并通过对比TCP与UDP的差异,阐明两者的适用场景。文章结合代码示例与网络状态分析,揭示TCP异常处理与资源管理的底层逻辑,为理解高效可靠的数据传输提供系统性视角。无论是网络初学者还是开发者,均可从中获得理论与实践的深度洞见。

2303_77756141的博客 1202

TCP协议深度解析:格式、应答机制、序号管理、超时重传与报头标记位

TCP协议的格式,确认应答,序号与确认序号,超时重传,捎带应答,报头标记位

2301_77509762的博客 3403

TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制

本文深入解析了TCP与UDP两大传输层协议的核心特性。UDP作为"自由派"采用极简设计,具备无连接、不可靠传输等特点,适用于实时应用但存在64KB数据限制;TCP作为"保守派"通过确认应答(ACK)和超时重传(RTO)等十大机制构建可靠传输。文章重点剖析了TCP的报文结构、序号机制,以及两种重传策略:快速重传(基于重复ACK)和超时重传(动态计算RTO)。下期将探讨TCP连接管理的三次握手与四次挥手机制。

to_mountain的博客 2032

【Linux网络】深入理解 TCP 协议(一):报头设计与可靠性基石

在互联网世界中,TCP 协议无疑是最核心的基石之一 —— 我们每天使用的 HTTP、HTTPS、SSH、FTP 等几乎所有可靠通信都建立在 TCP 之上。很多人知道 TCP 是 “可靠的传输控制协议”,但很少有人深入理解它的可靠性究竟是如何实现的,以及它的报头设计背后隐藏着怎样的精妙考量。本文将从最基础的 TCP 数据发送流程讲起,深度拆解 TCP 报头的每一个字段,结合 Linux 内核源码分析其底层实现,并详细讲解 TCP 可靠性的两大核心机制:确认应答与超时重传。所有内容均严格基于 TCP 协议规范和

会当凌绝顶,一览众山小 3572
上一篇: 传输层 UDP 协议深度解析:从端口号到实战注意事项
下一篇: 网络层深度解析:从 IP 协议到路由机制,理解数据如何跨网传输
cpparf
博客等级 码龄2年 48粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值