UNetConnection::ReceivedPacket 初步v1.0

2021-01-16 05:11

阅读:651

标签:asp   private   packetin   停止   sizeof   str   jpg   serialize   opera   

1.普通的Packet会经过哪几个函数?

2.PacketNotify.ReadHeader(Header, Reader),是怎么读的Header的。

 在ReadHeader内部有利用Reader对象对operator

在Reader对象operator

IsByteSwapping()的函数:判断是大端还是小端的字节序?、依据解析大概率会进入Serialize(&Value, sizeof(T)); T是:Value的类型。Dest是指针指向一个32位的数字。然后会来到Reader对象的SerializeBits( void* Dest, int64 LengthBits )函数,最后到了之前解析过的:appBitsCpy((uint8*)Dest, 0, Buffer.GetData(), (int32)Pos, (int32)LengthBits);在这里读了哪些数据赋值到了(读了Reader对象buffer里面的第一个字节到Header里面)

PackedHeader=64、105、139、60=01000000 01101001 10001011 00111100

3.ReadHeader()函数拿到包头PackedHeader后开始解包:

Data.Seq = FPackedHeader::GetSeq(PackedHeader):对PacketHeader右移18位&(0011111111111111)= 00000000 00000000 00010000 00011010=4122。右移18位意味着高位14位有效。

Data.AckedSeq = FPackedHeader::GetAckedSeq(PackedHeader):右移4位&(0011111111111111)=00000100 00000110 10011000 10110011&(0011111111111111)=

Data.HistoryWordCount = FPackedHeader::GetHistoryWordCount(PackedHeader) + 1;

因此32位的PacketHeader,14位用于表示Seq、14位用于表示AckedSeq、4位用于标识HistoryWordCount。

4.往后读取一个比特表示是否bHasPacketInfoPayload

bHasPacketInfoPayload = Reader.ReadBit() == 1u;

5.读取Read jitter clock time from the packet header

uint32 PacketJitterClockTimeMS = 0;

Reader.SerializeInt(PacketJitterClockTimeMS, UE4_NetConnectionPrivate::MaxJitterClockTimeValue + 1);

这里并不是读32位,而是一直读取位保存该值直到指定最大值为:UE4_NetConnectionPrivate::MaxJitterClockTimeValue + 1,时停止读取。

6.执行ProcessJitter:干的事情似乎是保存某些值

7.根据接收到的Packet算出PacketSequenceDelta,当其值大于某个界限时才认为有发生了丢包。

8.如果有Packet没有按增序到达,但也并没有认为是发生了丢包,那么会Cache这个Packet

9.NetConnection的几个关于Packet的成员变量:

   InPacketsLost:丢失了几个Packet,当上一次收到的序列号是1,下一次收到的3时,可知丢失了1个Packet。

  InTotalPacketsLost:总共丢失的几个Packet。

   InPacketId:???

10.如果bHasPacketInfoPayLoad为True的话。BitReader还有几个比特记录了额外的消息

在ReadPacketInfo(Reader, bHasPacketInfoPayload);里面会读出来

11.PacketNotify.Update(Header, HandlePacketNotification);

技术图片

在PacketNotify.Update(Header, HandlePacketNotification)函数内做的几个事情:

1.计算得到当前接收到的AckedSeq和OutAckSeq的差值,在这里等于:5197-5195等于2;

2.调用UpdateInAckSeqAck()函数,传入上面的差值和当前接收到的AckedSeq

  有一个AckRecord数据成员,是一个循环队列。每发出一个Packet就会记录,目前队列里面的内容大概为:5196、5197、5198、5199

  先pop出来一个,将5196对于的数据移出队列。然后拿到队头5197的数据:FSentAckData AckData,并pop出队列

  如果AckData的OutSeq等于接收到的AckedSeq,那么就见AckData中的InAckSeq返回,这个InAckSeq等于7981,然后赋值给NetConnection的InAckSeqAck。

  也就是说明了在FSendAckData中,5197是对应了7981的。5197的Ack是对7981的Ack的Ack,二次确认的意思?

3.while循环对5195、5196、5197进行处理

12.开始拆分Packet中包含的Bunches

 

UNetConnection::ReceivedPacket 初步v1.0

标签:asp   private   packetin   停止   sizeof   str   jpg   serialize   opera   

原文地址:https://www.cnblogs.com/jialin0x7c9/p/13334681.html


评论


亲,登录后才可以留言!