VirtualBox

Ticket #13116 (closed defect: fixed)

Opened 4 years ago

Last modified 3 years ago

unidirectional close across port forwarded TCP connection results in output truncation => Fixed in SVN

Reported by: jonseymour Owned by:
Priority: major Component: network/NAT
Version: VirtualBox 4.3.10 Keywords:
Cc: Guest type: all
Host type: Mac OS X

Description

G'day,

I've reproduced a problem that was originally reported by this ticket

https://www.virtualbox.org/ticket/4925

That ticket was closed without being fixed. In that case the host was a Linux host. In my case, the host is an OSX host, but the symptoms are identical.

Namely, if the host connects to the guest via a forwarded port, and then shuts down the write side of the connection, then the the host does not receive all the remaining output from the guest.

The apparent reason for this is that when the shutdown is issued, two TCP ACK packets are generated by the host for output already received. The first of these is never received by the guest. The second one has an incorrect Ack sequence number and so is discarded by the guest. Since the guest never receives the expected ACK, it stops sending all remaining output to the host and so the host observes truncated response.

The problem does not occur if the host connects to the guest via a bridged interface or via the SSH port-forward.

I have implemented a client/server pair that demonstrates the issue. I have reproduced the issue with both Linux and Windows 8.1 guests.

The source for this program is available here:  https://github.com/jonseymour/osx-loopback. To compile the source, the go toolset is required. I can supply the compiled executeables upon request.

Change History

comment:1 Changed 4 years ago by jonseymour

NOTE: This comment contains an assertion that port forwarding with "NAT Network" works better than "NAT". I no longer believe that is the case. I have left the original note as is

--- end of update ---

Digging into this a little bit further, it appears the issue is caused by the implementation of

lwip_shutdown in ./src/VBox/Devices/Network/lwip/src/api/sockets.c

To quote:

int lwip_shutdown(int s, int how)
{
  LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how));
  return lwip_close(s); /* XXX temporary hack until proper implementation */
}

In other words, the socket is being closed rather than shutdown.

I noticed ./src/VBox/Devices/Network/lwip/src/api/sockets.c does attempt to implement this call correctly and on a hunch reconfigured my VM to use the experimental NAT service as documented in  http://www.virtualbox.org/manual/ch06.html#network_nat_service

Sure enough that worked.

Last edited 4 years ago by jonseymour (previous) (diff)

comment:2 Changed 4 years ago by jonseymour

I just doubled checked my testing of the "NAT Networks" network type and unfortunately, I think there was a problem with my testing. If anything using "NAT Network" is worse than simply using NAT (e.g. the output is truncated even earlier)

Also, I had a closer look at the VirtualBox code and I came to the conclusion that in the current code base lwip_shutdown() from ./src/VBox/Devices/Network/lwip/src/api/sockets.c is probably not in the active code path.

comment:3 Changed 4 years ago by vushakov

Yes, half-close of the inbound half of a tcp connection is broken in NAT.

With "NAT Network" it should work. Your test works for me on linux host.

comment:4 Changed 4 years ago by jonseymour

Thanks for the issue about the Linux host.

I will try to confirm this myself. Also, I will double check OSX results "NAT Network" again to be sure.

comment:5 Changed 4 years ago by vushakov

Tested NAT Network case on OSX host and indeed there is a problem with inbound half-close there.

comment:6 Changed 3 years ago by vushakov

This should be fixed in the next dot-dot release.

comment:7 Changed 3 years ago by frank

  • Summary changed from unidirectional close across port forwarded TCP connection results in output truncation to unidirectional close across port forwarded TCP connection results in output truncation => Fixed in SVN

comment:8 Changed 3 years ago by frank

Here is a test build which contains the fix. Feedback welcome!

comment:9 Changed 3 years ago by frank

  • Status changed from new to closed
  • Resolution set to fixed

Fix is part of VBox 4.3.14.

Note: See TracTickets for help on using tickets.

www.oracle.com
ContactPrivacy policyTerms of Use