TCP协议理解
文章目录
- TCP协议理解
- 理论基础
- TCP首部
- 结构图示
- 字段逐项解析
- TCP是面向连接(Connection-Oriented)
- 面向连接的核心表现
- TCP 面向连接的核心特性
- TCP 与UDP对比
- TCP是一个可靠的(reliable)
- 序号与确认机制(Sequencing & Acknowledgment)
- 正常数据传输过程图示
- 连接建立(三次握手)
- 数据传输
- 连接释放(四次挥手)
- 补充说明
- 超时重传(Retransmission Timeout, RTO)
- 正常传输(无重传)
- 数据包丢失(F1 丢失)
- ACK 丢失(ACK1 丢失)
- ACK 延迟(ACK1 延迟)
- 数据包与 ACK 均丢失(F1 + ACK1 丢失)
- 接收方处理慢(ACK1 延迟)
- 流量控制(Flow Control)
- TCP 流量控制的工作原理
- 流量控制的实现方式
- 关键字段与术语
- 举个例子来说明:
- 拥塞控制(Congestion Control)
- 拥塞控制的原理
- 拥塞控制的五种机制
- 拥塞控制的工作过程
- 拥塞控制算法的实际过程
- 拥塞控制的主要参数
- 拥塞控制算法示例:TCP Reno 和 TCP Tahoe
- 活动窗口+丢包重传机制图示
- 滑动窗口(Sliding Window)
- 丢包重传机制
- 动态序列号与确认号
- 连接释放
- 模拟丢包测试
- TCP是基于字节流(byte-TCPstream)的理解
- 五种典型场景说明:
- 关键结论:
- 全双工的协议特性
- 补充知识
- 端口号
- 作用
- 端口号范围
- TCP 常用端口
- Socket、五元组与TCP/IP协议的关系
- Socket(套字节) 是网络编程的基石
- 五元组是连接的唯一标识
- 分层图示:TCP/IP协议栈与Socket的位置
- TCP连接建立的五元组交互(三次握手)
TCP协议理解
TCP是一个可靠的(reliable) 、面向连接的(connection-oriented)、基于字节流(byte-TCPstream)、全双工的(ful1-duplex) 协议。可靠传输是通过一系列复杂的机制实现的,确保数据在网络中有序、无丢失、无重复地到达目标端。
理论基础
TCP首部
结构图示
字段逐项解析
- 源端口 & 目的端口(各16位)
- 作用:标识发送方和接收方的应用程序。
- 源端口:客户端随机分配(动态端口,范围49152~65535)。
- 目的端口:服务端固定端口(如HTTP:80、SSH:22)。
- 作用:标识发送方和接收方的应用程序。
- 序列号(32位)
- 作用:标识发送的数据字节流的顺序号,解决乱序问题。
- 初始序列号(ISN):在三次握手时随机生成,避免历史报文冲突。
- 规则:每发送1字节数据,序列号+1。
- 作用:标识发送的数据字节流的顺序号,解决乱序问题。
- 确认号(32位)
- 作用:期望收到的下一个字节的序列号,实现可靠传输。
- 规则:确认号 = 对方序列号 + 已接收数据长度 + 1(若含SYN/FIN标志,+1)。
- 数据偏移(4位)
- 作用:指示TCP头部长度(以4字节为单位)。
- 计算:头部长度 = 数据偏移值 × 4(最小5,即20字节;最大15,即60字节)。
- 作用:指示TCP头部长度(以4字节为单位)。
- 保留字段(6位)
- 作用:保留给未来使用,必须置0。
- 控制标志(6位,每1位表示一个状态)
标志位 | 名称 | 作用 |
---|---|---|
URG | 紧急 | 为1时,启用紧急指针(需配合紧急指针字段) |
ACK | 确认 | 为1时,确认号有效(建立连接后所有报文ACK=1) |
PSH | 推送 | 为1时,要求接收方立即将数据交给应用层(如Telnet输入) |
RST | 重置 | 为1时,强制断开连接(用于异常恢复) |
SYN | 同步 | 为1时,表示发起连接请求(三次握手阶段使用) |
FIN | 结束 | 为1时,表示发送方数据发送完毕(四次挥手阶段使用) |
-
常见组合:
- SYN=1, ACK=0:第一次握手(连接请求)
- SYN=1, ACK=1:第二次握手(连接确认)
- SYN=0, ACK=1:第三次握手 (建立连接)
- 传输数据。。。。
- FIN=1, ACK=1:四次挥手 (关闭连接请求)
-
窗口大小(16位)
- 作用:接收方的可用缓冲区大小(流量控制关键字段)。
- 单位:字节(最大65535字节,若启用窗口缩放选项可扩展)。
- 动态调整:通过滑动窗口协议控制发送速率。
- 作用:接收方的可用缓冲区大小(流量控制关键字段)。
-
校验和(16位)
- 作用:检测头部和数据的传输错误(覆盖伪头部+TCP头部+数据)。
- 算法:反码求和再取反。
- 伪头部字段:包含源/目的IP、协议类型等,增强校验强度。
- 作用:检测头部和数据的传输错误(覆盖伪头部+TCP头部+数据)。
-
紧急指针(16位)
- 作用:当URG=1时,指示紧急数据的末尾偏移量(相对于序列号)。
- 应用场景:中断远程命令(如Ctrl+C)。
-
选项字段(可选)
- 作用:扩展TCP功能,常见选项:
类型 长度 功能 MSS(最大报文段) 4字节 协商双方能接收的最大数据段长度 窗口缩放 3字节 将窗口大小扩展至1GB(左移0~14位) SACK(选择性确认) 可变 支持只重传丢失的报文段 时间戳 10字节 计算RTT(往返时间)和防止序号回绕
TCP是面向连接(Connection-Oriented)
面向连接的核心表现
-
三次握手(建立连接)
-
SYN:A 发起连接请求,携带初始序列号(seq=100)。
-
SYN-ACK:B 确认 A 的序列号(ack=101),并发送自己的序列号(seq=300)。
-
ACK:A 确认 B 的序列号(ack=301),连接建立。
-
-
数据传输(可靠传输)
-
PSH:A 发送数据 “hello”(占 5 字节,seq=101),B 必须回复 ACK(ack=106)。
-
应用层响应:B 发送 “world”(可选,由应用协议决定)。
-
-
四次挥手(释放连接)
-
FIN:A 发起关闭请求。
-
ACK:B 确认收到,可能继续发送剩余数据。
-
FIN:B 发起关闭请求。
-
ACK:A 确认,连接完全关闭。
-
TCP 面向连接的核心特性
特性 | 说明 | 图示对应部分 |
---|---|---|
预先建立连接 | 通信前需通过三次握手协商参数(序列号、窗口大小等)。 | 三次握手阶段 |
可靠传输 | 每个数据包必须被确认(ACK),超时重传,保证数据不丢失、不重复、按序到达。 | 数据传输阶段的 ACK 机制 |
状态维护 | 两端维护连接状态(如 ESTABLISHED、TIME_WAIT)。 | 整个生命周期 |
有序释放连接 | 通过四次挥手安全关闭连接,避免数据丢失。 | 四次挥手阶段 |
TCP 与UDP对比
对比项 | TCP | UDP |
---|---|---|
全称 | 传输控制协议(Transmission Control Protocol) | 用户数据报协议(User Datagram Protocol) |
连接性 | 面向连接(需三次握手建立连接) | 无连接(直接发送数据) |
可靠性 | 可靠传输(确认、重传、排序机制) | 不可靠传输(无确认、重传机制) |
数据顺序 | 保证数据按序到达 | 不保证数据顺序 |
流量控制 | 支持(滑动窗口机制) | 不支持 |
拥塞控制 | 支持(动态调整发送速率) | 不支持 |
传输速度 | 较慢(需额外控制机制) | 较快(无额外控制开销) |
头部大小 | 较大(20-60 字节,包含更多控制信息) | 较小(8 字节,固定头部) |
适用场景 | 对可靠性要求高的场景(如网页、文件传输) | 对实时性要求高的场景(如视频流、在线游戏) |
数据边界 | 无明确边界(基于字节流) | 有明确边界(保留数据报边界) |
协议复杂度 | 复杂 | 简单 |
典型应用 | HTTP、FTP、SMTP、SSH | DNS、VoIP、直播、在线游戏 |
UDP数据传输图示
TCP是一个可靠的(reliable)
TCP 通过以下 4 种关键技术保证可靠性:
序号与确认机制(Sequencing & Acknowledgment)
正常数据传输过程图示
注意:上图中大写的ACK是标志位,小写ack是回应对方的确认号
-
用netcat 和 wireshare 模拟抓包TCP过程
连接建立(三次握手)
- SYN: 同步序列号,初始化连接。
- ACK: 确认对方的序列号。
- 最终双方进入 ESTABLISHED 状态。
- 三次握手示意图
数据传输
- 每次发送数据时:
- seq 为当前数据包的起始序列号。
- ack 为期望收到的下一个字节的序列号(即对方seq + 数据长度)。
- 示例中传输了三条数据:“Hello” → “Hi” → “Bye”。
连接释放(四次挥手)
- FIN: 终止连接请求。
- 客户端和服务器各自发送 FIN 并确认对方的 FIN,最终进入 CLOSED 状态。
- 客户端在 TIME_WAIT 状态等待 2MSL(确保最后一个 ACK 到达服务器)。
- 状态说明表格:
状态 | 所属方 | 含义 |
---|---|---|
FIN-WAIT-1 | 客户端 | 发送FIN后等待服务器ACK确认 |
CLOSE-WAIT | 服务器 | 收到FIN后进入半关闭状态,等待应用层处理剩余数据 |
FIN-WAIT-2 | 客户端 | 收到服务器ACK后,等待服务器发送FIN |
LAST-ACK | 服务器 | 发送FIN后等待客户端最终ACK确认 |
TIME-WAIT | 客户端 | 发送最后一个ACK后等待2MSL(防止ACK丢失,确保服务器能正常关闭) |
CLOSED | 双方 | 连接完全关闭 |
-
什么是
MSL
?
MSL(Maximum Segment Lifetime,报文最大生存时间)是 TCP 报文在网络中的最长存活时间,超过该时间未被接收的报文会被丢弃。2MSL 是 TCP 连接在 TIME-WAIT 状态的等待时长,即 两倍的 MSL。- 在 Linux 系统中,MSL 默认为 60秒,因此 TIME-WAIT 状态持续 120秒(2MSL)。
- Windows 系统中 MSL 通常为 2分钟(TIME-WAIT 为 4分钟)。
-
为什么需要
TIME-WAIT
?-
确保最后一个ACK到达服务器,若丢失,服务器会重传FIN,客户端可重新响应ACK。
-
防止旧连接的延迟数据包干扰新连接(通过2MSL等待旧数据包失效)。
-
wireshare抓包情况
-
在windows下cmd中用
netstat
工具查看连接状态
-
补充说明
-
序列号(seq)和确认号(ack)
- 每次传输数据后,seq 和 ack 会动态变化,遵循规则:
- ack = 对方上一次的seq + 数据长度。
-
为什么需要三次握手四次挥手?
-
三次握手的原因
-
确认双向通信能力
通过客户端发送SYN、服务端回复SYN+ACK、客户端再回复ACK的三次交互,验证双方的发送和接收功能正常。 -
同步初始序列号
交换序列号(seq)和确认号(ack),为后续数据传输提供有序性保障。 -
防止历史连接干扰
若网络延迟导致旧SYN报文到达,服务端会要求客户端确认,避免无效连接占用资源。 -
协商窗口参数
在握手过程中同步TCP窗口大小等配置,优化数据传输效率。
-
-
四次挥手的原因
-
全双工连接的独立关闭
TCP连接是双向的,客户端和服务端需分别发送FIN和ACK来关闭各自的通道。- 第一次挥手:主动方发送FIN,表示不再发送数据。
- 第二次挥手:被动方回复ACK,确认收到关闭请求。
- 第三次挥手:被动方发送FIN,表示自身数据已发送完毕。
- 第四次挥手:主动方回复ACK,最终确认连接释放。
-
确保数据完整性
四次挥手允许被动方在ACK后继续发送剩余数据,避免数据丢失。 -
处理延迟报文
通过TIME_WAIT状态等待可能滞留在网络中的报文,防止新连接收到旧数据。
-
-
为什么不简化握手或挥手?
-
两次握手不足
无法验证客户端的接收能力,且易受历史SYN报文干扰。 -
三次挥手不可行
被动方的ACK和FIN通常无法合并发送,因为数据可能未传输完成。
-
通过这种设计,TCP在不可靠的IP层上实现了可靠的端到端通信。
-
-
理解Wireshare抓包中的序列号(seq)和确认号(ack)都是wireshare处理后的相对序号/确认号
-
实际传输值
-
是32位无符号整数,范围0-4294967295
-
表示该报文段中第一个数据字节的编号
-
初始序列号(ISN)是随机生成的(安全考虑)
-
-
Wireshark显示方式
-
相对序号:默认显示相对于初始序列号的偏移量
-
第一个包的Seq显示为0(实际可能是任意ISN值)
-
后续包显示相对于ISN的增量
-
绝对序号:可通过右键菜单切换显示实际值
-
-
超时重传(Retransmission Timeout, RTO)
TCP 超时重传场景分析
正常传输(无重传)
-
流程:
F1 (Seq=1) → ACK1 → F2 (Seq=2)
-
说明:
数据包和 ACK 均正常到达,无需重传。
数据包丢失(F1 丢失)
-
流程:
F1 (丢失) → [超时] → F1 (重传) → ACK1
-
原因:
网络拥塞、链路错误导致数据包丢失。 -
解决方案:
- 启用 快速重传(Fast Retransmit)(需 SACK 支持)
- 优化网络路径(如切换路由、检查 QoS)
ACK 丢失(ACK1 丢失)
-
流程:
F1 (Seq=1) → ACK1 (丢失) → [超时] → F1 (重传) → ACK1 (重发)
-
原因:
接收方的 ACK 确认包丢失,发送方误判数据未到达。 -
解决方案:
- 动态调整 RTO(重传超时时间) 减少误判
- 使用 SACK(选择性确认) 避免重复传输已接收数据
ACK 延迟(ACK1 延迟)
-
流程:
F1 (Seq=1) → ACK1 (延迟) → [超时] → F1 (重传) → ACK1 (重发)
-
原因:
ACK 因网络抖动延迟到达,触发不必要的重传。 -
解决方案:
- 优化 RTT(往返时间) 计算算法(如 Linux 默认的 RFC6298)
- 启用 时间戳选项(TCP Timestamps) 更精确估算延迟
数据包与 ACK 均丢失(F1 + ACK1 丢失)
-
流程:
F1 (丢失) + ACK1 (丢失) → [超时] → F1 (重传) → ACK1
-
原因:
双向通信均失败,可能是网络分区或严重拥塞。 -
解决方案:
- 增加 最大重传次数(如 Linux 的 tcp_retries2)
- 监控网络状态(如 ICMP 探测、BGP 路由检查)
接收方处理慢(ACK1 延迟)
-
流程:
F1 (Seq=1) → [处理延迟] → [超时] → F1 (重传) → ACK1 (重发)
-
原因:
接收方应用层处理缓慢(如缓冲区满、高负载)。 -
解决方案:
- 调整接收方 TCP 接收窗口(RWND)
- 优化应用代码(如异步 I/O、批量处理)
流量控制(Flow Control)
TCP 流量控制是确保在网络通信中发送方不会过度传输数据以至于接收方无法及时处理的机制。流量控制的核心目的是防止接收方的缓冲区溢出,确保数据传输的可靠性和稳定性。
TCP 流量控制的工作原理
在 TCP 连接中,流量控制依赖于 接收窗口(Receive Window) 来管理数据传输。接收窗口是接收方通知发送方当前可用的缓冲区空间大小,发送方根据这个窗口来决定可以发送多少数据。
以下是 TCP 流量控制的主要概念:
-
接收窗口(Window Size):
- 每次发送方发送数据时,它会检查接收方的接收窗口大小。接收窗口大小由接收方在每个 TCP 数据包的头部通知给发送方。
- 接收窗口的大小决定了在不等待确认的情况下,发送方最多可以发送的字节数。接收方通过不断地更新窗口大小来通知发送方当前可接受的缓冲区空间。
-
滑动窗口(Sliding Window):
- TCP 使用滑动窗口机制来进行流量控制,发送方通过滑动窗口来控制数据的流量。
- 当接收方确认已收到数据时,窗口向前滑动,释放出空间,从而允许发送方发送更多的数据。
- 这个窗口并不是固定大小的,它会随着接收方处理数据的速度和窗口大小的更新而动态调整。
-
流量控制过程:
- 发送方:发送方发送数据到接收方,并在每个数据包中包含当前的接收窗口大小。
- 接收方:接收方在收到数据后,会根据其缓冲区的空闲空间更新接收窗口大小。
- 滑动窗口更新:当接收方成功处理某些数据并释放缓冲区空间时,接收方会通过窗口更新通知发送方,发送方则可以继续发送数据。
流量控制的实现方式
- 接收方窗口大小的动态调整:
- 在 TCP 握手期间,接收方会告知发送方自己的接收窗口的大小。
- 接收方根据自己的缓冲区的使用情况来调整接收窗口。如果接收方的缓冲区已经满了,接收窗口会变小或甚至为零,这会告诉发送方暂时停止发送数据。
- 例如,当接收方的缓冲区空间快用完时,接收窗口会减少,发送方的发送速率也会受到影响。
- 流量控制与拥塞控制:
- 流量控制与拥塞控制是 TCP 中的两个不同机制。流量控制关注的是如何控制数据传输速率以避免接收方缓冲区溢出,而拥塞控制则是为了避免网络中的过度拥塞。
- 流量控制是基于接收方的缓冲区情况来进行调节,而拥塞控制则是基于整个网络的负载情况进行调节。
关键字段与术语
-
rwnd (Receive Window):
- rwnd 是接收窗口的大小,表示接收方的缓冲区剩余的可用空间。这个值会通过 TCP 头部的字段传递给发送方。
-
窗口大小字段:
- 在 TCP 头部,有一个字段专门用于表示接收窗口大小,它是一个 16 位的数值,表示当前接收方能接收的字节数。
举个例子来说明:
假设发送方正在发送大量的数据,而接收方的接收窗口初始大小为 10,000 字节。发送方会按照这个窗口大小发送数据。
- 发送方发送了 10,000 字节的数据。
- 接收方处理了其中的一部分数据并释放了 4,000 字节的缓冲区空间。
- 接收方通过更新窗口大小,告知发送方新的接收窗口大小为 4,000 字节。
- 发送方在接收到这个更新的窗口大小后,调整自己的发送速率,并根据接收窗口的大小来决定可以发送多少数据。
- 如果接收方的缓冲区空间已满,接收窗口大小会变为零,通知发送方停止发送数据,直到接收方处理了足够的数据,窗口大小才会重新增大。
拥塞控制(Congestion Control)
拥塞控制(Congestion Control)是 TCP 协议中一个非常重要的机制,旨在防止网络中的数据包过度积压或拥堵,从而影响数据的传输效率与可靠性。它的主要目标是确保数据传输在网络的可承载范围内进行,避免因网络负载过高导致的丢包、延迟和流量不稳定。
拥塞控制的原理
拥塞控制的核心思想是根据网络的实际状况(如带宽、延迟、丢包率等)动态调整发送方的数据发送速率,以防止网络拥塞。当网络出现拥塞时,TCP 会自动减慢数据发送速率;当网络空闲时,TCP 会逐步增加发送速率。
拥塞控制的五种机制
- 慢启动(Slow Start)
- 拥塞避免(Congestion Avoidance)
- 快速重传(Fast Retransmit)
- 快速恢复(Fast Recovery)
- 拥塞窗口(Congestion Window, cwnd)
拥塞控制的工作过程
-
慢启动阶段(Slow Start):
- 初始时,TCP 连接的拥塞窗口(cwnd)被设置为一个小的值(通常为 1 或 2 个最大报文段长度(MSS))。
- 每收到一个确认(ACK)包,发送方就会将拥塞窗口大小增加一个 MSS,即窗口大小以指数级增长。
- 该阶段持续到拥塞窗口大小达到一个阈值(慢启动阈值,ssthresh),此时转入拥塞避免阶段。
-
拥塞避免阶段(Congestion Avoidance):
- 当拥塞窗口达到慢启动阈值后,TCP 会进入拥塞避免阶段。在这个阶段,窗口大小的增长速度会减缓,从指数增长转为线性增长。
- 每收到一个确认包,拥塞窗口(cwnd)会增加一个 MSS 除以当前的拥塞窗口大小。
- 这一阶段的目标是平稳地增加发送速率,避免因为过快的速率增加而导致网络拥塞。
-
丢包检测与快速重传(Fast Retransmit):
- 如果发送方连续收到三个相同的确认号(即出现三次重复确认),说明某个数据包丢失了。
- TCP 会立即重传丢失的数据包,而不需要等待超时。
- 快速重传的机制能够减少丢包后等待超时的时间,加速数据的恢复过程。
-
快速恢复阶段(Fast Recovery):
- 在丢包发生并进行快速重传后,TCP 会进入快速恢复阶段。在该阶段,拥塞窗口会进行适当的调整,通常是将拥塞窗口减半(cwnd = cwnd / 2),而不是直接回到慢启动阶段。
- 快速恢复阶段的目的是尽量恢复丢包后的网络状况,并避免过度回退。
-
拥塞窗口的调整:
- 在慢启动和拥塞避免阶段,TCP 会根据网络的反馈动态调整拥塞窗口大小。
- 当发生拥塞时(如丢包发生),TCP 会减小拥塞窗口的大小,并且通过逐步增加(慢启动)或线性增加(拥塞避免)来找到适合的发送速率。
拥塞控制算法的实际过程
-
慢启动:
- 初始时,cwnd 通常设为 1 MSS。
- 每当收到一个确认包(ACK),cwnd 就加 1 MSS,窗口大小呈指数增长。
- 当 cwnd 达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。
-
拥塞避免:
- cwnd 达到 ssthresh 后,进入线性增长阶段。每收到一个确认包,cwnd 增加 1 MSS / cwnd。
- 这种增长是线性的,能够平稳地增加发送速率,防止网络过载。
-
快速重传与快速恢复:
- 在接收到 3 次重复确认时,认为发生了丢包。
- 快速重传会立即重发丢失的包,而不是等待超时。
- 快速恢复会将 cwnd 减少一半,然后继续进行拥塞避免。
拥塞控制的主要参数
-
拥塞窗口(Congestion Window,cwnd):
- 拥塞窗口是发送方控制发送速率的关键参数,它定义了在网络中可以未确认的数据的最大字节数。
- 拥塞窗口的大小会根据网络的拥塞状况动态调整。较大的 cwnd 可以提高数据传输速率,较小的 cwnd 会减少发送速率,从而缓解拥塞。
-
慢启动阈值(Slow Start Threshold,ssthresh):
- ssthresh 是决定 TCP 何时从慢启动阶段转到拥塞避免阶段的阈值。
- 当发生拥塞(如丢包)时,ssthresh 会减小,以限制数据的快速增长。
-
超时重传:
- 当发送方未收到某个数据包的确认(ACK)时,它会触发超时重传机制。这通常会导致拥塞窗口被重置为一个较小的值,并重新开始慢启动。
拥塞控制算法示例:TCP Reno 和 TCP Tahoe
- TCP Tahoe:使用慢启动、拥塞避免和超时重传机制。在发生丢包时,cwnd 会被重置为 1 MSS,然后重新进入慢启动阶段。
- TCP Reno:在 TCP Tahoe 的基础上增加了快速重传和快速恢复机制。当检测到丢包时,cwnd 会减小一半,并进入快速恢复阶段,而不是回到慢启动。
活动窗口+丢包重传机制图示
滑动窗口(Sliding Window)
- 窗口大小 Win=3 表示客户端无需等待ACK即可连续发送3个数据包(P1、P2、P3)。
- 服务器通过 ack 动态调整窗口(示例中因丢包暂停滑动)。
丢包重传机制
- 快速重传:服务器连续3次返回相同的 ack=2(表示P2丢失),客户端立即重传P2。
- 超时重传:P4未收到ACK,客户端等待超时后重传。
动态序列号与确认号
- 数据包长度影响 ack 值(如 data=“P1” 长度为1,则下一个 ack=2)。
- 重传包的 seq 不变(如P2重传时仍为 seq=2)。
连接释放
- 客户端和服务器各自发送 FIN 并确认,最终客户端进入 TIME_WAIT 状态(等待2MSL)。
模拟丢包测试
- 为了更精确地模拟滑动窗口和重传机制,使用
iperf
和netem
等工具制造条件- netem 是Linux内核中的一个网络模拟模块,它允许你模拟网络延迟、丢包、重复和乱序等条件,使用
tc
(Traffic Control)工具来配置 netem iperf
是一个网络性能测试工具(需要额外安装yum install -y iperf
),它可以用来测量TCP和UDP带宽性能。可以使用iperf
来模拟不同的带宽和延迟条件,从而观察TCP连接在这些条件下的行为
- netem 是Linux内核中的一个网络模拟模块,它允许你模拟网络延迟、丢包、重复和乱序等条件,使用
- 服务器端 使用
netem(tc)
模拟网络延迟和丢包
# 在服务端上设置50%丢包率
tc qdisc add dev eth0 root netem loss 50%# 启动iperf服务器
iperf -s
- 在另一台机器上运行客户端测试
# 设置非常小的窗口大小
iperf -c <server_ip> -w 1k
- 测试完成后移除服务端丢包规则
tc qdisc del dev eth0 root
TCP是基于字节流(byte-TCPstream)的理解
一种字节流协议,流的含义是没有固定的报文边界
五种典型场景说明:
-
完整发送
-
发送方三次写入(200B+300B+500B)→ 接收方一次读取1000B
-
典型场景:Nagle算法关闭时的小数据快速发送
-
-
拆分发送
-
原始数据被拆分为400B+600B两个TCP段
-
原因:MTU限制或拥塞控制导致分片
-
-
部分粘包
-
前两次写入(200B+300B)合并发送,第三次单独发送
-
接收方读取时出现500B+500B的分界
-
-
数据混合
-
当前应用数据与其他应用数据混合传输
-
需要应用层协议自行区分(如HTTP头部的Content-Length)
-
-
拆分成小包
-
大数据块被拆分为多个小包传输
-
常见于慢启动阶段或高延迟网络
-
关键结论:
-
TCP的字节流特性导致以下不确定性:
-
写入/读取次数不对应
-
数据块大小不对应
-
报文边界不保留
-
-
必须通过应用层协议解决:
-
最常用方案:长度前缀(如HTTP/WebSocket)
-
简单方案:分隔符(如Redis协议)
-
特殊场景:定长(如视频流分片)
-
全双工的协议特性
补充知识
端口号
端口号是网络通信中用于区分不同应用程序或服务的逻辑标识,与IP地址结合形成套接字(Socket),实现端到端的精准通信。
作用
-
定位应用层服务:同一台主机上可能有多个网络应用(如Web服务器、FTP服务器),端口号帮助区分这些服务。
-
多路复用/解复用:通过端口号,传输层(TCP/UDP)将数据准确交付给目标应用程序。
端口号范围
-
16位无符号整数:范围 0~65535(2^16)
-
分类
类型 | 范围 | 说明 |
---|---|---|
知名端口 | 0~1023 | 分配给系统服务(如HTTP:80) |
注册端口 | 1024~49151 | 用户程序可注册的端口(如MySQL:3306) |
动态/私有端口 | 49152~65535 | 客户端临时使用的端口(操作系统随机分配) |
TCP 常用端口
端口号 | 协议/服务 | 说明 |
---|---|---|
20/21 | FTP | 文件传输(数据/控制连接) |
22 | SSH | 安全远程登录 |
80 | HTTP | 网页访问 |
443 | HTTPS | 加密网页访问 |
3306 | MySQL | 数据库服务 |
3389 | RDP | 远程桌面协议 |
Socket、五元组与TCP/IP协议的关系
Socket(套字节) 是网络编程的基石
- 作用:Socket 是操作系统提供给应用程序的 编程接口(API),开发者通过它实现网络通信(如建立连接、发送数据)
- Socket 由以下几个部分组成:
- 协议族(如:IPv4 或 IPv6)
- 传输协议(如:TCP 或 UDP)
- 端口号
- IP 地址
在编程中,Socket 通常是通过操作系统提供的 API 来创建的,用于实现网络连接。Socket 使得应用程序可以通过指定端口、IP 地址和协议类型来进行通信。它是实现网络通信的抽象。
五元组是连接的唯一标识
组成:协议 + 源IP + 源端口 + 目标IP + 目标端口。
元素 | 说明 | 示例 |
---|---|---|
传输层协议 | 指明使用 TCP 还是 UDP | TCP、UDP |
源IP地址 | 发起通信的主机 IP 地址 | 192.168.1.100 |
源端口 | 发起通信的应用程序端口(临时端口,通常由操作系统动态分配) | 54322 |
目的IP地址 | 目标主机的 IP 地址 | 10.0.0.5 |
目的端口 | 目标应用程序的端口(知名端口或注册端口,如 HTTP-80、SSH-22) | 80 |
举例说明:
- 操作系统通过五元组区分不同的网络连接。例如,同一台主机上的多个浏览器标签访问同一网站时,每个连接的五元组中的 源端口 不同。
连接1: [TCP, 192.168.1.100:54322 → 10.0.0.5:80]
连接2: [TCP, 192.168.1.100:54323 → 10.0.0.5:80]
分层图示:TCP/IP协议栈与Socket的位置
+-----------------------+
| Application | ← 应用程序(HTTP/FTP/SSH)
+-----------------------+
| Socket | ← 编程接口(API)
+-----------------------+
| Transport (TCP/UDP) | ← 五元组在此层生效
+-----------------------+
| Network (IP/ICMP) |
+-----------------------+
| Link (Ethernet) |
+-----------------------+
- Socket 是应用层与传输层之间的桥梁,开发者通过它调用TCP/UDP功能。
- 五元组 在传输层(TCP/UDP)中唯一标识一个连接。
TCP连接建立的五元组交互(三次握手)
- 握手过程中,双方Socket根据五元组确认连接归属。
相关文章:
TCP协议理解
文章目录 TCP协议理解理论基础TCP首部结构图示字段逐项解析 TCP是面向连接(Connection-Oriented)面向连接的核心表现TCP 面向连接的核心特性TCP 与UDP对比 TCP是一个可靠的(reliable)序号与确认机制(Sequencing & Acknowledgment…...
NS3-虚拟网络与物理网络的交互-1 仿真概述
NS3-虚拟网络与物理网络的交互-1 仿真概述 目录 1. 仿真概述1.1 Testbed 仿真示例-FdNetDevice1.2 模拟通道示例-TapDevice 1. 仿真概述 NS-3 专为集成到 TestBed 和虚拟机中而设计 环境。我们通过提供两种网络设备来满足这一需求。 第一种设备是文件描述符 net 设备 &#x…...
晶振老化:不可忽视的隐患与预防策略
在电子设备的世界里,晶振如同精准的时钟,为电路系统提供稳定的频率信号。然而,随着时间推移,晶振会不可避免地出现老化现象。这个看似细微的变化,却可能引发设备性能下降、数据传输错误等一系列问题。晶振老化究竟藏着…...
企业为何要禁止“片断引用开源软件代码”?一文看透!
开篇故事:一段“开源代码”引发的百亿级灾难 某电商平台为快速上线新功能,从GitHub复制了一段“高性能加密算法”代码到支付系统中。 半年后,黑客通过该代码中的隐藏后门,盗取百万用户信用卡信息。 事后调查:这段代…...
测试模版x
本篇技术博文摘要 🌟 引言 📘 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...
deepseek-r1-671B满血版,全栈式智能创作平台 - 多模态大模型赋能未来创作
引领AI创作新纪元 比象AI全栈式智能创作平台是基于全球领先的多模态大模型技术构建的新一代AI创作引擎,集成了前沿的BeyondLM-7B认知计算框架、BeyondDiffusion-XL视觉生成系统和BeyondSynth音视频合成技术,打造从内容构思到成品输出的完整智能创作闭环…...
Promethues 普罗米修斯
Prometheus 并非传统意义上的数据库,而是一个开源的系统监控和报警工具包,但它的核心组件之一是时间序列数据库,用于存储监控指标数据。以下是对 Prometheus 及其时间序列数据库功能的详细介绍: 1. Prometheus 概述 目标定位&a…...
Web 服务架构与技术组件概述
目录 web服务流程图 Web 服务流程图描述了客户端与服务器之间的交互。首先,用户通过浏览器发送请求到 Web 服务器。如果请求的是静态资源(如 HTML、CSS、图片),Web 服务器直接返回响应;如果是动态资源,We…...
华硕NUC产品闪耀第31届中国国际广播电视信息网络展览会
2025年4月22日,第31届中国国际广播电视信息网络展览会在北京国家会议中心盛大开幕。作为一年一度的行业盛会,展会汇聚了来自全球各地的顶尖技术与设备厂商。在这片科技与创新交织的海洋中,华硕NUC以其卓越性能、小巧体积和创新技术十分引人注…...
Matplotlib高阶技术全景解析(续):动态交互、三维可视化与性能优化
目录 编辑 一、动态可视化:实时数据流与动画生成 1. 实时数据流可视化 2. 复杂动画控制 二、三维可视化:科学计算与工程建模 1. 基础三维绘图 2. 高级三维渲染优化 三、交互式可视化:GUI集成与Web部署 1. Tkinter/PyQt嵌入式开发 …...
[DDD传灯录]禅师:这,就是领域驱动设计(01-02)
用《软件方法》引领AI全流程开发-5月12-14日第3期 领域驱动设计是革命性的创造,是划时代的洞见,是解决业务领域用户需求技术系统功能逻辑架构分析设计复杂性的敏捷精益方法学。 这一切的根源,归结于领域驱动设计蕴含丰富的佛学思想。佛学是所…...
0基础 | Proteus仿真 | 51单片机 | 继电器
继电器---RELAY 本次选择一款5v一路继电器进行讲解 信号输入 IN1输入高电平,三极管导通,LED1点亮,电磁铁12接通吸引3向下与4接通,J1A的12接通 IN1输入低电平,则J1A的23接通 产品引脚定义及功能 序号 引脚符号 引脚…...
鸿蒙应用开发证书考试的一点想法
一、介绍: 直接上图 二、体验后的想法: 1.知识点在指南API参考最佳实践里面找 2.没有明确说明考试不能查第1点的文档,但是考试只有1个小时,合理分配时间 3.切屏三次后自动提交要注意,每月3次机会下月又有3次机会&a…...
MiniMind模型的web交互功能初试
MiniMind模型的web交互功能初试 一、前言 MiniMind提供了基于streamlit的web交互功能,能够即时切换模型和修改相关参数,经初步测试,具有比较好的体验感。本文介绍了使用MiniMind使用web交互功能的方法,并对使用中出现的问题给出…...
手把手玩转 JSON:快递包裹式思维拆箱装箱,Python / Java / Scala 全景实战指南
在日常开发中,JSON 就像全栈程序员口袋里那把万用螺丝刀——既轻便又几乎无处不在。本文面向初学者和中级读者,用“快递包裹”与“便签盒子”的比喻,结合 Python / Java / Scala 三语种示例,带你从概念、语法到实战全面掌握 JSON。…...
HFSS5(李明洋)——设置激励(波端口激励)
Magnetic是适用于铁磁氧导体的,只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部,如果是设置在模型内部必须加一段理想导体,用于指定端口方向 1.1——模式 number 输入N:计算1-N的模式都计算 1.2——模式校准 计算端口特征阻抗有三种方式:Zpi、…...
NVIDIA --- 端到端自动驾驶
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、传统驾驶模型二、NVIDIA的端到端驾驶模型1.基本模型2.自查讯向量3.通用框架 总结 前言 端到端自动驾驶指的是系统接收来自摄像头雷达和激光雷达的原始传感…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(11): てあります。 1、前言(1)情况说明(2)工程师的信仰 2、知识点(1)てあります。(2)…...
【前端】如何检查内存泄漏
在实际的场景中,如果观察到内存持续出现峰值,并且内存消耗一直没有减少,那可能存在内存泄漏。 使用 Chrome DevTools 来识别内存图和一些内存泄漏,我们需要关注以下两个方面: ● 使用性能分析器可视化内存消耗…...
【多线程】四、死锁
文章目录 Ⅰ. 死锁的概念Ⅱ. 死锁的四个必要条件Ⅲ. 避免死锁的方案Ⅳ. 避免死锁的算法Ⅰ. 死锁的概念 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。 通常,死锁发生在多个进程同时需要…...
【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
Video-LLaVA
一、研究背景与现有方法局限性 在多模态大语言模型(LVLMs)的发展中,现有方法面临两大核心挑战。其一为单一模态处理的局限,多数 LVLMs 仅能处理图像 - 语言或视频 - 语言等单一视觉模态,难以在统一框架下高效整合多种视觉输入。其二为统一表示的困难,尽管部分研究尝试通过…...
firewalld 详解
firewalld 详解 firewalld 是 Linux 系统中一个动态防火墙管理工具,取代了传统的 iptables,提供更灵活、动态的规则配置,支持运行时修改且无需重载服务。以下是其核心概念、常用操作及示例指南: 一、核心概念 区域(Zo…...
QuecPython+USBNET:实现USB网卡功能
USBNET 概述 USBNET(USB Networking) 是一种通过 USB 接口 实现网络通信的技术,允许设备通过 USB 连接模拟以太网(Ethernet over USB)或直接进行网络数据传输。它广泛应用于嵌入式设备、工业控制、虚拟机和便携式设备…...
百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用
百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用 一、背景 2025年4月25日,百度在Create开发者大会上发布了全新的AI开放计划。这一计划的核心目的是实现用户和AI应用、MCP Server的高效链接,提供更流畅的互动体验,推…...
一文带你了解单例模式及其逐步优化~
单例模式 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。 使用场景: 需要频繁创建和销毁的对象 创建对象时耗时过多或资源消耗过大 工具类对象(无状态的工具类) 访问…...
【金仓数据库征文】-不懂数据库也能看懂!一文解析金仓技术介绍以典型应用
目录 一、主角登场 没有数据库,你的生活可能会 “乱套” 国产数据库之金仓 KingbaseES 金仓数据库凭啥 “C 位出道”? 二、金仓数据库产品核心解析 企业级数据库 “全能选手” 巧妙的 “内部协作” 按需选择的版本 四、生态联合解决方案深度探索…...
什么是视频上墙
视频联动上墙是指当监控系统中出现报警或其他特定事件时,相关的视频画面能够自动切换并显示在指定的监控大屏或显示设备上,以便监控人员能够快速、直观地查看事件现场的情况,及时做出响应和处理。 具体介绍• 系统组成 :一般由前端…...
C++初登门槛
多态 一、概念 多态是指不同对象对同一消息产生不同响应的行为。例如,蓝牙、4G、Wi-Fi 对“发送数据”指令有不同的具体实现。 二、核心理解 本质:通过基类指针或引用操作子类对象,实现运行时动态绑定。 表现形式: 接口统一&a…...
【金仓数据库征文】- 金融HTAP实战:KingbaseES实时风控与毫秒级分析一体化架构
文章目录 引言:金融数字化转型的HTAP引擎革命一、HTAP架构设计与资源隔离策略1.1 混合负载物理隔离架构1.1.1 行列存储分区策略1.1.2 四级资源隔离机制 二、实时流处理与增量同步优化2.1 分钟级新鲜度保障2.1.1 WAL日志增量同步2.1.2 流计算优化 2.2 物化视图实时刷…...
SpringBoot 学习
什么是 SpringBoot SpringBoot 是基于 Spring 生态的开源框架,旨在简化 Spring 应用的初始化搭建和开发配置。它通过约定大于配置的理念,提供快速构建生产级应用的解决方案,显著降低开发者对 XML 配置和依赖管理的负担。 特点: …...
Q2桥门式起重机司机考试复习重点
Q2桥门式起重机司机考试复习重点 Q2桥门式起重机司机属于特种设备作业人员,理论考试重点复习时应重点掌握以下内容: 1、基础知识 桥门式起重机的结构组成(大车、小车、起升机构、电气系统等)。 主要技术参数(额定起…...
并发设计模式实战系列(7):Thread Local Storage (TLS)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第七章Thread Local Storage (TLS),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. TLS内存模型 2. 关键特性 二、生活化类比&a…...
本地使用Ollama部署DeepSeek
以下是在本地使用Ollama部署DeepSeek的详细教程,涵盖安装、修改安装目录、安装大模型以及删除大模型的操作步骤。 安装Ollama 1. 系统要求 确保你的系统满足以下条件: 操作系统:macOS、Linux或者Windows。足够的磁盘空间和内存。 2. 安装…...
通过VSCode远程连接到CentOS7/Ubuntu18等老系统
通过VSCode远程连接到CentOS7/Ubuntu18等老系统 背景 VSCode的远程连接插件Remote SSH一直以来是简单好用的远程工具。然而,2025年2月之后的版本在远程安装vscode-server时,预编译的server依赖glibc 2.28,这就要求Linux远程机的glibc版本应…...
Python在AI虚拟教学视频开发中的核心技术与前景展望
Python在AI虚拟教学视频开发中的核心技术与前景展望 一、引言:AI虚拟教学的技术革新 随着教育数字化转型加速,AI虚拟教学视频凭借个性化、沉浸式体验成为教育科技的新风口。Python以其强大的多模态处理能力、丰富的开源生态和跨领域兼容性,成…...
【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能
我的个人主页 我的专栏: 人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!! 点赞👍收藏❤ 目录 引言:数据库进化的下一站 —— 未来科技的无限可能金仓数据库简介:国…...
深入掌握Redis主从复制:原理、配置与生产级实践指南
一、主从复制核心价值与适用场景 1.1 核心价值矩阵 数据安全:多节点冗余存储,避免单点数据丢失 服务可用性:主节点故障时可快速切换从节点 性能扩展:通过横向扩展从节点提升读吞吐量 运维便利:从节点可承担备份、分…...
springboot如何管理多数据源?
静态多数据源管理 配置多个数据源 :创建多个数据源的配置类,通常使用 @ConfigurationProperties 注解来绑定配置文件中的数据源属性,并通过 @Bean 注解定义多个 DataSource Bean 。例如: 配置类: @Configuration public class DataSourceConfig {@Bean(name = "prima…...
基于风力推进器控制的小球实验装置设计与研究
目录 完整论文下载链接放在文章结尾,有需要自行下载。 目录 摘 要 1 引 言 2 概述 2.1 风控小球系统概述 2.2 本设计方案思路 2.3 研发方向和技术关键 2.4 主要技术指标 3 总体设计 4 硬件设计 4.1 单片机最小系统 4.2 供电接口电路 4.3 Openmv摄像头…...
Swift闭包(Closure)深入解析与底层原理
前言 在Swift开发中,闭包是一个非常重要且强大的特性。本文将深入探讨Swift闭包的底层实现原理,帮助开发者更好地理解和使用这一特性。 1. 什么是闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用。它不仅可以像函数一样执行代码&…...
【DE-III】基于细节增强的模态内和模态间交互的视听情感识别
abstract 在视听情感识别(AVER)中,捕捉视频和音频模态之间复杂的时间关系是至关重要的。然而,现有的方法缺乏对局部细节的关注,如视频帧之间的面部状态变化,这会降低特征的可区分性,从而降低识别准确率。 为此,本文提出了一种用于AVER的细节增强的模态内和模态间交互…...
c++11 :智能指针
目录 一 为什么需要智能指针? 二 智能指针的使用及原理 1. RAII 2. auto_ptr 3. unique_ptr 4. shared_ptr 5. weak_ptr 三 内存泄漏 1.什么是内存泄漏,内存泄漏的危害 2. 如何避免内存泄漏? 一 为什么需要智能指针? …...
Linux解压tar.gz包的正确姿势(附赠防抓狂指南)
一、为什么你的解压命令总报错? 每次看到.tar.gz后缀是不是心里一紧?(别装了!我都看到你偷偷打开浏览器查命令的样子了)这个在Linux界横行霸道的压缩格式,其实用对了方法比Windows的zip还简单。今天咱们不…...
MCP协议:让AI从“话痨”变“实干家”的神奇魔法
一、MCP 协议:AI 界的 “万能插头” 是啥来头? 1.1 从 “动口不动手” 到 “全能打工人” 你以为 AI 只会陪你聊天、写文案?那你可小瞧它啦!MCP 协议(Model Context Protocol),堪称 AI 的 “瑞…...
如何在SpringBoot中通过@Value注入Map和List并使用YAML配置?
在SpringBoot开发中,我们经常需要从配置文件中读取各种参数。对于简单的字符串或数值,直接使用Value注解就可以了。但当我们需要注入更复杂的数据结构,比如Map或者List时,该怎么操作呢?特别是使用YAML这种更人性化的配…...
记一次调用大华抓拍SDK并发优化
目录 一、问题分析 二、解决思路 三、贴代码 四、总结 一、问题分析 按惯例上问题: 设备告警采用高电平持续模式:一次开,不主动关就一直处于告警状态。 并发时多个请求下发 setDVRAlarmOutConfig,导致状态混乱。 “开 -&g…...
打破认知!没论文没竞赛,我的暑期实习上岸秘籍:简历要敢 “吹”,面试靠巧 “聊”
前言 以下教程仅针对本人的大大小小几十场暑期实习面试的经验总结,个人背景(双9,无论文、无竞赛、无大厂实习、无奖。)。简历几易其稿,相对于原来的初版,可谓是脱胎换骨,洗经易髓。 二月中旬开…...
为何 RAG 向量存储应优先考虑 PostgreSQL + pgvector 而非 MySQL?
构建检索增强生成(RAG)系统已成为释放大型语言模型(LLM)潜力的关键范式。通过将 LLM 的推理能力与外部知识库的实时、特定信息相结合,RAG 能够生成更准确、更相关、更值得信赖的回答。而这个“外部知识库”的核心&…...
LangChain LCEL表达式语言简介
LangChain表达式语言(LCEL)是专为构建AI应用链设计的声明式编程框架,通过管道符|实现组件无缝衔接,支持流式处理、异步调用等生产级特性。其核心优势在于零代码改动实现原型到生产的过渡,同时保持代码简洁性和可维护性…...