Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络环境的处理)

TCP、UDP、QUIC协议核心机制与实战选型指南 传输层协议是网络通信的基石,负责在端到端之间提供可靠或高效的数据传输服务。其核心原理在于通过不同的机制管理数据包的发送、确认和流量控制,以确保网络资源的合理利用和应用的稳定运行。从技术价值看,理解传输层协议是实现高性能网络应用、进行有效网络问题排查的关键。在实际工程中,不同的应用场景对延迟、可靠性和吞吐量的要求各异,这直接决定了协议的选择。例如,**拥塞控制**机制通过动态调整发送速率来避免网络过载,是TCP保证稳定性的核心;而**流量控制**则协调发送端与接收端的速度匹配,防止数据丢失。本文聚焦于TCP、 阅读详情

1.TCP的连接管理机制

(1)三次握手

三次握手和四次挥手都需要建立在标识位的基础上,不同的标识位可以告诉对方自己的目的。 用一个故事来描述三次握手:A向B表白,B同意了并且问什么时候开始谈,A告诉B就现在并递出了一束花。

①握手过程

我们认为发出“表白”请求的就是C端,就是客户端,接收的就是服务端,即S端。三次握手都是用标志位来表达的。第一次C端发送SYN,这是个空报文,只有报头,这相当于A向B表白;第二次S端发送SYN + ACK,ACK是对第一次握手的回应,SYN相当于B向A表白,这也是个空报文,只有报头;第三次C端发送ACK,并且可以不再是空报文,可以捎带应答了,这里的ACK也是对B向A发送SYN的回应。

②对握手过程的理解

过程其实可以拆分成两部分,C端向S端申请连接,S端向C端申请连接。申请连接的一方都会发出SYN,接收到SYN的都会进行ACK。那么更清晰地说,三次握手的本质是四次握手:C发送SYN,S回应ACK;S发送SYN,C回应ACK。只不过我们将中间S端回应ACK和发送SYN合并了而已,所以才叫三次握手,这体现出全双工的特性。

本质上,三次握手、四次挥手是以最少次数验证双方全双工信道的通畅性。

三次握手的最后一次,C端可以边ACK边发消息,就是使用了确认序号和序号个部分,本质就是利用了捎带应答机制。但注意三次握手合并的两次握手(S端的ACK和SYN)并不能说是捎带应答,因为捎带应答针对的是报文的捎带,要用到序号和确认序号,而这里只是将ACK和SYN两个标志位置为1。

(2)四次挥手

为什么是四次前面已经提及,本质就是从左到右建立共识,再从右向左建立共识。C端发起FIN,S端接收回应后再发起FIN,断开连接和建立连接一样,都要征得双方的同意。 根据建立连接,我们可以推断出,在有的情况下四次挥手可以合并成三次,即双方都有很强的断开连接的意愿下。

(3)握手和挥手的触发

TCP的服务端一直处于listen状态(一直阻塞在accept函数中),客户端建立连接需要connect,服务端需要accpet,那么握手和挥手在宏观上是在哪一步被触发的呢?

C端调用connect之后,会触发OS去握手,connect只会阻塞等待结果,这个函数并不会主动去参与握手的流程。所以C端发送的SYN、ACK这些都是调用connect之后系统自动进行的,和这个函数没有直接关系。同理,accept也不参与三次握手,它只负责等待结果。总结起来就是:connect发起请求后,由OS自主三次握手,握手成功C端的connect和S端的accept都会收到消息,但这两个函数不会参与握手过程。

挥手过程和握手相似,C端调用close后OS会自主发起一个FIN,S端收到后再自主发起FIN,因此close也是不会直接参与挥手过程的。但挥手有一个问题:C端close会触发OS的挥手流程,但S端收到C端的挥手后,S端发起的FIN怎么能被C端接收到呢?C端不是已经close了吗?其实关闭网络通信还有个更底层接口,int shutdown(int fd, int how), 其中how是宏,有读、写、读写选项,因此调用这个函数可以实现更细粒度的通信关闭,也可实现半通信。close之后OS并不会马上断开读、写通信,而会步步关闭,这样就解决了刚才的疑问。

(4)状态切换

