找回密码
 注册
搜索
查看: 583|回复: 4

[讨论] 谁能解释一下tcp在ppp中的格式?

[复制链接]
发表于 2008-4-29 18:07:32 | 显示全部楼层 |阅读模式
typedef struct
{
   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头
 楼主| 发表于 2008-4-29 18:10:06 | 显示全部楼层
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;
}
点评回复

使用道具 举报

 楼主| 发表于 2008-4-29 18:13:37 | 显示全部楼层
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;
}
点评回复

使用道具 举报

 楼主| 发表于 2008-4-29 18:23:11 | 显示全部楼层
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;
}
点评回复

使用道具 举报

 楼主| 发表于 2008-4-29 18:24:07 | 显示全部楼层
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;
}
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-8 10:28 , Processed in 0.045002 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表