|
|
|
|
|
by tjgq
4205 days ago
|
|
SCTP would be the ideal solution, but it's essentially broken on the wide Internet since virtually no NAT boxes understand it. Using a large number of TCP connections breaks some of the assumptions behind TCP congestion control; this is one of the reasons why the SPDY/HTTP2 guys decided to layer a multi-stream protocol on top of a single TCP connection - and it still falls prey to head-of-line blocking. Not sure what you mean by using an internal work queue - short of running a custom TCP/IP stack in kernel space or using some non-standard socket API, there's no way to work around TCP's ordered delivery. Given these constraints, I can understand why designing a transport protocol on top of UDP might be reasonable. There probably is no need to roll your own, though - just use SCTP over UDP [1]. (Edit: I only noticed you did mention SCTP/UDP after I wrote my reply, sorry!) [1] https://tools.ietf.org/html/rfc6951 |
|
Hence my suggestion of SCTP over UDP.
Using a large number of TCP connections breaks some of the assumptions behind TCP congestion control
Which assumptions? Using multiple connections is pretty standard in the enterprise storage world.
Not sure what you mean by using an internal work queue - short of running a custom TCP/IP stack in kernel space or using some non-standard socket API, there's no way to work around TCP's ordered delivery.
My bad, I missed that you were referring to lost packets blocking future packets (as opposed to slow-to-process work units blocking future work units). You're right that this is very much a problem with a single TCP stream. (Multiple TCP streams help with this.)