> "third nanomsg re-implementation" Neat! Can we start a new thread on this? I like how Garrett has chosen to keep Mangos discussion on the nanomsg list to get it off the ground; it seems both have benefitted from staying in the same communication channel during development. > "If a protocol encounters a frame it does not understand, it should raise an error" I agree with this, and have suggested that nanomsg adopt the same strategy as WebSockets by immediately sending a Close Handshake then failing the connection to any peer that sends a malformed/unexpected frame. This remains a robustness/security concern where nanomsg could improve. There are other actions/remedies that could be taken other than the close-handshake-then-close-connection recipe, but this is incredibly simple and at the same time should provide enough breadcrumbs to troubleshoot failure modes. > "I don’t think SP handshakes in general are useful" What's the alternative? Encode this information per-message, rather than per-connection? > "We just need to specify how to encode the multiple protocols and the ordering" Per-message CMSG headers exist; are these sufficient (and desirable)? Best regards, Jack R. Dunaway | Wirebird Labs LLC On Fri, Jan 30, 2015 at 10:58 AM, Drew Crawford <drew@xxxxxxxxxxxxxxxxxx> wrote: > In the case of TCP, the RFC gives the following statement about the > handshake mechanism: > > > The goal of this design is to keep connection establishment as fast > > as possible by avoiding any additional protocol handshakes, i.e. > > network round-trips. Specifically, the protocol headers can be > > bundled directly with to the last packets of TCP handshake and thus > > have virtually zero performance impact. > > > I think we mostly agree that this is a good plan for TCP. > > The problem as applies to WS is that we have mutually exclusive > requirements: > > 1. We want to have a low-overhead handshake > 2. WS doesn’t support full-duplex negotiation (because HTTP doesn’t). > > In this case we must choose, either to have a high-overhead handshake, or > to forget full-duplex negotiation. > > This is probably as good of a time as any to announce that I’ve started > work seriously on a third nanomsg re-implementation, that will sit beside > nanomsg and mangos as a third implementation of the protocols. A goal of > my re-implementation is to leverage the new socket architecture I posted to > this list a few months ago, that is difficult to achieve in core for > various reasons. A second goal is to fix a bunch of longstanding minor > gripes that are hard to do in the existing codebase. > > My implementation strictly prefers low-overhead solutions to > full-negotiation. So to the extent that we settle on a full-duplex, > additional-round-trip solution I will break compatibility on that point. > For my set of problems the overhead is critical. > > More broadly I don’t think SP handshakes in general are useful (but so > long as the cost is low the objection is academic). If a protocol > encounters a frame it does not understand, it should raise an error. > Moreover the presence of handshake purporting to be e.g. REQ is not a > guarantee that is understandable by a REQ socket; packets can be spoofed > and so on. At best this is a debug convenience; protocols should be > written (and tested) in such a way that they are not reliant on handshakes > as anything other than a convenience. > > Here, the full-duplex handshake is /in/convenient, because it is slow. I > think in this case we need to look seriously at relaxing the handshake > requirement. > > Another objection I have to this specific proposal is that the assumption > of 1 SP protocol contradicts the design of the new socket architecture I > posted for discussion a few months earlier, because I support multiple > layered SP protocols, and this proposal only considers one. > > I actually have this problem with TCP as well. In that case there is not > really an option except breaking compatibility with sp-tcp-mapping in the > layered situation. Ideally it would be fixed in the RFC, but I think the > TCP RFC may be too widely deployed for it to be revised at this point (even > though, I’ve noticed the “expires” date in the RFC has passed…) > > With WS however I think we have a window to design something that would > not require layered implementations to break the RFC. We just need to > specify how to encode the multiple protocols and the ordering. > > Drew > > > > On Jan 30, 2015, at 6:36 AM, Garrett D'Amore <garrett@xxxxxxxxxx> wrote: > > > > I’ve started (and mostly completed) a websocket mapping of mangos. I > started hoping to make it compatible with nanomsg’s mapping as specified in > the websocket nanomsg RFC, but as I got into details, I discovered > somethings about this RFC that I think are a big mistake. > > > > The biggest problem is that we are relying on the Protocol field to > express which SP topology is used. This results in at least these problems: > > > > a) The transport needs to know the name of all protocols, which > does not facilitate expansion and badly breaks the layering abstraction. > > > > b) Some implementations don’t make it easy to pick up on the > values used by the server and client protocols. For example, the Go > websocket implementation lets the client specify the protocols it want(s) > to use, but it cannot see what the advertised protocol on the server side > is. > > > > c) Its likely that some implementations are going to have trouble > when x-nanomsg-req != x-nanomsg-rep — i.e. we cannot have mismatched > protocols. > > > > I think problem “a” could be easily fixed by using numerics encoded as > strings, but problems b & c are more severe — I think they come about from > a basic design philosophy difference — in websocket I think the intention > is that the ultimate “negotiation” is done on the server side, based on > what the client claims to desire. Its not really a two-way neg like SP is. > > > > Thinking about this quite a bit, I’ve decided that the best thing would > be to change the mapping as follows: > > > > 1. The protocol field should just be the value “x-nanomsg” — without > any reference to the subprotocol. > > > > 2. A message exchange very much like what is is done for TCP should be > done at when the connection is established. That is each side should send > a “header”, and then should receive and validate the peer’s header. > > > > 3. Given that some websocket clients really need to deal with text > values (e.g. older web browsers can only send strings), the content of the > header should be as follows: > > > > “SP0:<protocol>:0” — these are ASCII characters forming a > string. The SP0: indicates SP version 0, the <protocol> is a numeric > protocol (for example PUB would 32, and SUB would be 33) represented in > decimal ASCII, and the :0 is reserved for future protocol enhancements > (like the reserved fields in the binary header exchange). So for example, > a REQ client would send SP0:48:0 and a REP server would send SP0:49:0 > > > > This should facilitate working with more websocket implementations, > although to be clear the header exchange would prevent using this library > to talk to arbitrary websocket services — peers would only match and peer > each other if they are running the proper SP peer protocol. I see almost > no value in attempting to make nanomsg a general purpose websocket library. > > > > Thoughts? > > > > - Garrett > > > > > > >