TCP相关知识

1、 三次握手过程最后一个数据包丢失

当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server,如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒,6秒,12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。

如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。但是Client认为这个连接已经建立,如果Client端向Server端写数据,Server端将以RST包响应,Client端方能感知到Server端的错误,从而断开连接。

2、 TCP状态变迁

客户端:CLOSED-SYN_SENT_ESTABLISED-FIN_WAIT_1-FIN_WAIT_2-TIME_WAIT-CLOSED

服务器端:CLOSED-LISTEN-SYN_RCVD-ESTABLISED-CLOSE_WAIT-LAST_ACK-CLOSED

3、 TCP协议RST标志

发送RST包关闭连接时,不必等待缓冲区的包都发出去,直接丢弃缓冲区的包,发送RST包。

接收端收到RST包后,也不必发送ACK包来确认。

四次握手不是关闭TCP连接的唯一方法,有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST包将被发送,由于RST包不是TCP连接中的必须部分,可以只发送RST包(即不带ACK标记),但在正常的TCP连接中RST包可以带ACK确认标记,RST包是可以不要收到对方确认的。

处于LISTEN状态的控制块只能响应SYN握手包,对非SYN握手包返回一个RST报文。

以太网帧结构

帧结构图:

clip_image002

前同步码和帧开始定界符:一个帧以7个字节的前导码和1个字节的帧开始符作为帧的开始。在线路上帧的这部分的位模式是10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101011。

MAC 目的地址:第三个字段是6字节(MAC地址占48位,如:FF,FF,FF,FF,FF),发送方的网卡(MAC)地址,用处是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同则会进一步处理,不同则直接丢弃。

源MAC地址:发送端的MAC地址同样占6个字节。

类型:该字段在网络协议栈分解中及其重要,考虑当PDU(协议数据单元)来到某一层时,它需要将PDU交付给上层,而上层协议众多,所以在处理数据的时候,必须要一个字段标识我这个交付给谁。如,该字段为0×0800时,表示将有效载荷交付给IP协议,为0×0806交付给ARP,0X8035交付给RARP。

数据:数据也叫有效载荷,除过当前层协议需要使用的字段外,即需要交付给上层的数据,以太网帧数据长度规定最小为46字节,最大为1500字节,如果有不到46字节时,会用填充字节填充到最小长度。最大值也叫最大传输单元(MTU)。

帧检验序列FCS(使用CRC校验法):检测该帧是否出现差错。抓包时无法看到4字节校验值。

以太网规定以太网帧数据域部分最小为64字节(6字节目的MAC地址+6字节源MAC地址+2字节协议类型+最小46字节数据+4字节CRC校验),CRC校验抓包时无法看到。数据字段长度小于46字节时,MAC子层会在数据字段的后面填充以满足数据帧长度不小于64字节。由于填充数据由MAC子层负责,不同的抓包软件抓到的数据帧大小可能不同,比如一个TCP的ACK确认帧,有的抓包软件显示是54字节,有的显示是60字节。显示60字节的后面有填充数据段。

TCP连接过程解析

TCP客户端和服务器之间建立连接的过程称为3次握手过程。握手过程由客户端程序首先发起,整个过程要经历下面3个步骤:

1、客户端发送一个SYN标志置1的TCP报文段,报文段首部指明自己的端口号及期望连接的服务器端口好。在报文段中,客户端需要通告自己的初始序号ISN,除此之外,这个报文中还可以携带一些选项字段,例如最大报文段大小、窗口扩大因子,选项将客户端的一些连接属性通告给服务器。本报文段中ACK标志为0,因此它的确认号字段和通告窗口大小字段都会被视为无效。

00 E0 66 78 3A 84 E2 BB BC 41 4F 5A 08 00 45 00 00 3C 55 24 40 00 40 06 5B B6 C0 A8 03 77 C0 A8 05 1A E2 9E 1F 99 BE B1 91 02 00 00 00 00 A0 02 39 08 6F 08 00 00 02 04 05 B4 04 02 08 0A FF FF C4 26 00 00 00 00 01 03 03 02

00 E0 66 78 3A 84-以太网目的地址

E2 BB BC 41 4F 5A -以太网源地址

0800-帧类型,IP数据包

后面的为IP数据包

45-4表示使用IPV4版本,5*4=20字节,表示IP首部长度是20字节

