当前位置:首页 > 嵌入式 > 嵌入式教程

(1)TCB

TCP模块中有一个TCB(传输控制模块,Transmit Control Block),它用于记录TCP协议运行过程中的 变量。对于有多个连接的TCP,每个连接都有一个TCB,这里只有一个。TCB结构的定义包括这个连接使用 的源端口、目的端口、目的IP、序号、应答序号、对方窗口大小、己方窗口大小、TCP状态、TOP输入/输出队列、应用层输出队列、TCP的重传有关变量。

(2)rap状态转化(状态:能够对其产生影响的事件)

在特定的rap状态下,相应的事件触发相应的动作和相应的状态转化。状态转化如下:

(3)接收流程

TCPIn()进程是主接收流程。TCPIn进程查看TOP输入队列中是否有元素,有则提取并从队列中删除。 然后看校验和是否正确,再看端口是否正确,调用TCPPortOK函数。TCPPortOK函数,首先看是否为SYN包 ,对这种包都不加以拒绝,否则要求不在closed和listen状态,并且源目的端口和目的IP地址要正确才 接收。

接着调用TCPExpectedPacket来看收到的这个包的序号是否是自己想要的序号,复杂的TCP协议只要序号 落在窗口范围内就接收,这里为了简便只允许接收特定序号的包。如果以上的检测都通过,则说明是一 个所希望的包。用新接收的包调用TCPReceiveRenew函数来更新TCB的值,TCPReceiveRenew函数主要用来 更新应答序号、释放重发队列中被应答的元素(以后说明),以及事件处理和状态转化。在

处理中,有些状态要判断是否是对方发来的第一个包,如果是则要Initial ack,即初始化AckSequence ,对于Establish状态还要判断是否发送应答包。

接下来,如果这个包中含有数据则调用TCPOnReceive,用户在这个函数中处理接收。TCPIn函数在最后 无论如何要释放这个包。

(4)发送流程

TCPOut是发送主进程。首先它检测是否有TOP包要重发(以后说明),然后要求rap不处于closed, listen,synrecvd,synsent状态,这些状态不能发送数据。接着看重传队列是否很满,再看应用层输出 队列中是否有元素,有则用TCPSendPacket发送此包。

TCPSendPacket函数负责发送一个TOP包。它首先判断page是否合法,因为很多地方使用TCPSendPacket (TCPAllocateWithoutData(),TCP_ACK);的形式,所以可能TCPAllocateWithoutData没能分配到内存 ;page非法则退出,这里的非法退出可能导致协议失败,但是在内存够用的情况下不会发生。然后将包 写入重传队列,填写TCP头;接着更新Sequence,填写IP头的目的IP,再写入TCP输出队列。

(5)定时重发

符合条件if(DataSize!=0|| (TCPFlag& (TOP_SYN丨TOP_FIN))!=0)的TCP需要重发。重发思路 如下:

将所有发送的数据包都写入重发队列QueueRetransmit,其中包括需要重发的和不需要重发的TCP包,并 将TCP包的序号写入SequenceOfRetransmit,将是否需要重发标志写入FlagOfRetransmit。如图1所示, 图中第二个序号为2100、3003的包是不需要重发的。


 图1 定时重传队列

(6)窗口大小选择

本地窗口固定为TCP_SOURCE_WINDOWS,这是为了避免TCP复杂的窗口算法。这里选择窗口大小一般比较 小。TCP只接收一个包,给予应答后才能接收另一个包,而一般的TCP都是一次发送多个的,如果对方发 来多个,这里只好抛弃,最好是对方不会一次发送多个。如果将窗口大小设得很小,则对方认为内存小 ,只连续发一个或很少。

(7)如果给对方的应答包丢失

比如发一个应答,希望对方发来序号为1000的包,但是这个包丢失,对方将不断地重发上一个包(例 如序号为900的包),则不断抛弃这个包(只接收一个指定序号为1000的包),协议出错。

(8)应用层分包

应用层定义的包和接收情况如图2所示


 图2 应用层定义的包和接收

阴影部分表示新接收到的数据,即buff~buff+size内存区的内容。它是第1个包的末尾和第2个包的开 始。这就是说一次接收的不一定是一个完整的包,但是有时需要接收到一个完整的包时才能处理这个包 。这就是应用层分包问题,做法如下。

从包的type字段可以知道这个类型的包大小为PacketTypeToSize(type),所以应该接

收PacketTypeToSize(type)以后再处理这个包。接收完PacketTypeToSize(type)个字节以后,下一 个一定是下一个包的type字段,然后又可以从PacketTypeToSize(typo)得到需要接收的字节数。

欢迎转载,信息来源维库电子市场网()



ks99

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