[erlang-questions] Socket connects to itself
Tony Rogvall
tony@REDACTED
Tue Oct 13 08:53:19 CEST 2009
In C you could of course check the bound port before connecting.
And I guess the same fix could be applied to prim_inet if that is what
you want ;-)
/Tony
On 13 okt 2009, at 00.12, Per Hedeland wrote:
> Rob Charlton <rob@REDACTED> wrote:
>>
>> I noticed in the logs one night that this process P which had tried
>> for
>> several hours to connect to a non-existent server on 127.0.0.1:2920
>> had
>> actually succeeded! Even more exciting than that, it had connected to
>> itself, so when it started trying to communicate with its peer it was
>> very surprised to receive its own communications back again.
>> Needless to
>> say P crashed at this point. I was very curious to know how this
>> could
>> happen and to try and fix it! You could argue this isn't a bug
>> because
>> the system configuration was incorrectly specified. In this
>> particular
>> case though, the misconfiguration can happen easily and I would
>> like P
>> not to crash but instead to keep trying.
>>
>> I tried Googling for this and did find a couple of non-erlang sources
>> suggesting it had happened to them in similar circumstances. It
>> could be
>> that this is a very timing sensitive 'feature' of TCP/IP. Can anyone
>> enlighten me?
>
> That's a nice one!:-) Whenever you call gen_tcp:connect(), the
> underlying OS connect() system call will first bind the socket to a
> local address and port, and then send the initial SYN packet using
> that
> address/port as source. It is quite possible that at some point it may
> happen to choose the unused port 2920 for that, and hence attempt a
> connect from 127.0.0.1:2920 to 127.0.0.1:2920.
>
> This is where the "feature" comes into play - you might think that
> this
> connection should fail, since there is no process listening on port
> 2920, but the TCP spec explicitly prescribes that "simultaneous
> initiation" should be handled - e.g. from section 2.7 of RFC 793:
>
> Two processes which issue active OPENs to each
> other at the same time will be correctly connected. This flexibility
> is critical for the support of distributed computing in which
> components act asynchronously with respect to each other.
>
> You can also see it in the famous state diagram in Figure 6 of RFC
> 793,
> as the "rcv SYN" transition from SYN_SENT to SYN_RCVD. Though of
> course
> it's a pretty safe bet that no protocol in serious use actually
> requires
> this "critical" functionality.
>
> --Per Hedeland
>
> ________________________________________________________________
> erlang-questions mailing list. See http://www.erlang.org/faq.html
> erlang-questions (at) erlang.org
>
More information about the erlang-questions
mailing list