00-TOS,描述当前IP数据报急需的服务类型,如最小延时,最大吞吐量,最高可靠性,最小费用等。路由器在转发数据报时,可以根据这个字段的值来为数据报选择最合理的路由路径。

003C-总长度,表示整个IP数据报(IP首部和数据区)的总字节数。总共60字节。

5524-16位标识字段,用于标识IP层发送出去的每一份IP数据报,每发送一份报文,该值加1,数据包被分片时,该字段会被复制到每一个分片中,在接收端,会使用这个字段值来组装所有分片为一个完整的数据报。

4000-3位标志字段和13位分片偏移量。高3位为010,第1位保留为今后使用,第2位是不分片位,此处为1,表示不分片。当该位为0时,IP层将在需要的时候对数据报进行分片处理。第3位表示更多分片位,此处为0,表示该分片是数据报的最后一个分片或者是唯一的分片,如果为1,说明该分片不是数据报的最后一个分片,后面还有分片的数据包。

13位偏移字段表示当前分片所携带的数据在整个数据报中的相对位置(以8字节为单位)。目的站必须收到从0偏移量到最高偏移量的所有分片,才能将分片重装成一个完整的数据报。每个分片在网络中断单独传输,它们到达终点的顺序可能会不相同,但在目的端,将按照分片的偏移量来顺序组织各个分片。

40-生存时间TTL。描述该IP数据报最多能被转发的次数,每经过一次转发,该值会减1,当该值为0时,路由器会丢弃掉分组,同时一个ICMP差错报文会被返回至源主机。

06-协议字段,1-表示ICMP协议,2-表示IGMP协议,6-表示TCP协议,17-表示UDP协议。

5BB6-首部校验和

C0A80377-源IP地址

C0A8051A -目的IP地址

继续阅读

CPU卡电子钱包圈存与消费(三)

三、 消费

1、选择3F01目录

Send Data : 00 A4 00 00 02 3F 01

RSP[88]: 6F 54 84 09 A0 00 00 00 03 86 98 07 01 A5 47 9F 08 01 02 9F 0C 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 00

2、取8字节随机数

Send Data :0084000008

RSP[10]: 9B 36 1B 26 CB 9F A8 C8 90 00

3、对随机数进行3DES加密

加密数据:9B 36 1B 26 CB 9F A8 C8

加密密钥:39393939393939393939393939393939(3F01目录外部认证密钥)

处理结果:97 F5 57 D8 ED E9 7F 95

4、外部认证

Send Data :008200000897F557D8EDE97F95

RSP[2]:9000

5、读余额

Send Data :805C000204

RSP[6]: 00 00 12 34 90 00

6、消费初始化

805001020B0000000002000000000001

RSP[17]: 00 00 12 34 00 00 00 00 00 00 01 2A B5 07 51 90 00

电子存折或电子钱包旧余额:00001234

电子存折或电子钱包脱机交易序号:0000

透支限额:000000

密钥版本号:00

算法标识:01

随机数:2A B5 07 51

计算过程密钥

过程密钥由DATA中第一字节即密钥标识符指定的消费密钥对(4字节随机数+2字节电子存折或电子钱包脱机交易序号+终端交易序号的最右两字节)3DES数据加密生成

终端交易序号在消费命令中指定,可以设置位00000000

密钥: 3E013E013E013E013E013E013E013E01
数据:2A B5 07 51 00 00 00 00
加密结果:3A A4 9C 8C D5 B4 45 75

计算消费命令中的MAC1

MAC1由过程密钥对(4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节终端交易日期+3字节终端交易时间)DES数据加密生成

交易金额:00000002

交易类型标识:

05-电子存折消费

06-电子钱包消费

终端机编号:000000000001

交易日期20180807

交易时间163500

clip_image002

得到MAC1 : 677E4922

7、消费

805401000F0000000020180807163500677E4922

RSP[10]: 78 5C 74 07 6B 7F 5B EC 90 00

交易验证码TAC: 78 5C 74 07

MAC2: 6B 7F 5B EC

校验MAC2

MAC2由过程密钥对4字节交易金额DES数据加密生成

clip_image004

加密结果见上图,校验成功。

校验TAC

TAC码由TAC密钥左右8字节异或运算的结果对(4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节终端交易序号+4字节主机交易日期+3字节主机交易时间)DES数据加密生成

内部密钥为:34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34

TacKey.Left(8) = 3434343434343434