握手和挥手会伴随一系列的状态切换,因为建立和断开连接不仅由双方意愿决定,还要受网络状态影响,所以每一次挥手和握手都对应状态切换,这样在出现意外时OS能根据状态及时判断出错的阶段并给出异常处理方案。 下面是一些比较重要的状态切换,涉及一些网络环境的处理:

①挥手过程中状态的切换

C端发起close后,会进入TIME_WAIT等待S端的FIN,收到S端的FIN后等待两个MSL时间就会切换到CLOSED状态。

TIME_WAIT的存在也能保证S端发起的FIN确认收到,有可能C端收到S端的FIN后发起的ACK没有送到S端,导致S端一直FIN,TIME_WAIT下的C端在收到FIN后可以马上再ACK,尽可能保证正常4次挥手完成。

MSL是一个报文在网络中的最长时间(大部分在60s - 120s),保持在TIME_WAIT是为了等待网络的游离报文消散,在这个状态下一般bind会失败,以防快速建立两次连接,第二次连接后却收到第一次连接时的报文。不过,我们可以设置套接字setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))(其中需定义int opt = 1),SO_REUSEADDR允许进行地址复用,这个时候服务器TIME_WAIT状态也能再次bind。 S端在收到C端的FIN并ACK之后,会进入CLOSE_WAIT,S端发起FIN后会进入LAST_ACK,收到C端的ACK就直接进入CLOSED状态。前两次挥手是由C端调用触发的,后两次挥手需要由S端调用close触发。 所以如果服务器一直不调用close,一直处于CLOSE_WAIT,那么第三次挥手就迟迟不发,这种情况下C端等待一段时间后会直接退出,而S端就一直积累,导致服务器的文件描述符、内存泄漏。所以一定要及时close。

②握手过程中状态的切换

connect触发三次握手后,C端就切换为SYN_SENT,S端收到SYN之后就变成SYN_RCVD。S端再发起SYN + ACK,被C端收到,C端就会变成ESTABLISHED,对C端来说连接就已经建立了,之后就会开始发消息。而S端就会在第三次握手后变成ESTABLISHED,稍晚一些。

这里会出现一个问题,S端和C端切换为ESTABLISHED的时间不一样。如果C端变成ESTABLISHED之后S端出现意外,被快速重启了,而C端不知道。这个时候C端照常发消息,S端就不认识,这时S端就会回应RST(重置连接),重新进行三次握手。
或者说S端发送SYN后C端的ACK没有被S端收到,S端仍未置于ESTABLISHED,之后C端发送消息,S端也会RST重置连接。

2.TCP的可靠性

报文在网络上传输要花时间,确认收到了消息需要做应答,告诉发送端已经收到了。就像上课老师问同学听没听懂,同学要应答。
但服务端应答要发回一些消息,怎么保证应答收到了呢?应答再应答?这就无限递归了。 可以得出,长距离通信,没有100%的可靠性,因为总有最新的一条消息是没有应答的。 客户端给服务器发消息,服务器要应答,只要客户端收到了应答,就说明上一条消息的可靠性,我们关注的其实是前面发送的消息是否可靠,而不是最新的应答,应答只是个标志,而不是重要的信息。 TCP就是以这种方式为基础,实现了可靠性。

(1)重传机制

①超时重传

信息丢失分为数据丢了,应答丢了。数据丢了不会应答,C端会设定一个时间间隔,超时会重传。但应答丢了,C端确认不了是应答丢了还是数据丢了,所以C端都会超时重传。

这里我们可以结合一下系统的知识来理解,如何实现超时功能呢?闹钟信号(定时器,通过软中断实现,本质就是count --)。

超时等待时间不是固定的,会动态计算,一般以500ms为单位控制,第一次500ms,下一次2 * 500,下一次4 * 500… 指数级增加等待时间间隔,多次不行的话发送端就会认为是网络不行,直接执行中断连接等操作。

其实有的时候信息根本没丢,只是被卡在某个路由器了,但网络太复杂了,我们只能按照最坏的打算来处理。这个时候就可能遇到两个一模一样的信息被接受端收到(原信息 + 重传信息),怎么办呢?很简单,用序号去重即可。

②快重传

