# lec10 ## TCP Structue Sequence Numbers: * byte stream _number_ of first byte in segment's data ACKS's: * seq # of next byte expected from other side Example: ``` host a: user sends 'c' seq=42, ack=79, data='c' host b: ACK recepit send to host a(echo's back ''c') seq=72, ack=49, data='c' ; data sent back from host b ``` ### Round trip time EstimatedRTT= (1-\alpha)*EstimatedRTT + \alpha*SampleRTT > Lot's of stuff missing here ## TCP Reliable data transfer Implements: * Pipeplined segments * cumulative `ACK` * This just means that we assume that the highest sequenced ACK also means the previous segments have been received properly too * Single transmission timer ### Sender Events 1. First create segment w/ seq no. a. Sequence number refers to byte in 2. Start timer if we don't already have one. a. Timer based off oldest UN-ACKED segment ## Retransmission w/ TCP __Timout__: Usually it's pretty long so if there is a timeout on a packet. When this happens the receiver responds to sender with 3 ACK's for the last well received segment: Receiver gets `1 2 3 5` but not `4`. We respond with the ACK for `1` like normal, then 3 ACK's for `1` is sent to the sender before the time out and we start re-sending from `2`. This is what we call _fast retransmit_. _The main thing here is that the receiver controls the sender's "send rate" so that the receiver doesn't get inundated._ Receiver will _advertise_ free buffer space in including `rwnd` value in TCP header. This just tells the sender how much space is available to accept at a time. Example: Transferring a large file from host to host. \alpha will send a file to \beta. Alpha sends some file data to \beta, who then ACK's the packet but includes in the header that their buffer is full. \alpha responds with a 1 byte packet to keep the connection alive. ## Connection Management Before sender/receiver start exchanging anything we must perform a `handshake`. `SYN` is a special packet type under TCP which we can use to synchronize both client and server. ### Closing `FIN` bit inside the header. We send this off to a receiver and we enter a `close_wait` state. We only wait because there might be more data. Receiver enters the `close_wait` state as well, _but_, still sends any data left over. Once the last `ACK` is sent we send a `FIN` packet