Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Mar 2008 11:59:14 +0100
From:      Michael Tuexen <Michael.Tuexen@lurchi.franken.de>
To:        vadim_nuclight@mail.ru
Cc:        freebsd-net@freebsd.org
Subject:   Re: SCTP using questions (API etc.)
Message-ID:  <58141B67-8B7F-49FE-BC20-2A0B94A589A0@lurchi.franken.de>
In-Reply-To: <slrnfsssde.30l3.vadim_nuclight@hostel.avtf.net>
References:  <slrnfsssde.30l3.vadim_nuclight@hostel.avtf.net>

next in thread | previous in thread | raw e-mail | index | archive | help
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:vadim_nuclight@mail.ru
> [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 "freebsd-net-unsubscribe@freebsd.org"
>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?58141B67-8B7F-49FE-BC20-2A0B94A589A0>