我们已经知道,滑动窗口里面的数据随时可以发送,如果分成四块发送1 - 4000,第2块先到,ACK为1,第3、4块其次,它们回应的ACK都是1,这个时候OS连续接收到三个相同的ACK,就会马上重传第1块,不论第1块是真丢了还是传的比较慢。如果是传的慢,没丢失,接受端收到两个报文也会去重
但如果收到的顺序是2、3,但1和4都还没传过来,这个时候就不会触发快重传。如果1先到,则ACK立即变为3001,之后等待4;如果4先到,那就立刻触发快重传;如果都没到,那就等待超时重传。
可以发现,快重传只是在一方面降低时间延迟,本质上还是个概率问题,面对网络的复杂性,很多时候的处理并不像系统那样“优雅”,简单来说就是“赌”。

(2)流量控制

流量控制 != 传输数据速率变慢,它是通过一系列考量,告诉OS当前最合适的发送数据速率是多少,在拥堵时减少发送,在空闲时能增加发送量,整体提高数据传输效率。

①滑动窗口

a.滑动窗口的组成

我们前面说过,TCP有自己的发送缓冲区和接受缓冲区,两个缓冲区本质就是sk_buff的链表,对报文的管理本质就是对sk_buff的管理,发送和接收都是修改链表(生产者 - 消费者模型)。滑动窗口本质上就是建立在缓冲区之上的,它本质上是一种算法,通过类似首尾指针或下标维护窗口范围。我们前面说过发送数据就是向缓冲区写数据,至于数据怎么发,什么时候发是OS自主决定的。滑动窗口就属于OS自主决定的这部分。
在这里插入图片描述

发送缓冲区中,滑动窗口的左侧是已经确认收到的数据,中间是随时可以发送的数据(可以不按顺序发),右侧是现在不能发送的数据。缓冲区逻辑结构上是环形的,因此滑动窗口不会越界,本质上就是环形队列的生产者 - 消费者模型。

TCP报文交换过程中,双方互相交换的报头中就有16位窗口大小,这个滑动窗口大小不能超过16位窗口大小对应值,这样发送的数据永远不会超出对方的接受能力导致数据丢弃。注意这个窗口大小控制是双方都在做的,这是全双工通信。

其实这里还有个更底层的问题,为什么滑动窗口要划分成一块一块的数据发送,直接一下子把滑动窗口里面的数据全发出去不是更省事吗?数据链路层不允许发送大的报文,有大小限制,所以越往上走,就越要控制报文的大小,要保证从传输层向下传输的数据到链路层不会超过它的规定最大值。

b.滑动窗口的运行逻辑

窗口滑动的本质是维护窗口首尾的start和end在做修改,滑动窗口的start = 确认序号,end = start + win(接收的报文的当前窗口大小)。滑动窗口只能向右移动,毕竟确认序号是不断增加的。

已知滑动窗口是分段发送的,假设为四等分段,丢包问题无非三种情况的组合,最左侧、中间、最右侧丢了。最左侧丢了:后面收到的3个应答的确认序号应该都是滑动窗口原起始值,滑动窗口不移动,这个时候也会触发快重传。补发接收到后确认序号直接跳过第2、3、4段。中间段丢失,应答的确认序号都是第1(或2)段后面的值,窗口移动一段,这个时候转为最左侧丢失情况,补发后窗口再跳过已接收到段。其余同理,所有的丢失都会转为最左侧丢失问题,滑动窗口逐一滑动,逐一解决丢包。

为什么收到补发的数据后,窗口会直接跳过前面接收的数据序号呢?在滑动窗口发送的数据没有被完整接收完前,先前到达的sk_buff会被暂时维护起来,直到完全接收完毕后统一上交到缓冲区,链入缓冲区的sk_buff链表中。

上述的丢包重传,除了第一种只有最左侧丢弃,其余三个都收到并ACK同一值触发了快重传以外,其余的都是靠超时重传实现的。

②拥塞控制

和建立连接断开连接一样,双方想干什么不仅仅是看双方的意愿,还要看网络的状态。要进行流量控制,滑动窗口的大小不能仅仅是由对方的窗口大小决定,还受网络限制,不然虽然对方能接受大量数据,但网络极差,发出去的基本都丢了,有什么用?

a.慢启动机制