TacKey.Right(8) = 3434343434343434

XOR 结果 = 0000000000000000

交易金额:00000002

交易类型:06

终端机编号:000000000001

终端交易序号:00000000

交易日期:20180807

交易时间:163500

clip_image006

加密结果见上图,校验成功。

8、读余额

805C000204

RSP[6]: 00 00 12 34 90 00

RSP[6]: 00 00 12 32 90 00

扣费成功

扣费不需要验证PIN码。

CPU卡电子钱包圈存与消费(二)

二、 圈存命令

1、选择3F01目录

Send Data : 00 A4 00 00 02 3F 01

RSP[88]: 6F 54 84 09 A0 00 00 00 03 86 98 07 01 A5 47 9F 08 01 02 9F 0C 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 00

2、取8字节随机数

Send Data :0084000008

RSP[10]: 9B 36 1B 26 CB 9F A8 C8 90 00

3、对随机数进行3DES加密

加密数据:9B 36 1B 26 CB 9F A8 C8

加密密钥:39393939393939393939393939393939(3F01目录外部认证密钥)

处理结果:97 F5 57 D8 ED E9 7F 95

4、外部认证

Send Data :008200000897F557D8EDE97F95

RSP[2]:9000

5、校验pin码

Send Data : 00 20 00 00 03 12 34 56
Recv Data : 90 00

6、读余额

Send Data : 80 5C 00 02 04

RSP[6]: 00 00 00 00 90 00

7、初始化圈存

Send Data : 80 50 00 02 0B 0000001234000000000001

RSP[18]: 00 00 00 00 00 00 00 01 F9 CA BA 91 6C 39 4D 64 90 00

电子存折或电子钱包旧余额 00000000

电子存折或电子钱包联机交易序号0000 (注意交易序号每次会变化)

密钥版本号:00

算法标识:01

伪随机数:F9 CA BA 91

MAC1: 6C 39 4D 64

算法标识

00-3DES

01-DES

02-255保留

计算过程密钥

过程密钥由DATA中第一字节即密钥标识符指定的圈存密钥对(4字节随机数+2字节电子存折或电子钱包联机交易序号+8000)3DES数据加密生成

密钥: 3F013F013F013F013F013F013F013F01
数据:F9 CA BA 91 00 00 80 00
加密结果:03 01 5B EA 34 7E A2 31

计算MAC1

MAC1由过程密钥对(4字节电子存折或电子钱包旧余额+4字节交易金额+1字节交易类型+6字节终端机编号)DES数据加密生成

交易类型:

旧余额:00000000

交易金额:00001234

交易类型:

01-电子存折圈存

02-电子钱包圈存

终端机编号:000000000001

KEY: 03 01 5B EA 34 7E A2 31

INITDATA: 0000000000000000

DATA: 000000000000123402000000000001

clip_image002

MAC的高4位和卡片返回的MAC1相等,证明命令执行正确

计算圈存命令中的MAC2

MAC2由过程密钥对(4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节主机交易日期+3字节主机交易时间)DES数据加密生成

交易金额:00001234

交易类型:02

终端机编号:000000000001

交易日期:20180805

交易时间:164522

密钥:03 01 5B EA 34 7E A2 31

初始向量: 0000000000000000

数据 : 000012340200000000000120180805164522

取前4个字节:

MAC2 = 7F4F6613

clip_image004

7、圈存

Send Data : 80 52 00 00 0B 201808051645227F4F6613

RSP[6]: F7 C1 CC 20 90 00

返回的交易验证TAC码:

F7 C1 CC 20

验证TAC码

TAC码由TAC密钥左右8字节异或运算的结果对(4字节电子存折或电子钱包新余额+2字节电子存折或电子钱包联机交易序号+4字节交易金额+1字节交易类型标识+6字节终端机编号+4字节主机交易日期+3字节主机交易时间)DES数据加密生成

新余额:00001234

交易序号:0000

交易金额:00001234

交易类型标识:02

终端机编号:000000000001

交易日期:20180805

交易时间:164522

内部密钥为:34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34

TacKey.Left(8) = 3434343434343434

TacKey.Right(8) = 3434343434343434

XOR 结果 = 0000000000000000

密钥: 0000000000000000

初始向量: 0000000000000000

数据: 000012340000000012340200000000000120180805164522

clip_image006

计算结果MAC高4字节与卡片返回的TAC相同,圈存成功

