Hi Vadim,

comments in-line.

Best regards
Michael

On Mar 5, 2008, at 11:10 AM, Vadim Goncharov wrote:
Hi!

I've seen that FreeBSD 7.0 is a reference implementation for SCTP, which is
a great protocol, good work!

But as I was looking through man pages for new API, I couldn't understand
some issues with high-load servers.

Currently, I am developing client-server application for my needs, and I want to adjust protocol right now to ease possible transition to SCTP later when
it becomes wider available. Protocol uses TCP, it breaks stream to
variable-sized records (length in header up to 64K) and multiplexes several "substreams". SCTP can do it for me, it's wonderful, but in practice there
are some questions.

How long can be one particular SCTP message? Can I rely on the fact that it
can be unbounded, e.g. I want to emulate a stream with transfer of
6 Gig-sized file?
Protocol wise there is no limitation of the message size. API wise, for
this size of a message you need to use the explicit EOR mode to be able
to pass this large message using multiple sequential send() calls.


Can I use 32-bit PPID field for my own headers/arbitrary values or I must
register that numbers somewhere before using?
Protocolwise: Yes you can do that. However, I would not encourage you
to do that. Protocol analyzers (like Wireshark) use this field to
determine the upper layer protocol based on the registration found at
the corresponding IANA assignment.


Can a message be of zero-length data (only headers) ?
Empty user messages, i.e. a DATA chunk without payload is not allowed.
An empty SCTP message, i.e. only the common header without any chunks
is allowed and processed by FreeBSD when received, but ever send (well,
I do not know a way to force the FreeBSD implementation to send it).


What is the relation between SCTP streams in both directions? Can streams
be opened and closed on-demand, like SSH port forwarding (yet again
multiplexing example) or they are preallocated at connection setup all
together? What is the minimum number of streams application can rely upon
(or it just one stream 0 in general case) ?
If you restrict to protocols being in RFC status, there is no way of
modifying the number of streams during the lifetime of an association.
The number of streams in each direction is negotiated during the
association setup. The streams in bother directions are completely
independent. There is always at least one stream in each direction, which
is stream 0.

However, there is an extension (currently specified in an Internet Draft) which allows the addition of streams during the lifetime of an association.
The ID is at least partially supported by the FreeBSD implementation.
https://datatracker.ietf.org/drafts/draft-stewart-sctpstrrst/


Another important questions are related with blocking and non- blocking I/O.

With TCP servers I have two models: in one a thread/process per client
(usually blocking), in other - a single-threaded FSM (Finite-State Machine) serving all clients using select()/poll()/kqueue()/etc. Both rely on the
usual UNIX way of creading new file descriptor on accept().

My server currently uses FSM model, but question is interesting for both. I didn't find any words about descriptor duplication or non-blocking I/O
in SCTP man pages
Have you looked at
http://www.ietf.org/internet-drafts/draft-ietf-tsvwg-sctpsocket-16.txt


How can I put request to kernel for a connect, for example, and then sleep until connect will complete or event in some another descriptor will occur?
If you use the 1-to-1 style API, it should be similar to using TCP.
Put the socket in non-blocking mode, enable notifications,
call connect() and wait until the fd becomes readable. You should get an
indication that that association has been established or could not start.


How can I put each client to it's fd and then do a kqueue()/kevent() on a
set of those fd's (and other items) ? It is very handy to have this
architecture as kevent() allows to store an arbitrary void* in it's
structure which I can later use to quickly dispatch events.

And, of course, all this usual C10K-problem-solving-TCP-server tricks I want with basic SCTP SEQPACKET benefits: multiple streams and message record separation (I don't need other SCTP features currently). Where can I find answers to these questions, like it was with W.R.Stevens books for TCP ?..
Have you looked at the third edition of 'Unix Network Programming'? Randall
Stewart wrote a couple of sections covering SCTP...


--
WBR, Vadim Goncharov. ICQ#166852181 mailto:[EMAIL PROTECTED] [Moderator of RU.ANTI-ECOLOGY][FreeBSD][http://antigreen.org][LJ:/ nuclight]

_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"


_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to