少量报文丢失是正常情况,但大部分报文丢失就只能是网络的问题(16位窗口大小排除了对端缓冲区的影响)。

网络出现拥塞问题,要么重传,要么进行其他处理。可以肯定的是,如果大量数据超时,重传肯定不现实,这只会加重网络拥堵。因为用全局视角来看,网络上有很多用户,如果每个用户都采用这种策略,这一定会导致大量数据重复发出,造成更严重的网络拥塞。

所以一旦发生拥塞,就必须使用慢启动机制,先发少量数据,摸清网络状态,每收到一个ACK就再多发点,一点一点试探,发送的数据量受到拥塞窗口值的影响。一般来说,大于拥塞窗口的值就可能拥塞,小于这个值就很可能不会引发拥塞。

这又来了个窗口,怎么和前面的知识结合起来呢?仅需一个公式就能彻底理解。滑动窗口大小 = min(16位窗口大小,拥塞窗口大小),我们需要认识到,对流量的控制已经转为了对滑动窗口大小的控制,这里取最小值就是最好的佐证。

我们还需要了解下慢启动的算法,这个拥塞窗口的大小怎么调整的?拥塞窗口大小由每个主机单独维护(双方都要有,且不在报文中体现),是主机自己对网络环境的评估。因此可以说,网络的好坏转为了对拥塞窗口大小的比较,这也是后续理解拥塞窗口大小调整算法的核心思想。

刚开始通信时,主机对网络状况一无所知,因此拥塞窗口是1字节,每收到一次ACK,窗口大小 + 1、+2、+4、+8,指数级增加。 为什么采用指数增长呢?这是为了让主机尽快探明网络,尽快达到正常通信速度。
但由于指数爆炸的特性,窗口大小增长速度还受慢启动阈值限制,一旦拥塞窗口到达阈值,后面拥塞窗口就按+1、+1、+1增大。这里有一个需要注意的点,达到阈值后窗口值线性增加,如果网络一直畅通,每收到一个ACK,那么窗口值会不断增大,甚至到1000,10000都可以。我们要理解,拥塞窗口的值是对网络状态的描述,值越大,说明网络越好,上不封顶。

如果发生拥塞,拥塞窗口大小直接变为1,慢启动阈值 = 触发拥塞前上一次拥塞窗口大小(拥塞前一瞬间拥塞窗口的大小) / 2 。 这里我们也能理解为什么拥塞窗口要一直变化,上不封顶。因为网络的拥堵、健康等状况一直是变化的,因此拥塞窗口也一定一直在变化。如果很长一段时间拥塞窗口都很大,这说明网络状况很好,就算发生一次拥塞后,由于慢启动阈值高,能很快回到原来状态。

b.快恢复机制

快恢复指的是当触发快重传之后,慢启动阈值 = 触发拥塞前上一次拥塞窗口大小(拥塞前一瞬间拥塞窗口的大小) / 2 ,这些和慢启动一致。但区别在于拥塞窗口大小不会置为1,而是会置为变化后的慢启动阈值。 启动快重传,毕竟是连续收到3个ACK的(大概率能收到消息,只不过某一块数据出现了意外),网络状况还是稍好一点的,不需要极端地置为1,可以说快恢复是一种相对而言效率更优的做法,和慢启动结合控制拥塞窗口大小的修改。

③窗口探测

滑动窗口大小可以为0,即对方剩余窗口大小为0时,就会触发窗口探测。 这个时候每隔一段时间,C端就会试探性地发送消息,并且PSH标志位设为1,告知对方请尽快将数据交给上层。事实上,当滑动窗口大小较小时(不一定要窗口为0),C端就会开始发送PSH了。

3.TCP针对复杂网络环境的一些处理

(1)随机序号

在快速建立两次连接时,挥手时要避免上一次连接的游离报文传到下一次连接中,因此第2次连接的开始序号要处理。由于前两次握手没有任何报文内容交换,所以可以在两次握手中的序号处设置一个随机序号,双方交换随机序号。在后续的传输中,收到序号后应当减去对方握手时发给自己的随机序号,恢复出原始序号,如果异常就丢弃。这就减少了游离报文的影响。

(2)延迟应答