8、读余额

Send Data : 80 5C 00 02 04

RSP[6]: 00 00 12 34 90 00

CPU卡电子钱包圈存与消费(一)

首先了解下电子钱包和电子存折的区别:

1、 电子钱包EP:electronic purse

2、 电子存折ED:electronic deposit

3、 电子钱包一般只支持圈存,消费交易,很少的电子钱包支持圈提。电子存折支持圈存,消费,圈提,修改透支限额等功能。

4、 电子钱包消费时无需提交个人PIN,而电子存折消费时必须提交个人PIN。

电子钱包功能简单(只支持圈存和消费),消费简便(不需提交PIN),因此在小额扩展应用中远远要比电子存折来的方便和快速。

一、 CPU卡发卡建立电子钱包命令 继续阅读

STM8S定时器1实现PWM功能

TIM1由一个16位自动装载计数器组成,由一个可编程的预分频器驱动。可用来输出PWM波形。

TIM1的PWM模式可以产生一个由TIM1_ARR寄存器确定频率,由TIM1_CCRi确定占空比的信号。

TIM1由4个独立的捕获/比较通道,其中TIM1_CH1,TIM1_CH2,TIM1_CH3由都对应的互补输出引脚TIM1_CH1N,TIM1_CH2N,TIM1_CH3N.TIM_CH4没有互补输出引脚。TIM1_CH1,TIM1_CH2,TIM1_CH3,TIM1_CH1N,TIM1_CH2N,TIM1_CH3N常用于直流无刷电机的六步PWM控制。

以下是设置TIM1_CH1,TIM1_CH2,TIM1_CH3引脚输出30%占空比的例子,TIM1_CH1N,TIM1_CH2N,TIM1_CH3N不输出。PWM信号频率为16K。

clip_image002[4]

需要配置STM8S的选项设置管脚的功能,选择PWM1模式

clip_image004[4]

注意这里的有效电平要和TIM1_CCER1,TIM1_CCER2里的CCiP对应起来

clip_image006[4]

image

UCOS中PENDSV和SYSTICK中断优先级

PENDSV和SYSTICK属于系统异常,定时器中断,串口中断这些属于外部中断。PENDSV和SYSTICK的中断优先级可以编程,一般要把PENDSV的优先级设置成最低。在很多CM3内核芯片的UCOS-II移植例子中,PENDSV和SYSTICK的优先级都设置成OxFF.都是最低优先级,因为PENDSV在中断向量表中排在SYSTICK前面,所以如果PENDSV,SYSTICK同时产生中断,PENDSV优先中断。

在UCOS中,如果产生中断嵌套,在退出最后一个中断时,OSIntExit()函数调用OSIntCtxSw()函数执行任务切换。在OSIntCtxSw()函数中,悬起PENDSV,然后在PENDSV中断函数中进行任务切换。

在PENDSV中断中,首先会关闭总中断,执行完任务切换后才开启总中断,避免PENDSV中断被其它中断打断,产生不可预料的结果。

SYSTICK的中断处理函数主要是调用函数OSTimeTick ()来完成系统在每个时钟节拍需要完成的工作,调用OSTimeTick()做了两件事情:一是把用来记录时间进程的计数器OSTime加1;二是遍历任务控制块链表中的所有任务控制块,把各个任务控制块中用来存放任务延时时限的OSTCBDly变量减1,并使该项为0,同时又不是被挂起的任务(即延时时间已到的任务)进入就绪状态。SYSTICK的中断优先级比PENDSV高还是低并没有什么影响。

LPC1768中断优先级设置

首先,说说中断优先级,所有中断均有一个优先级,

1、 更低的优先级数字代表着更高优先级

2、 除了RESET, Hard fault, NMI等系统级中断,其他所有中断优先级均可配置为”0~31″。

如果软件没有配置这些中断的优先级,那么所有中断的优先级默认为最高优先级”0″。此处 实例说明这个中断优先级的概念,假设三个外部中断”A,B,C”,”A,B”配置为”0″,”C”配置为”1″,

1、 如果三个中断同时产生,那么”A,B”中断优先”C”中断运行。

2、 “A,B”中断同时产生,谁更优先执行呢?那就根据中断向量表的排号,低的优先执行。

3、 若是”C”的中断正在运行,此时”A”的中断发生,那么”A”的中断会抢占”C”的执行权限,优先执行。

