A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.
Dependents: oldheating gps motorhome heating
Diff: tcp/tcp.txt
- Revision:
- 71:736a5747ade1
- Child:
- 72:19457bba58d0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcp/tcp.txt Sat Oct 20 18:56:13 2018 +0000 @@ -0,0 +1,49 @@ +Names +===== +ISN == Initial Sequence Number +SEQ num == Sequence Number is the sequence of the first byte of the sent data packet - unless a SYN in which case it is the ISN +ACK num == Acknowledge Number is the next sequence number that the sender of the ACK is expecting +TCB == Transmission Control Block +RTO == Retransmission Time Out + +Protocol +======== +Goes: +0 SYN +1 Data (length == MSS) +1+ MSS Data (length == MSS) +1+2xMSS Data (length < MSS) + FIN + +TcpHandleReceivedPacket +======================= +Called from the network stack +Reads the header to get: the src and dst ports; the ACK and SEQ numbers; SYN, ACK, PSH, RST and FIN flags +Only handles dst port 80 (HTTP) +Retrieves the TCB for the src port +Handles RST or SYN requests +Subtract the initial sequence numbers to get the position in the query from the SEQ num and the position in the reply from the ACK num. +If the position in the query is not the same as the TCB recd bytes then adjust the TCB recd bytes +If the position in the reply is not the same as the TCB sent bytes then adjust the TCB sent bytes +Increment the TCB recd bytes by the received datalength and by 1 for a SYN or FIN +Handle the packet according to the TCB state, for established connections pass the position in the query and the position in the reply +Set the ACK number to the TCB recd bytes plus the ISN +Set the SEQ number to the TCB sent bytes plus the ISN +Increment the TCB sent bytes by the sent datalength and by 1 for a SYN or FIN +Swap the ports +Return to the network stack for unicast transmission + +Todo +==== +Separate the work into TcpHandleReceivedPacket and TcpPollForPacketToSend: this would allow RTO to be implemented. +Need to add the IP to the TCB +Change TCB_ACK_WAIT and TCB_FIN_WAIT to TCB_CLOSE_ACK_WAIT and TCB_CLOSE_FIN_WAIT +Add state TCB_SEND_ACK_WAIT +Add ackdBytes to TCB so that can tell if sentBytes has been acked or not; if so then send the next; if not and within timeout then wait; if not and RTO then send again + +State +===== +TCB_EMPTY do nothing +TCB_SYN_RECEIVED if (TCB.sent == 0) or (TCB.sent == 1 and TCB.ackd == 0 and RTO) then send SYN ACK and ISN. +TCB_ESTABLISHED if (!TCB.finished) then send from TCB.sent. if RTO and TCB.ackd < TCB.sent then resend TCB.ackd +TCB_FIN_WAIT +TCB_ACK_WAIT