S端收到了数据,一般会等一小会再应答,等待期间上层会读取数据,这会使得S端的接收缓冲区变大,之后ACK的窗口大小也会更大一些,提高传输效率提高。但是我们要如何理解等一小会?S端可以每隔2个包应答一次(也可为其它值,TCP允许少量ACK丢失或者隔包应答,收到ACK表示之前的数据都收到了),或者根据时间限制(如200ms)应答,延迟的时间要控制在超时重传内。

(3)紧急指针

TCP具有按序到达的特性,但有的时候我们想要插队,让后面的数据先被收到。例如,使用云盘上传数据时,我们突然想要终止上传,这个终止的指令就相对比较紧急,因为就算按序收到前面的大量数据,也终归是无效的。

我们可以将URG标记设为1,这样到达对方主机后,OS就会优先读取并交给上层处理。 URG的紧急数据由16位紧急指针标识,其值标记有效载荷中紧急数据的偏移量。但注意紧急数据只占1个字节,可以约定设置状态码来进行快捷的紧急处理。

紧急指针的运用也能体现在代码中,在应用层recv可以读取紧急数据,其中recv的第4个参数标志位设置为MSG_OOB,这个时候recv就会去读取紧急数据(也称为带外数据)。发送紧急数据同理,在send标记位设置MSG_OOB。

(4)粘包问题

UDP没有粘包问题,因为其报头中含有有效载荷长度,要么拿上一个完整报文,要么直接将整个报文丢弃。而TCP没有这个字段,只有起始序号,因此在面向字节流中,不能保证读到应用层的是完整的报文,有可能读了两个报文,交到应用层的数据中第2个报文只有一半,这就是粘包问题。 解决方案就是在应用层设置明确的报文边界,例如用特殊符号隔开报文,使用序列化和反序列化,增加自描述长度字段等,这需要在应用层人为解决。

(5)意外断连

①进程异常终止

维护连接本质上就是维护创建的文件及其缓冲区,由于文件生命周期随进程,所以当进程异常终止时,杀掉进程的就是OS内核,相应地,OS内核也会负责地正常进行四次挥手断开连接。 机器重启也是如此,OS都会正常四次挥手。

②机器断电、断网

如果C端的机器断电或断网,对于S端来说,连接就无效了。但S端连接信息一直都在,它怎么知道C端的连接怎么样呢?

如果C端长时间没通信,S端会询问它,如果没回应,S端就会关闭,这叫连接保活,保活时间一般是几分钟。 TCP自己有连接保活机制,但一般连接的保持是应用层来做,因为TCP不能根据不同情况满足实际需求,只是个兜底的。

C++ Socket编程入门:从零实现Linux TCP客户端服务器通信骨架 网络编程是现代软件开发的基石,它基于TCP/IP协议栈实现不同主机间的进程通信。其核心原理是通过Socket(套接字)作为通信端点,在操作系统内核中建立虚拟连接通道,实现可靠的数据流传输。掌握Socket编程的技术价值在于能够构建高性能、可扩展的后台服务、物联网网关和分布式系统组件。在实际应用场景中,无论是Web服务器、即时通讯软件还是微服务架构,都离不开底层Socket通信的支持。本文以C++和Linux环境为例,通过实现一个基础的TCP通信模型,深入讲解Socket API的调用流程、阻塞I/O机制以及 阅读详情

相关推荐

TCP/IP超详细总结

网络的基础知识 一、协议 1、简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词。互联网中常用的具有代表性的协议有IP、TCP、HTTP等。而LAN(局域网)中常用的协议有IPX/SPX”等。 下面通过通俗一点的方式来解释一下协议: 有三个人A、B、C。A只会说汉语、B只会说英语、而C既会说汉语又会说英语。现在A与B要聊天,他们之间该如何沟通呢?若A与C要聊天,又会怎样?这时...

java梦工厂 1643

TCP/IP 三次握手

TCP/IP 三次握手

喵酱 1万+

【Linux网络】TCP/IP三次握手、四次挥手流程

本文重点讲述了TCP/IP 的三次握手和四次挥手的过程,还讲述的主要字段,如:标志位,序号,确认序号等。三次握手和四次挥手的报文变化,最后给了几个常考的面试题。

m0_63198468的博客 3383