4、 若是”A”的中断正在运行,此时”B”的中断发生,那么新产生的”B”中断会进入等待状态,等 待”A”执行完毕再执行。

以上,只是单纯的判断优先级值来控制中断的顺序,为了增强中断的控制逻辑,ARM新增了优先级 组的概念。即相同的优先级等级可以分配在一组优先级内,在这一组优先级内再来定义次优先级,具 体是怎么一个概念呢?还是假设有四个中断”A,B,C,D”,”A,B,C”配置在优先级组”0″内,”A,B”中断配 置次优先级”0″,”C”配置为次优先级”1″,”D”则配置为优先级组”1″

1、 若”A,D”中断同时产生,则优先级高的”A”会优于”D”中断执行。

2、 若”A,C”中断同时产生,则优先级次优先级高的”A”会优先执行。

3、 若”A,B”中断同时产生,则根据中断向量表的位置,排号低的优先执行。

4、 若”D”正在执行中断,此时”A”中断来了,那么”A”中断会抢占”D”中断优先执行。因为”A”所 在的优先级组高于”D”。

5、 若”C”正在执行中断,此时”A”中断来了,那么”A”中断会等待”C”执行完毕再执行。因为属于同一优先级组。

ARM用了一个8位寄存器来定义优先级组和次优先级的概念。中间可以选择一个端点,高位表示有多少个主优先级,低位表示有多少个次优先级。而LPC1769只用了其中5位。

CM3每个中断都有一个优先级寄存器,对LPC1768来说,使用了高5位,低3位固定为0。

clip_image002

在CM3权威指南中

clip_image004

因为LPC1768低3位固定为0,所以优先级分组是从2-7.

clip_image006

最好选择分组2,B7-B3表达抢占优先级,没有子优先级位段。总共可以设置0-31个抢占优先级中断。抢占优先级可以实现中断嵌套。

UDP绑定IP_ADDR_ANY和固定IP的区别

在LWIP中,初始化一个UDP端口

struct udp_pcb *FirstUpcb;

如果绑定控制器的IP,要如下定义:

void First_UdpInit(void)

{

ip_addr_t local_ipaddr;

IP4_ADDR(&local_ipaddr,MyIP[0],MyIP[1],MyIP[2],MyIP[3]);

FirstUpcb = udp_new();

udp_bind(FirstUpcb,&local_ipaddr,FirstUdpport);

udp_recv(FirstUpcb,udp_callback,NULL);

}

MyIP[0],MyIP[1],MyIP[2],MyIP[3]为控制器的IP。

如果绑定IP_ADDR_ANY,如下定义:

void First_UdpInit(void)

{

FirstUpcb = udp_new();

udp_bind(FirstUpcb,IP_ADDR_ANY,FirstUdpport);

udp_recv(FirstUpcb,udp_callback,NULL);

}

当上位机发送一个UDP广播数据:

FF FF FF FF FF FF 00 E0 66 78 3A 84 08 00 45 00 00 2B 2F 01 00 00 40 11 85 FF C0 A8 05 1A FF FF FF FF 27 0E 27 0E 00 17 C5 EA 02 00 0B FF FF FF FF FF FF 31 55 00 FF 90 03

FF FF FF FF FF FF:目的MAC地址,表示是广播

00 E0 66 78 3A 84 :源MAC地址

08 00:帧类型,表示是IP包

以上是14字节以太网首部数据。

45 00 00 2B 2F 01 00 00 40 11 85 FF C0 A8 05 1A FF FF FF FF

是20字节IP首部,其中C0 A8 05 1A是源IP地址,FF FF FF FF是目的IP地址,这里表示是广播地址。

27 0E 27 0E 00 17 C5 EA

是UDP首部

02 00 0B FF FF FF FF FF FF 31 55 00 FF 90 03

是UDP数据。

如果控制器采用第一种方式初始化UDP端口,绑定自己的IP地址,那么不会接收这条UDP命令,因为这条命令的目的IP地址不等于本地IP地址。

如果控制器采用第二种方式初始化UDP端口,绑定IP_ADDR_ANY,控制器会接收到这条命令,UDP的回调函数会处理这条命令。

IP_ADDR_ANY的意思是,只要UDP数据的目的端口和UDP绑定的端口一样,UDP控制块就会处理这条数据,不管这条数据的目的IP是不是发送给本地IP。

第 1 页,共 7 页12345...最旧 »