谁能解释一下tcp在ppp中的格式?
{
u8 Pct; //0x45
u8 Svr; //0x00
u8 pktLen[2]; //
u8 Flag[2]; //0x0000
u8 Offs[2]; //offset
u8 pTime; //0x40
u8 pctCode; //0x11
u8 IPHChksum[2]; //
u8 SIP[4]; //
u8 OIP[4]; //
u8 SPort[2];//下位UDP头
u8 OPort[2];
u8 UdpLen[2];
u8 UdpChksum[2];
}UDPH;
typedef struct
{
u8 Pct; //0x45 版本和头长度
u8 Svr; //0x00 服务类型
u8 pktLen[2]; //包长度
u8 Flag[2]; //0x0000 标志
u8 Offs[2]; //offset 分块偏移
u8 pTime; //0x40 TTL
u8 pctCode; //0x11 协议
u8 IPHChksum[2]; //
u8 SIP[4]; //源IP
u8 OIP[4]; //目的IP
u8 SPort[2];//下为TCP头
u8 OPort[2];
u8 Sn[4];
u8 AckSn[4];
u8 DOffs;
u8 Action;
u8 Window[2];
u8 TcpChkSum[2];
u8 UP[2];
u8 Option[2][4]; //可能有更多个选项
}TCPH;//IP头和TCP头
typedef struct
{
u8 SPort[2];
u8 OPort[2];
u8 Sn[4];
u8 AckSn[4];
u8 DOffs;//头长度
u8 Action;//标志
u8 Window[2];
u8 TcpChkSum[2];
u8 UP[2];
u8 Option[2][4]; //可能有更多个选项
}TCP;//TCP头
u16 MakeTcpPkt(u8 *dat,u16 len,u8 Type,u8 Offs)
{
TCPH *hp;
u16 i;
u16 k;
u16 length;
for(i=0;i<sizeof(TCPH);i++) tPacket=0;
tPacket[0]=0x7e;//ppp报文头
if(Type&TIP) tPacket[1]=0x2F;
else tPacket[1]=0x21;//IP协议
//制作IP报文头
hp=(TCPH *)(tPacket+2);
hp->Pct=0x45; hp->Svr=0x00;
k=sizeof(TCPH)-8+len; //IPH lenght
if(Type&SIZ) k+=4;
hp->pktLen[0]=k>>8;
hp->pktLen[1]=k;
memmove(hp->Flag,PID,2);
PID[1]++;
if(PID[1]==0) PID[0]++;
//hp->Flag[0]=0; hp->Flag[1]=1;
hp->Offs[0]=PFlag; hp->Offs[1]=Offs<<4;
hp->pTime=0xfe;
if(Type&TIP) hp->pctCode=0;
else hp->pctCode=6;//IP承载TCP数据
hp->IPHChksum[0]=0; hp->IPHChksum[1]=0;
memmove(hp->SIP,IP00,4);
memmove(hp->OIP,IP01,4);
//制作TCP报文头
memmove(hp->SPort,SPort,2);
//hp->SPort[0]=0x04; hp->SPort[1]=0x00;
memmove(hp->OPort,OPort,2);
memmove(hp->Sn,TsNo,4);//生成本报文序号
memmove(hp->AckSn,AckNo,4);//生成确认报文序号
if(Type&SIZ) hp->DOffs=0x60;//TCP包头长度
else hp->DOffs=0x50;
hp->Action=Type&0x3f;//TCP包头标志
memmove(hp->Window,Window,2);
hp->TcpChkSum[0]=0;
hp->TcpChkSum[1]=0;
hp->Option[0][0]=0x02;
hp->Option[0][1]=0x04;
hp->Option[0][2]=TCP_DAT_LEN/256;
hp->Option[0][3]=TCP_DAT_LEN;
if(Type&SIZ) memmove(tPacket+sizeof(TCPH)-8+4+2,dat,len);
else memmove(tPacket+sizeof(TCPH)-8 +2,dat,len);
//制作PPP报文尾
k=IPHCheckSum(tPacket)^0xffff;
hp->IPHChksum[0]=k>>8;
hp->IPHChksum[1]=k;
k=TcpCheckSum(tPacket)^0xffff;
hp->TcpChkSum[0]=k>>8;
hp->TcpChkSum[1]=k;
if(Type&SIZ) len+=4;
//k=pppFCS(0xffff,tPacket+1,len+sizeof(TCPH)-8+1)^0xffff;
//tPacket[len+sizeof(TCPH)-8+2]=k;
//tPacket[len+sizeof(TCPH)-8+3]=k>>8;
tPacket[len+sizeof(TCPH)-8+4]=0x7e;
length=len+sizeof(TCPH)-8+5;
return length;
}
u16 sktACK()
{
u16 n,m,r;
u16 k;
u8 gbuf[2];
TCP *tp;
n=0;
if(sktFlag==0) return 0;
BackIP();
k=CheckIP(rPacket);
if(k==0xff)
{
sktFlag=1;
m=GetTcpStart(rPacket);
tp=(TCP *)(rPacket+m);
r=0;
if(MemComp(tp->Sn,AckNo,4)==0) r=1;
memmove(AckNo,tp->Sn,4);
memmove(TsNo,tp->AckSn,4);
m=GetTcpDataStart(rPacket);
k=GetTcpDataLen(rPacket);
IncSerialNo(AckNo,k);
if(k>0)
{
if(r==0)
{
n=k;
memmove(HostBuff,rPacket+m,k);
HostDataLen=n;
}
k=MakeTcpPkt(gbuf,0,ACK,0);
SendPacket(tPacket,k);
if(tp->Action&FIN)
{
k=MakeTcpPkt(tPacket,0,ACK|FIN,0);
SendPacket(tPacket,k);
}
}
else
{
if((tp->Action&RST)){sktFlag=0;}
else if((tp->Action&FIN))
{
IncSerialNo(AckNo,1);
k=MakeTcpPkt(tPacket,0,ACK,0);
SendPacket(tPacket,k);
k=MakeTcpPkt(gbuf,0,ACK|FIN,0);
SendPacket(tPacket,k);
sktFlag=0;
}
else
{
sktFlag=1;
}
}
}
RestoreIP();
return n;
}
u16 TcpCheckSum(u8 *p)
{
u8 *sp;
u16 len,i;
u16 tcsm,c,tlen;
tcsm=0;
sp=GetStartPos(p);
sp++;
if(p[1]==0xff) sp++;
len=(sp[0]&0x0f)*4;
//累加伪报头
tlen=sp[2]; //累加tcp报长度
tlen<<=8;
tlen+=sp[3];
c=tlen-len;
//c+=sp[9];
c+=0x06;
tcsm=c; //累加tcp协议码
len>>=1;
for(i=6;i<len;i++) //源、目标IP地址累加
{
c=sp[2*i];
c<<=8;
c+=sp[2*i+1];
tcsm+=c;
if(tcsm<c) tcsm++;
}
// 累加tcp包数据
sp+=len*2;
len=tlen/2-len;
for(i=0;i<len;i++) //累加数据
{
c=sp[2*i];
c<<=8;
c+=sp[2*i+1];
tcsm+=c;
if(tcsm<c) tcsm++;
}
if(tlen&0x01)
{
c=sp[2*i];
c<<=8;
tcsm+=c;
if(tcsm<c) tcsm++;
}
return tcsm;
}
u16 UdpCheckSum(u8 *p)
{
u8 *sp;
u16 len,i;
u16 tcsm,c;
tcsm=0;
sp=GetStartPos(p);
sp++;
if(p[1]==0xff) sp++;
len=(sp[0]&0x0f)*4;
// 累加伪报头
c=sp[2];
c<<=8;
c+=sp[3];
c-=len;
c+=sp[9]; //累加udp协议代码
tcsm=c;
len>>=1;
for(i=6;i<len;i++) //源、目标IP地址累加
{
c=sp[2*i];
c<<=8;
c+=sp[2*i+1];
tcsm+=c;
if(tcsm<c) tcsm++;
}
len<<=1;
// 累加udp包
c=sp[len+4];
c<<=8;
c+=sp[len+5];
sp+=len;
len=c/2;
if(c&0x01)
{
c=sp[2*len];
c<<=8;
tcsm+=c;
if(tcsm<c) tcsm++;
}
for(i=0;i<len;i++)
{
c=sp[2*i];
c<<=8;
c+=sp[2*i+1];
tcsm+=c;
if(tcsm<c) tcsm++;
}
return tcsm;
}
