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 ) {
fprintf( stderr, "[%u] Received state %d [ack %d]\n",
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.ack_num() );
fprintf( stderr, "[%u] Received state %d [coming from %d, ack %d]\n",
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.old_num(), (int)inst.ack_num() );
}
received_states.push_back( new_state );
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 );
attempt_prospective_resend_optimization( diff );
/* verify diff has round-trip identity (modulo Unicode fallback rendering) */
/*
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;
}
/* 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() */
void update_assumed_receiver_state( void );
void attempt_prospective_resend_optimization( string &proposed_diff );
void rationalize_states( void );
void send_to_receiver( string diff );
void send_empty_ack( void );