📄 tcp.c
字号:
void Process_TCP_Timeout(void)
{
TCPTimeout=0; //超时标志清零
Process_Resend_Buff();
if((TCPStatus == TCP_STATE_ESTABLISHED) || (TCPStatus == TCP_STATE_CLOSE_WAIT))
{
TCPSendNextNr += TCPTxDataLenth;
Prepare_TCP_Frame(TCP_CODE_ACK | TCP_CODE_PSH);
}
if(TCPStatus == TCP_STATE_TIME_WAIT)
Delete_Socket();
if(TCPStatus == TCP_STATE_CLOSE_WAIT)
{
TCPTxDataLenth = 0;
Prepare_TCP_Frame(TCP_CODE_FIN | TCP_CODE_ACK);
TCPStatus = TCP_STATE_LAST_ACK;
}
}
/*
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
+---------+ CLOSE | \
| LISTEN | ---------- | |
+---------+ delete TCB | |
rcv SYN | | SEND | |
----------- | | ------- | V
+---------+ snd SYN,ACK / \ snd SYN +---------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd ACK | |
| |------------------ -------------------| |
+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<----------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
------------------------>|TIME WAIT|------------------>| CLOSED |
+---------+ +---------+
*/
void Process_TCP_Frame(void)
{
Uint16 TCPOptionLenth;
TCPTimeout = 0;
TCPResendCount = 20;
TCPResendNumFlag = 0;
CopyFrameFromBE(RTL8019_HEADER_SIZE + TCP_HEADER_START, 10);
TCPOptionLenth = (*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 6) >> 12) * 2 - 10;
if(TCPOptionLenth)
CopyFrameFromBE((RTL8019_HEADER_SIZE + TCP_HEADER_START + TCP_HEADER_SIZE), TCPOptionLenth);
TCPRxDataLenth = RecdIpFrameLenth - IP_HEADER_SIZE-TCP_HEADER_SIZE - TCPOptionLenth;
TCPRemotePort = *(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START); //接收到的源端口,返回数据时作为目的端口
if((MyIP[0] == *(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + IP_HEADER_START + 8)) && (MyIP[1] == *(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + IP_HEADER_START + 9)))
{
if(*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 1) == MY_TCP_PORT) //目的端口与本机端口相等
{
switch(TCPStatus)
{
case 0: TCP_Listen(); //TCP_STATE_LISTEN,
break;
case 1: TCP_Syn_Rec(); //TCP_STATE_SYN_RCVD,收到SYN帧后,被动打开后处于此状态
break;
case 2: TCP_Syn_Sent(); //TCP_STATE_SYN_SENT,主动打开后处于此状态
break;
case 3: TCP_Established(); //TCP_STATE_ESTABLISHED
break;
case 7: TCP_Close_Wait(); //TCP_STATE_CLOSE_WAIT
break;
case 8: TCP_Last_Ack(); //TCP_STATE_LAST_ACK
break;
}
}
}
}
/*
| |LISTEN
| SYN J |
SYN_SENT|------------------------>|SYN_RECVD
| SYN K,ACK J+1 |
ESTABLISHED|<------------------------|
| ACK K+1 |
|------------------------>|ESTABLISHED
| . |
| . |
| . |
| FIN M |
FIN_WAIT_1|------------------------>|CLOSE_WAIT
| ACK M+1 |
FIN_WAIT_2|<------------------------|
| FIN N |
TIME_WAIT|<------------------------|LAST_ACK
| ACK N+1 |
|------------------------>|CLOSED
*/
void TCP_Listen(void)
{
Uint16 Temp,CalcCkSum;
if(*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 6) & TCP_CODE_SYN) //SYN位为1
{
TCPIRSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+2)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+3)));
TCPAckNr=TCPIRSeq+1; //收到的对方的TCP序号+1
TCPSegNr=TCPSendNextNr; //本次发送的序号,随机取一个
TCPSent_UnAck=TCPSegNr; //未得到确认的TCP序号
TCPSendNextNr=TCPSegNr+1; //下次发送的序号
DestMaxSegSize=560;
if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+10)==0x0204)
{
Temp=*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+11);
DestMaxSegSize=(Temp>>8)*256+(Temp&0xFF);
}
//Ethnet
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START),&RecdFrameMAC,3);
memcpy((TxEthnetFrameBuffer+ETH_HEADER_START+3),&MyMAC,3);
*(TxEthnetFrameBuffer+ETH_HEADER_START+6)=SwapWord(Frame_IP);
//IP
*(TxEthnetFrameBuffer+IP_HEADER_START+0)=SwapWord(Ip_Edition);
*(TxEthnetFrameBuffer+IP_HEADER_START+1)=SwapWord((IP_HEADER_SIZE+TCP_HEADER_SIZE+4)*2);
*(TxEthnetFrameBuffer+IP_HEADER_START+2)=0;
*(TxEthnetFrameBuffer+IP_HEADER_START+3)=0;
*(TxEthnetFrameBuffer+IP_HEADER_START+4)=SwapWord((DEFUALT_TTL<<8)|PROTOCOL_TCP);
*(TxEthnetFrameBuffer+IP_HEADER_START+5)=0;
memcpy((TxEthnetFrameBuffer+IP_HEADER_START+6),&MyIP,2);
memcpy((TxEthnetFrameBuffer+IP_HEADER_START+8),&RecdFrameIP,2);
CalcCkSum=CalcCheckSum((TxEthnetFrameBuffer+IP_HEADER_START),IP_HEADER_SIZE,0,0);
if(!CalcCkSum)
CalcCkSum=0xFFFF;
*(TxEthnetFrameBuffer+IP_HEADER_START+5)=CalcCkSum;
//TCP
*(TxEthnetFrameBuffer+TCP_HEADER_START+0)=SwapWord(MY_TCP_PORT);
*(TxEthnetFrameBuffer+TCP_HEADER_START+1)=SwapWord(TCPRemotePort);
WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+2),TCPSegNr);
WriteDWord((TxEthnetFrameBuffer+TCP_HEADER_START+4),TCPAckNr);
*(TxEthnetFrameBuffer+TCP_HEADER_START+6)=SwapWord(0x7000|(TCP_CODE_SYN|TCP_CODE_ACK)); //SYN位及ACK位均置1
*(TxEthnetFrameBuffer+TCP_HEADER_START+7)=SwapWord(1024);
*(TxEthnetFrameBuffer+TCP_HEADER_START+8)=0;
*(TxEthnetFrameBuffer+TCP_HEADER_START+9)=0;
*(TxEthnetFrameBuffer+TCP_HEADER_START+10)=SwapWord(0x0204);
*(TxEthnetFrameBuffer+TCP_HEADER_START+11)=SwapWord(MY_MAX_SEG_SIZE);
*(TxEthnetFrameBuffer+TCP_HEADER_START+12)=SwapWord(0x0101);
*(TxEthnetFrameBuffer+TCP_HEADER_START+13)=SwapWord(0x0101);
CalcCkSum = CalcCheckSum((TxEthnetFrameBuffer+TCP_HEADER_START),14,1,0);
if(!CalcCkSum)
CalcCkSum=0xFFFF;
*(TxEthnetFrameBuffer+TCP_HEADER_START+8)=CalcCkSum;
TxFrameSize=ETH_HEADER_SIZE+IP_HEADER_SIZE+14;
SendFrame(TxEthnetFrameBuffer,TxFrameSize); //收到连接请求报文,发送确认,SYN及ACK要置1
TCPStatus=TCP_STATE_SYN_RCVD; //进入SYN_RCVD状态
}
else if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6) & TCP_CODE_RST)
;
else
TCP_Send_Reset();
}
void TCP_Syn_Rec(void)
{
Uint32 TCPAcceptSeq;
if(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6) & (TCP_CODE_RST | TCP_CODE_SYN))
TCP_Send_Reset();
else if(*(RxEthnetFrameBuffer + RTL8019_HEADER_SIZE + TCP_HEADER_START + 6) & TCP_CODE_ACK) //收到ACK,不发送
{
TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5)));
if((TCPSent_UnAck<=TCPAcceptSeq)&&(TCPAcceptSeq<=TCPSendNextNr))
{
TCPSent_UnAck=TCPAcceptSeq;
//------------
// TCPResendSeqNr=TCPSegNr;
//------------
TCPStatus=TCP_STATE_ESTABLISHED;
TCPConnected=1;
}
}
}
void TCP_Syn_Sent(void)
{
Uint16 CalcCkSum,Temp;
Uint32 TCPAcceptSeq;
TCPAcceptSeq=(((Uint32)*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4)<<16)|(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+5))); //32位确认号
//收到的确认号<=发送的TCP序号 或者 收到的确认号>下一次要发送帧的TCP序号同时这个收到的帧是ACK
if((TCPAcceptSeq<=TCPSegNr)||((TCPAcceptSeq>TCPSendNextNr)&&(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_ACK)))
{
if(!(*(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+6)&TCP_CODE_RST))
{
memcpy((TxEthnetFrameBuffer+TCP_HEADER_START+2),(RxEthnetFrameBuffer+RTL8019_HEADER_SIZE+TCP_HEADER_START+4),2);
*(TxEthnetFrameBuffer+TCP_HEADER_START+4)=0;
*(TxEthnetFrameBuffer+TCP_HEADER_START+6)|=TCP_CODE_RST;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -