Improve lossy connections by sending diff from "known" state if it's easy

This commit is contained in:
Keith Winstein
2012-05-04 23:05:50 -04:00
parent ce47d1f769
commit a82f50f085
3 changed files with 28 additions and 2 deletions
+2 -2
View File
@@ -117,8 +117,8 @@ void Transport<MyState, RemoteState>::recv( void )
} }
} }
if ( verbose ) { if ( verbose ) {
fprintf( stderr, "[%u] Received state %d [ack %d]\n", fprintf( stderr, "[%u] Received state %d [coming from %d, ack %d]\n",
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.ack_num() ); (unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.old_num(), (int)inst.ack_num() );
} }
received_states.push_back( new_state ); received_states.push_back( new_state );
sender.set_ack_num( received_states.back().num ); sender.set_ack_num( received_states.back().num );
+25
View File
@@ -150,6 +150,8 @@ void TransportSender<MyState>::tick( void )
string diff = current_state.diff_from( assumed_receiver_state->state ); string diff = current_state.diff_from( assumed_receiver_state->state );
attempt_prospective_resend_optimization( diff );
/* verify diff has round-trip identity (modulo Unicode fallback rendering) */ /* verify diff has round-trip identity (modulo Unicode fallback rendering) */
/* /*
MyState newstate( assumed_receiver_state->state ); MyState newstate( assumed_receiver_state->state );
@@ -349,3 +351,26 @@ void TransportSender<MyState>::set_ack_num( uint64_t s_ack_num )
{ {
ack_num = s_ack_num; ack_num = s_ack_num;
} }
/* Investigate diff against known receiver state instead */
/* Mutates proposed_diff */
template <class MyState>
void TransportSender<MyState>::attempt_prospective_resend_optimization( string &proposed_diff )
{
if ( assumed_receiver_state == sent_states.begin() ) {
return;
}
string resend_diff = current_state.diff_from( sent_states.front().state );
/* We do a prophylactic resend if it would make the diff shorter,
or if it would lengthen it by no more than 100 bytes and still be
less than 1000 bytes. */
if ( (resend_diff.size() <= proposed_diff.size())
|| ( (resend_diff.size() < 1000)
&& (resend_diff.size() - proposed_diff.size() < 100) ) ) {
assumed_receiver_state = sent_states.begin();
proposed_diff = resend_diff;
}
}
+1
View File
@@ -48,6 +48,7 @@ namespace Network {
/* helper methods for tick() */ /* helper methods for tick() */
void update_assumed_receiver_state( void ); void update_assumed_receiver_state( void );
void attempt_prospective_resend_optimization( string &proposed_diff );
void rationalize_states( void ); void rationalize_states( void );
void send_to_receiver( string diff ); void send_to_receiver( string diff );
void send_empty_ack( void ); void send_empty_ack( void );