(Light brown represents the
corresponding TCP/IP client)
So how does this differ from the first proposed design? In this
version, suggested by Greg Fenves, the server processes are simplified
by removing the need to handle multiple back ends. In other words, they
no longer need to
- Route messages to different plugins based on the contents
- Understand more than one set of messages
- Contain as much code.
Looking at a more detailed picture, let's add the data turbine and
authorization/authentication bits:
Data turbine interface
Now we can see how data is streamed to RDV. Note that each server will
need to use the binary data interface for this, which is a separate bit
of work to do. The turbine has interfaces for HTTP/DAV and Java, so
will need to use the binary interface that Creare has developed. This
section is light on detail because we have not yet investigated this
yet.
Security
There are several things to consider here:
- Message integrity - was the data corrupted, either accidentally
or delibarately?
- Authenticity - are you talking to the process you expected, or
the man in the middle?
- Authorization - is user J allowed to control hardware X?
- Encryption - is you have proprietary (e.g. commercial) data, you
might want to prevent against interception.
For our solution, we propose using a tiered solution:
- OpenSSL for communications
- Plain socket mode (default, fastest, simple)
- Message digests, plaintext - this addresses #1
- Encrypted with digests
- External username/password mechanism TBD. There are many
possibilities here (kerberos, PAM, JAAS, Gridauth, Globus, etc, etc).
The use of OpenSSL does complicate the development and compilation a
bit, but there are many offsetting factors. It's a well-established
standard, cross-platform, stable and can be accelerated with crypto
cards if desired. If we employ server and client certificates, we can
ensure secure communications with minimal overhead, both runtime and
administrative.
Communications protocol in detail
I've split the protocol into
a separate page,
as this was growing too large.
Compatability with existing systems
There are two primary issues in working with existing code: Whether or
not the protocol is sufficient, and the detailed issues with invoking
our communications libary from their code. One of the lessons learned
from NTCP was that a too-rigid protocol invited peculiar workarounds,
in particular the misuse of message types with undefined payloads.
Overloading the SET/GET pair produced a more flexible protocol at the
cost of compatibilty and opacity.
Any system that works with NHCP will need to
- Have OpenSSL available. Since this is nearly every OS with an IP
stack, not a big deal.
- Be able to invoke C/C++ code.
We will commit to
- Writing a plugin for existing NTCP-controlled hardware that uses
the ASCII
protocol (PDF).
- Writing an OpenSEES object to invoke our code.
We are investigating the SIMCOR/MATLAB interface, which is complicated
by MATLAB's single-threaded nature, which requires that the plugin be a
bit smarter about buffering. With the addition of the RESEND and
RECONNECT messages, it might be easier to implement; this is not yet
certain.