TCP/IP的三次握手

TCP/IP的三次握手

qq_63706130的博客 1351

Python TCP编程实战:从基础通信到粘包问题解决方案

TCP协议作为网络编程的核心基础,通过面向连接的三次握手机制确保数据传输的可靠性。其基于字节流的特性虽然保证了数据顺序,但也带来了粘包问题的技术挑战。在Python网络编程实践中,socket模块提供了简洁的TCP通信接口,结合异常处理和资源管理,能够构建稳定的客户端-服务器架构。针对物联网设备通信、实时聊天系统等应用场景,解决TCP粘包问题成为关键,通过长度前缀协议等方案确保数据完整性。本文基于Python socket编程和TCP粘包处理两个技术热点,详细解析如何构建生产级可用的TCP通信框架。

weixin_30902251的博客 358

C++网络编程实战:从零实现TCP通信工具,掌握Socket与多线程核心技术

网络编程是现代软件开发的基石,它定义了不同设备间数据交换的规则与方式。其核心原理在于通过套接字(Socket)建立连接,遵循TCP/IP协议栈实现可靠的数据传输。掌握网络编程技术价值巨大,它不仅是构建分布式系统、即时通讯、物联网应用的基础,更能深化对操作系统、并发模型和系统资源管理的理解。在工程实践中,开发者常需处理多线程并发、连接管理、数据封包与错误恢复等挑战。本文聚焦于C++环境下的网络编程实践,通过一个完整的TCP通信工具项目,详细解析了Socket API的使用、客户端/服务器架构的实现,并深入探讨

weixin_33738578的博客 353

二:熟悉 TCP/IP 协议

一篇文章带你熟悉 TCP/IP 协议(网络协议篇二) 同样的,本文篇幅也比较长,先来一张思维导图,带大家过一遍。 一图看完本文 一、 计算机网络体系结构分层 计算机网络体系结构分层 计算机网络体系结构...

weixin_39037804的博客 2444

Windows C++网络编程入门:Winsock2初始连接与TCP客户端实战

网络编程是构建分布式系统和网络应用的基础,其核心在于通过套接字(Socket)实现不同主机间的进程通信。在Windows平台下,Winsock2 API是实现这一功能的标准接口,它封装了TCP/IP协议栈的底层细节,为开发者提供了创建、连接、发送和接收数据的统一方法。理解Winsock2的工作原理,尤其是其初始化和连接流程,对于开发稳定可靠的网络应用至关重要。这不仅能帮助开发者掌握基础的客户端/服务器通信模型,更是后续学习异步I/O、高性能服务器设计等高级主题的基石。在实际工程中,正确处理头文件冲突、链接库

weixin_30911451的博客 342

传输层协议 TCP [ 下 ]

TCP协议机制深入解析与网络可靠性实现 本文深入探讨了TCP协议的核心机制及其在网络通信中的应用,主要内容包括: 可靠传输机制 确认应答(ACK)机制:通过序列号确保数据有序接收 超时重传机制:动态调整重传时间应对网络变化 连接管理:三次握手建立连接,四次挥手断开连接,包含TIME_WAIT状态设计 性能优化机制 滑动窗口:实现流量控制,提高传输效率 拥塞控制:通过慢启动和拥塞避免算法适应网络状况 延迟应答与捎带应答:减少网络流量,提高吞吐量 异常处理 针对网络断连、机器重启等异常情况的处理策略 TCP与U

Small_entreprene的博客 1349

Linux连接跟踪(conntrack)原理、调优与故障排查实战

连接跟踪(Connection Tracking)是Linux内核Netfilter框架中的核心基础设施,用于在网络层识别和记录数据包所属的会话状态。其工作原理是通过分析数据包的协议、IP地址和端口等元组信息,构建并维护一个动态的连接状态表,实现有状态的网络处理。这项技术的核心价值在于为防火墙、NAT(网络地址转换)、负载均衡等高级网络功能提供了会话感知能力,使得规则配置得以简化,并能智能处理双向流量。在应用场景上,它广泛支撑着Kubernetes Service的iptables模式、有状态防火墙策略以及

weixin_30681615的博客 363

Linux 内核中 TCP 协议栈的输出实现:tcp_output.c 文件解析

