
\section{Introduction}
\label{sec:intro}

Peer-to-peer protocols currently form the most heavily used protocol class in
the Internet, along with BitTorrent, the most popular protocol for content
distribution. A high number of studies and investigations have been undertaken
to measure, analyse and improve the inner workings of the BitTorrent protocol.
However, enhancing the protocols used at the network layer is not the only
approach to improving file sharing techniques, but also optimizing the client
implementations (P2P applications). As usually these applications are not CPU
but rather I/O bound, new research opportunities have appeared in the
Operating Systems field.

This paper aims to improve peer-to-peer technologies by providing a reliable
and performing implementation of the SWIFT\cite{swift} multiparty protocol at
the kernel level. Basically we developed a new UNIX kernel module that
provides the implementation of a completely new protocol, capable of
transferring multiple files between multiple peers using a single system call.
We are very confident that this approach must improve the performance of P2P
file sharing application by reducing the overhead of the kernel context
switches caused by multiple system calls.

Currently, the most efficient implementation of an file content distribution
application in an UNIX environment is using the \texttt{sendfile} system call.
This implementation uses a zero-copy mechanism that transfers the content of a
file from the hard disk to the network interface without passing any data to
userspace. Considering these qualifications, we have compared our module's
benchmarks with \texttt{sendfile}'s in order to classify the enhancements
brought by this implementation.

The content of this paper is organized as it follows: in the next section we
will present some related work on the multiparty topics. In Section
\ref{sec:design} we describe how the kernel module was designed to be
used in userspace, followed by the actual implementation in Section
\ref{sec:implementation}. In the next two sections we will present
some performance tests we have conducted along with the results achieved.
Finally, in Section \ref{sec:conclusions} we will draw some conclusions
followed by the some further work that has to be done.
