Thread: [Javanetsim-cvs] javaNetSim/core/protocolsuite/tcp_ip Echo_tcp.java,1.10,1.11 ProtocolStack.java,1.2
Status: Beta
Brought to you by:
darkkey
From: gift <gi...@us...> - 2005-11-29 23:32:08
|
Update of /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30279/core/protocolsuite/tcp_ip Modified Files: Echo_tcp.java ProtocolStack.java Tcp.java Log Message: TCP vXXXXX :) Index: ProtocolStack.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/ProtocolStack.java,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** ProtocolStack.java 28 Nov 2005 20:29:49 -0000 1.22 --- ProtocolStack.java 29 Nov 2005 23:31:58 -0000 1.23 *************** *** 1717,1721 **** } return true; ! } }//EOF --- 1717,1767 ---- } return true; ! } ! ! /** ! * This method returns the TCP segments with certain flags ! * NOTE: DO <b>NOT</b> CALL this method from application use only <i>SendTCP(Object application, String inTCPMessage)</i> in the application to send TCP segments ! * @author gift (sourceforge.net user) ! * @param application the application that sends the message ! * @param inTCPMessage TCP message to send ! * @param flags[] 6 flags to set in segment ! * @param acknow_num int number of TCP segment that we want to confirm (-1 if we do not send ACK segment) ! * @return TCP_packet ! * @exception CommunicationException ! * @exception LowLinkException ! * @exception TransportLayerException ! * @version v0.40 ! * @see CommunicationException ! * @see LowLinkException ! * @see TransportLayerException ! */ ! ! public TCP_packet getTCPSegment_clone(Object application, String inTCPMessage, boolean flags[], int acknow_num) throws LowLinkException, CommunicationException, TransportLayerException ! { ! String FirstInterfaceName; ! String DestIPAddress; ! String SourceIPAddress; ! int srcPort; ! int destPort; ! ! //lets get first network interface name ! Node temp = (Node)mParentNode; ! FirstInterfaceName = temp.getFirstInterfaceName(); ! ! // try{ ! //let's get a reserved local port number for this application ! srcPort=mTCPprotocol.getApplicationLocalPortNumber(application); ! //and destination IP of the other host ! DestIPAddress=mTCPprotocol.getApplicationDestIP(srcPort); ! //and destination port of the other host ! destPort=mTCPprotocol.getApplicationDestPortNumber(srcPort); ! ! ! SourceIPAddress=getIPAddress(FirstInterfaceName); ! TCP_packet tosend = mTCPprotocol.sendTCPPacket(DestIPAddress,SourceIPAddress,destPort,srcPort,inTCPMessage,flags,acknow_num); ! return tosend; ! ! // }catch(Exception e){} ! } }//EOF Index: Tcp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Tcp.java,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** Tcp.java 28 Nov 2005 21:50:37 -0000 1.15 --- Tcp.java 29 Nov 2005 23:31:59 -0000 1.16 *************** *** 127,135 **** public int seq_number; /*database*/ ! public Vector ReceivedSegments = new Vector(); //contains received segments ONLY sequence_number for each segment is stored ! //Integer type is used NOTE: Do remember about special "Integer" use by "Vector" ! public Vector ReceivedACKs = new Vector(); //contains received acknowledgments from destination computer ONLY sequence_number for each ACK segment is stored ! //Integer type is used NOTE: Do remember about special "Integer" use by "Vector" ! public Hashtable SegmentsToResend = new Hashtable(); //contains segments that will be resent in case no ACK for them will be received /*end of database*/ --- 127,159 ---- public int seq_number; /*database*/ ! ! /** ! * Contains received segments ONLY sequence_number for each segment is stored ! * Integer type is used NOTE: Do remember about special "Integer" use by "Vector" ! */ ! public Vector ReceivedSegments = new Vector(); ! ! /** ! * Here we store sent acknowledgements. ! * <p>Key: Sequence number of the segment that we have received and acknowledged</p> ! * <p>Object: Our ACK segment that we have received/<p> ! * <p>Aim of this hashtable: if we receive a duplicate of the segment that we have received, we get this duplicate sequenece number ! * then we get from this hashtable a copy of ACK segment we have sent and send it again.</p> ! */ ! public Hashtable SentACKs = new Hashtable(); ! ! /** ! * Contains received acknowledgments from destination computer ONLY sequence_number for each ACK segment is stored ! * Integer type is used NOTE: Do remember about special "Integer" use by "Vector" ! */ ! public Vector ReceivedACKs = new Vector(); ! ! /** ! * Contains segments that will be resent in case no ACK for them will be received ! * <p>Key: Sequence number of the segment that we are sending</p> ! * <p>Object: The copy of the segment we have sent</p> ! * <p>Aim of this hashtable: necessarily to have</p> ! */ ! public Hashtable SegmentsToResend = new Hashtable(); /*end of database*/ *************** *** 151,154 **** --- 175,187 ---- this.seq_number=0; if (!this.ReceivedSegments.isEmpty()) this.ReceivedSegments.removeAllElements(); + if (!this.SentACKs.isEmpty()) + { + Set set = this.SentACKs.keySet(); + Iterator itr = set.iterator(); + while (itr.hasNext()) + { + this.SentACKs.remove(itr.next()); + } + } if (!this.ReceivedACKs.isEmpty()) this.ReceivedACKs.removeAllElements(); if (!this.SegmentsToResend.isEmpty()) *************** *** 597,601 **** //here we push out segment in Hashtable SegmentsToResend and increment counters s_num=Elm.seq_number; //getting sequence number 0-for SYN ! if (Elm.ReceivedSegments.isEmpty()) a_num=0; else a_num=(Integer)Elm.ReceivedSegments.lastElement()+1; //getting ACK number 0 - for SYN, 1 - as a reply for SYN ... so on tosend.set_sequence_number(s_num); --- 630,634 ---- //here we push out segment in Hashtable SegmentsToResend and increment counters s_num=Elm.seq_number; //getting sequence number 0-for SYN ! if (Elm.ReceivedSegments.isEmpty()) a_num=0; else a_num=acknow_num; //(Integer)Elm.ReceivedSegments.lastElement()+1; //getting ACK number 0 - for SYN, 1 - as a reply for SYN ... so on tosend.set_sequence_number(s_num); *************** *** 726,739 **** Application listener;int ack_num=1; listener = (Application)Elm.application; ! mParentStack.sendTCPSegment(listener,msg,flags,ack_num); //listener.RecvData(inPacket.getTCP_message()); we do not receive segment because this is a SYN-packet - } else { //we have already received this segment ! Elm.received_duplicates++; ! String msg=""; ! boolean flags[]={false,true,false,false,true,false}; /* URG, !ACK!, PSH, RST, !SYN!, FIN */ ! Application listener;int ack_num=1; ! listener = (Application)Elm.application; ! mParentStack.sendTCPSegment(listener,msg,flags,ack_num); } } else { //not a SYN packet - have to wait until SYN packet will come --- 759,770 ---- Application listener;int ack_num=1; listener = (Application)Elm.application; ! if (mParentStack.sendTCPSegment(listener,msg,flags,ack_num)) ! { ! //we have sent ACK for received segment => adding it to SentACKs ! Elm.SentACKs.put((Integer)inPacket.get_sequence_number(), (TCP_packet) mParentStack.getTCPSegment_clone(listener,msg,flags,ack_num)); ! } //listener.RecvData(inPacket.getTCP_message()); we do not receive segment because this is a SYN-packet } else { //we have already received this segment ! //but we will never enter here :) } } else { //not a SYN packet - have to wait until SYN packet will come *************** *** 751,755 **** //we have received an answer for our SYN-segment //a little test ! if (!(inPacket.get_ACK_flag())) throw new TransportLayerPortException("TCP Error: No ACK flag set in segment!"); //in case this is not duplicate --- 782,786 ---- //we have received an answer for our SYN-segment //a little test ! if (!(inPacket.get_ACK_flag())) throw new TransportLayerPortException("TCP Error: No ACK flag in answer for SYN packet is set in the segment!"); //in case this is not duplicate *************** *** 784,799 **** boolean flags[]={false,true,false,false,false,false}; /* URG, !ACK!, PSH, RST, SYN, FIN */ Application listener; ! listener = (Application)Elm.application; ! mParentStack.sendTCPSegment(listener,msg,flags, ack_num); //listener.RecvData(inPacket.getTCP_message()); we do not receive segment because this is a SYN-packet } else { //we have already received this segment Elm.received_duplicates++; ! String msg=""; ! boolean flags[]={false,true,false,false,true,false}; /* URG, !ACK!, PSH, RST, !SYN!, FIN */ ! Application listener;int ack_num=1; ! listener = (Application)Elm.application; ! mParentStack.sendTCPSegment(listener,msg,flags,ack_num); ! } } else --- 815,832 ---- boolean flags[]={false,true,false,false,false,false}; /* URG, !ACK!, PSH, RST, SYN, FIN */ Application listener; ! listener = (Application)Elm.application; ! ! if (mParentStack.sendTCPSegment(listener,msg,flags,ack_num)) ! { ! //we have sent ACK for received segment => adding it to SentACKs ! Elm.SentACKs.put((Integer)inPacket.get_sequence_number(), (TCP_packet) mParentStack.getTCPSegment_clone(listener,msg,flags,ack_num)); ! } //listener.RecvData(inPacket.getTCP_message()); we do not receive segment because this is a SYN-packet } else { //we have already received this segment Elm.received_duplicates++; ! //now we have to resend our ACK again ! mParentStack.sendPacket((TCP_packet) Elm.SentACKs.get((Integer)inPacket.get_sequence_number())); ! } } else *************** *** 804,812 **** { //FIN flag! Last segment was received. ! //a little test ! if (!(inPacket.get_ACK_flag())) throw new TransportLayerPortException("TCP Error: No ACK flag set in segment!"); ! ! //Elm=(TCP_HashTableElement)PortTable.get(inPacket.get_destPort()); ! Integer chk = (Integer)inPacket.get_sequence_number(); if (!(Elm.ReceivedSegments.contains(chk))) --- 837,841 ---- { //FIN flag! Last segment was received. ! //Elm=(TCP_HashTableElement)PortTable.get(inPacket.get_destPort()); Integer chk = (Integer)inPacket.get_sequence_number(); if (!(Elm.ReceivedSegments.contains(chk))) *************** *** 844,858 **** Elm.SegmentsToResend.remove((Integer)our_ack-1); ! //now we have to send ACK-segment (with SYN=false, seq_num=XX, ack_num=XX) ! //we have one received segment so everything we have to do is just to call "mParentStack.sendTCPSegment(listener,msg,flags);" if (Elm.isFIN_sent==false) { Elm.isPassive=true; String msg=""; ! boolean flags[]={false,false,false,false,false,true}; /* URG, !ACK!, PSH, RST, SYN, !FIN! */ //maybe not like in RFC page 37 p3.5 Application listener; listener = (Application)Elm.application; //Elm.isFIN_sent=true; - will be set in "sendTCPSegment" ! // mParentStack.sendTCPSegment(listener,msg,flags); } else { --- 873,891 ---- Elm.SegmentsToResend.remove((Integer)our_ack-1); ! //now we have to send ACK-segment (with SYN=false, seq_num=XX, ack_num=XX) if (Elm.isFIN_sent==false) { Elm.isPassive=true; String msg=""; ! boolean flags[]={false,true,false,false,false,true}; /* URG, !ACK!, PSH, RST, SYN, !FIN! */ //maybe not like in RFC page 37 p3.5 Application listener; + int ack_num=chk+1; listener = (Application)Elm.application; //Elm.isFIN_sent=true; - will be set in "sendTCPSegment" ! if (mParentStack.sendTCPSegment(listener,msg,flags,ack_num)) ! { ! //we have sent ACK for received segment => adding it to SentACKs ! Elm.SentACKs.put((Integer)inPacket.get_sequence_number(), (TCP_packet) mParentStack.getTCPSegment_clone(listener,msg,flags,ack_num)); ! } } else { *************** *** 864,868 **** listener = (Application)Elm.application; Elm.isFIN_confirmed=true; ! // mParentStack.sendTCPSegment(listener,msg,flags); } else { --- 897,906 ---- listener = (Application)Elm.application; Elm.isFIN_confirmed=true; ! int ack_num=chk+1; ! if (mParentStack.sendTCPSegment(listener,msg,flags,ack_num)) ! { ! //we have sent ACK for received segment => adding it to SentACKs ! Elm.SentACKs.put((Integer)inPacket.get_sequence_number(), (TCP_packet) mParentStack.getTCPSegment_clone(listener,msg,flags,ack_num)); ! } } else { *************** *** 872,877 **** boolean flags[]={false,true,false,false,false,true}; /* URG, !ACK!, PSH, RST, SYN, !FIN! */ //maybe not like in RFC page 37 p3.5 Application listener; ! listener = (Application)Elm.application; ! // mParentStack.sendTCPSegment(listener,msg,flags); } ClosePort((Application)Elm.application); //FIN sent and confirmed!!! Closing connection --- 910,919 ---- boolean flags[]={false,true,false,false,false,true}; /* URG, !ACK!, PSH, RST, SYN, !FIN! */ //maybe not like in RFC page 37 p3.5 Application listener; ! listener = (Application)Elm.application; int ack_num=chk+1; ! if (mParentStack.sendTCPSegment(listener,msg,flags,ack_num)) ! { ! //we have sent ACK for received segment => adding it to SentACKs ! Elm.SentACKs.put((Integer)inPacket.get_sequence_number(), (TCP_packet) mParentStack.getTCPSegment_clone(listener,msg,flags,ack_num)); ! } } ClosePort((Application)Elm.application); //FIN sent and confirmed!!! Closing connection *************** *** 882,941 **** } else { //we have already received this segment Elm.received_duplicates++; ! } ! ! } else { // no FIN flag, no SYN flag ! //just normal mode. Have to check ACK flag, decompose, send acknowledgement ! ! //a little test ! if (!(inPacket.get_ACK_flag())) throw new TransportLayerPortException("TCP Error: No ACK flag set in segment!"); ! Integer chk = (Integer)inPacket.get_sequence_number(); if (!(Elm.ReceivedSegments.contains(chk))) ! { ! Elm.received_segments++; Elm.ReceivedSegments.addElement(chk); //adding seq_number that we have received ! Integer our_ack = (Integer)inPacket.get_acknowledgment_number(); ! Elm.ReceivedACKs.addElement(our_ack); //adding ACK that we have received ! // everything is OK now we decompose TCP datagram ! //Create Layer info ! LayerInfo TCP_Info = new LayerInfo(getClass().getName()); ! TCP_Info.setObjectName(mParentStack.getParentNodeName()); ! TCP_Info.setDataType("TCP Protocol"); ! TCP_Info.setLayer("Transport"); ! ! String s; ! int rs = Elm.received_segments; ! if (rs>2) s="TCP packet with data ACK received from "+ inPacket.getSourceIPAddress() + ":" + inPacket.get_srcPort() + "."; else s="TCP packet with establishing connection ACK received from "+ inPacket.getSourceIPAddress() + ":" + inPacket.get_srcPort() + ". Connection confirmed!"; ! ! //deleting from SegmentsToResend the segmet with the acknowledgment number we have received NOTE: dec by 1 is used see RFC ! Elm.SegmentsToResend.remove((Integer)our_ack-1); ! ! if (our_ack==1 && (Integer)inPacket.get_sequence_number()==1) s=s + " New TCP connection established!"; ! TCP_Info.setDescription(s); ! Simulation.addLayerInfo(TCP_Info); ! //now we have to send ACK-segment (with SYN=false, seq_num=XX, ack_num=XX) ! //we have one received segment so everything we have to do is just to call "mParentStack.sendTCPSegment(listener,msg,flags);" ! String msg=""; ! boolean flags[]={false,true,false,false,false,false}; /* URG, !ACK!, PSH, RST, SYN, FIN */ ! Application listener; ! listener = (Application)Elm.application; ! ! if (rs>2) listener.RecvData(inPacket.getTCP_message()); ! // if ((our_ack!=2 || Elm.sent_segments!=2) && Elm.PortStatus!=1) mParentStack.sendTCPSegment(listener,msg,flags); //our_ack==2 when connection is established ! //we have sent last ACK and we can close TCP port now ! ! } else { //we have already received this segment Elm.received_duplicates++; ! } } } --- 924,1017 ---- } else { //we have already received this segment Elm.received_duplicates++; ! //now we have to resend our ACK again ! mParentStack.sendPacket((TCP_packet) Elm.SentACKs.get((Integer)inPacket.get_sequence_number())); ! } ! ! ! ! } else { // no FIN flag, no SYN flag ! //just normal mode. Have to check ACK flag, decompose, send acknowledgement ! Integer chk = (Integer)inPacket.get_sequence_number(); ! Integer our_ack = (Integer)inPacket.get_acknowledgment_number(); if (!(Elm.ReceivedSegments.contains(chk))) ! { ! Elm.received_segments++; Elm.ReceivedSegments.addElement(chk); //adding seq_number that we have received ! ! ! if (inPacket.get_ACK_flag()) ! { ! // we have received an ACK for our segment!!! ! Elm.ReceivedACKs.addElement(our_ack); //adding ACK that we have received ! // everything is OK now we decompose TCP datagram ! ! //Create Layer info ! LayerInfo TCP_Info = new LayerInfo(getClass().getName()); ! TCP_Info.setObjectName(mParentStack.getParentNodeName()); ! TCP_Info.setDataType("TCP Protocol"); ! TCP_Info.setLayer("Transport"); ! String s; ! if (Elm.received_segments>2) s="TCP packet with data ACK received from "+ inPacket.getSourceIPAddress() + ":" + inPacket.get_srcPort() + "."; ! else s="TCP packet with establishing connection ACK received from "+ inPacket.getSourceIPAddress() + ":" + inPacket.get_srcPort() + ". Connection confirmed!"; ! ! if (our_ack==1 && (Integer)inPacket.get_sequence_number()==1) s=s + " New TCP connection established!"; ! ! TCP_Info.setDescription(s); ! Simulation.addLayerInfo(TCP_Info); ! //we do not have to send ACK for ACK-segment ! ! //deleting from SegmentsToResend the segmet with the acknowledgment number we have received NOTE: dec by 1 is used see RFC ! Elm.SegmentsToResend.remove((Integer)our_ack-1); ! ! } else ! { ! //we have received non ACK-segment ! //now we have to send our ACK-segment (with SYN=false, seq_num=XX, ack_num=XX) ! String msg=""; ! boolean flags[]={false,true,false,false,false,false}; /* URG, !ACK!, PSH, RST, SYN, FIN */ ! Application listener; ! listener = (Application)Elm.application; int ack_num=chk+1; ! ! //our_ack==2 when connection is established ! // if ((our_ack!=2 || Elm.sent_segments!=2) && Elm.PortStatus!=1) ! //{ ! if (mParentStack.sendTCPSegment(listener,msg,flags,ack_num)) ! { ! //we have sent ACK for received segment => adding it to SentACKs ! Elm.SentACKs.put((Integer)inPacket.get_sequence_number(), (TCP_packet) mParentStack.getTCPSegment_clone(listener,msg,flags,ack_num)); ! } ! //} ! ! //Create Layer info ! LayerInfo TCP_Info = new LayerInfo(getClass().getName()); ! TCP_Info.setObjectName(mParentStack.getParentNodeName()); ! TCP_Info.setDataType("TCP Protocol"); ! ! TCP_Info.setLayer("Transport"); ! ! TCP_Info.setDescription("TCP packet with data received from "+ inPacket.getSourceIPAddress() + ":" + inPacket.get_srcPort() + ". Passing data to application program."); ! ! Simulation.addLayerInfo(TCP_Info); ! ! //if (Elm.received_segments>2) ! listener.RecvData(inPacket.getTCP_message()); ! } ! } else { //we have already received this segment Elm.received_duplicates++; ! //now we have to resend our ACK again ! mParentStack.sendPacket((TCP_packet) Elm.SentACKs.get((Integer)inPacket.get_sequence_number())); ! } ! } } Index: Echo_tcp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Echo_tcp.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** Echo_tcp.java 28 Nov 2005 21:50:37 -0000 1.10 --- Echo_tcp.java 29 Nov 2005 23:31:58 -0000 1.11 *************** *** 108,112 **** { ! // mParentStack.SendTCP(this, Data); //processing the protocol doings. --- 108,112 ---- { ! mParentStack.SendTCP(this, Data,-1); //processing the protocol doings. |