Linux内核中的TCP协议栈实现解析 摘要:本文深入分析了Linux内核中TCP协议栈的核心输出模块tcp_output.c的实现机制。该文件位于net/ipv4目录下,是TCP协议传输层实现的关键组成部分,主要负责数据包的发送、重传和连接管理。文章从代码结构、核心功能和实现原理三个维度展开: 功能架构:tcp_output.c实现TCP数据包构建、发送队列管理、拥塞控制、窗口调整和定时器处理等核心机制,支持Nagle算法、选择性重传(SACK)等优化策略; 关键流程:包括数据分段发送(tcp_write

数字人生 316

TCP协议核心机制解析:从三次握手到流量控制与拥塞管理

在计算机网络中,可靠的数据传输是构建稳定应用的基础。其核心原理在于通过确认、重传、排序和流控等机制,确保数据在网络中准确、有序地传递。这些机制的技术价值在于,它们能够在底层不可靠的IP网络上,为上层应用提供稳定的字节流服务,从而支撑起网页浏览、文件传输和实时通信等关键场景。其中,TCP协议作为实现可靠传输的典范,通过三次握手建立连接、滑动窗口进行流量控制,以及慢启动和拥塞避免等算法管理网络拥堵,成为互联网通信的基石。本文聚焦于TCP协议的这些核心机制,深入探讨其如何通过确认与重传保障数据可靠交付,并借助流量

weixin_33946605的博客 432

TCP协议深度解析:从可靠传输原理到网络性能优化实战

TCP(传输控制协议)是互联网可靠数据传输的核心协议,它通过序列号、确认应答和重传机制确保数据有序、无差错地送达。其工作原理基于连接管理、流量控制和拥塞控制三大支柱,其中滑动窗口机制协调收发速率,拥塞控制算法动态调整发送窗口以应对网络波动。理解TCP机制的技术价值在于,它能帮助开发者诊断网络故障、优化高并发服务性能,并设计低延迟应用。在应用场景上,从Web服务器、数据库连接到实时音视频流,TCP的可靠性保障了关键业务的稳定运行。本文将结合Wireshark抓包分析和Linux网络工具,通过实验演示TCP快速

weixin_30458043的博客 653

深入解析ECONNRESET:从TCP原理到HTTP连接重置的排查与解决

在网络编程中,TCP连接是数据传输的基石,它通过三次握手建立可靠通信。其核心原理在于通过序列号、确认和重传机制保证数据有序、不丢失地送达。然而,在实际工程实践中,连接可能因各种原因被异常终止,此时操作系统会通过RST(复位)标志位强制关闭连接,并向上层应用报告ECONNRESET错误。这一机制对于构建高可靠性的网络应用至关重要,尤其是在微服务通信、大文件传输和长连接等场景下,连接稳定性直接关系到业务连续性。当出现连接重置问题时,开发者需要系统性地排查客户端配置、服务端资源、中间件超时设置及网络设备策略等多个

weixin_33709364的博客 384

【win11】主板更新之后pin不可用,恢复方法

台式机的主板更新了BIOS,再开机竟然登录不进去系统了。 登录界面上显示:【由于此设备上的安全设置已更改,你的pin码不再可用。单击以重新设置pin】 点击【单击以重新设置pin】没有任何反应。 也没有密码登录选项。 在网上找到解决方法,不用PE,只需要按步骤操作即可。通过实际验证可行,现记录如下。

1万+

2024年全国大学生电子设计竞赛H题_自动行驶小车

自动行驶小车(H题)【本科组/高职高专组】

qq_74395263的博客 1万+

网络拥塞控制终极指南:TCP BBR与CUBIC算法深度调优

在现代网络通信中,TCP(传输控制协议)作为一种可靠的传输层协议,通过拥塞控制机制保障数据在复杂网络环境中的稳定传输。GitHub加速计划中的school-of-sre项目提供了丰富的网络知识资源,其中TCP相关内容涵盖了从基础握手到高级调优的完整实践指南。本文将深入解析TCP拥塞控制的核心原理,重点对比BBR与CUBIC两种主流算法的工作机制,并提供实用的优化配置方案。 ## TCP拥塞控制的

gitblog_01200的博客 1146

从零到一:RagFlow源码架构深度解析与二次开发实战指南

本文深入解析RagFlow源码架构,提供从环境搭建到二次开发的全流程实战指南。作为企业级AI搜索框架,RagFlow通过模块化设计和多模态处理能力,支持自定义智能体开发与文搜文档功能,帮助开发者高效构建智能搜索系统。

w1x2y3的博客 267

全国产通信处理平台构建:从ARM架构调优到工业级可靠性设计

在工业控制与物联网领域,通信处理平台是连接物理设备与数字系统的核心枢纽,其性能与可靠性直接关系到整个系统的稳定运行。这类平台通常基于微处理器架构,通过实时操作系统与通信协议栈实现设备间的数据交换与处理。其技术原理涉及硬件抽象层、中断调度、内存管理及网络协议栈优化等多个层面。在工业4.0与自主可控的背景下,构建全国产化平台不仅能规避供应链风险,更能深度优化技术栈以适应特定场景需求。本文聚焦于基于国产ARM处理器(如飞腾系列)的通信处理平台构建,深入探讨了在性能调优、生态适配与高可靠性设计方面的工程实践。通过内

weixin_34133829的博客 417

ubuntu 24.04安装ros1 noetic

上面是参考链接给的修改内容。除了上面要修改的地方,我在编译的生活还有一个地方报错,修改成如下形式。因为我已经对文件rosconsole_log4cxx.cpp作了上面的修改,所有是不是188行不太确认了,如果报“log4cxx::spi::LocationInfo”问题,按照下面修改就可以了。我在编译时还报了一个问题,就是我之前安装的是jazzy。所以在编译时会报ros变量名不对,这时对变量名做修改就可以了。具体怎么修改,百度。a、将源文件中所有CMakelist中编译标准改为c++ 17.

yangpan011的博客 3199

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 206

Linux连接跟踪(conntrack)原理、实践与性能调优指南

连接跟踪(Connection Tracking)是现代状态化防火墙和网络地址转换(NAT)的核心技术基础。其原理在于,网络协议栈不再将数据包视为孤立的个体,而是通过五元组(源/目标IP、端口及协议)识别并组织成双向数据流,并为之维护连接状态(如NEW、ESTABLISHED、RELATED)。这项技术的核心价值在于,它使得防火墙规则能够基于连接状态进行高效决策,例如放行已建立连接的回包,并支撑了动态NAT等复杂网络功能的实现。其典型应用场景包括保障FTP等复杂协议的正常通行、构建高效的安全策略以及容器网络

weixin_33795093的博客 313

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 871

C++网络编程实战:TCP/UDP高效通信与性能优化指南

网络编程是构建高性能分布式系统的核心技术,其核心在于高效处理I/O事件与数据传输。从原理层面看,I/O多路复用技术通过单线程监控多个连接状态,实现了高并发下的资源高效利用,这是现代服务器设计的基石。在技术价值上,合理的缓冲区设计与连接管理能显著减少系统调用与内存拷贝,直接提升吞吐量与响应速度。应用场景广泛覆盖游戏服务器、金融交易系统、实时音视频等对延迟敏感的领域。本文聚焦于C++语言下的网络编程实践,深入探讨epoll等I/O模型的应用,并针对TCP粘包、UDP可靠性等常见问题提供解决方案,同时涵盖内存池、

weixin_30279315的博客 315

【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型之python实现

文章目录1. 引言2. Brinson多期归因模型的Python实现2.1 基准数据读取模块2.2 持仓数据读取模块2.3 持仓收益与基准计算模块2.4 Brinson多期归因模型核心算法Brinson_Multiple2.5 主函数模块3. 归因结果写在最后 1. 引言 在上文中,我们已经介绍了Brinson归因模型的基本思想。那么,就让我们动起手来,实现这一方法吧! 在Brinson多期归因模型实现的过程中,本文使用模块化方法,将整个实现过程划分为如下五个功能板块: Module 1: 基准数据读取模

Mikey_Sun的博客 2万+

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 356
上一篇: Linux相关概念和易错知识点(41)(UDP、TCP报头结构)
下一篇: MySQL相关概念和易错知识点(1)(MySQL中不同概念的关系、MySQL基本使用)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值