A method of adaptively transmitting streaming data to a client, comprising: receiving, in a server, a request for a data asset from the client, the request being received at an I/O port of a server servicing a communications channel; establishing a server-side network layer filter on the I/O port communications channel with the client; transcoding a first segment of the data asset according to initial transcoding parameters; transmitting a first fragment of the transcoded first segment of the data asset from the server to the client over the communication channel; transmitting a second fragment of the transcoded first segment of the data asset from the server to the client over the communication channel; receiving, in the server, first and second acknowledgement messages, the first and second acknowledgement messages acknowledging reception of the first and second fragments by the client respectively, the first and second acknowledgement messages being temporally successive acknowledgement messages received in the server at different times; locally timestamping, by the server, the first and second acknowledgement messages; generating an estimate of a bandwidth of the communications channel as a difference in byte-values acknowledged between the first and second acknowledgement messages divided by a time difference of the first and second acknowledgement messages; filtering, by a bandwidth smoothing filter, the estimate of the bandwidth; generating adaptive transcoding parameters at least in part from the filtered estimate of the bandwidth, the filtered estimate generated at the server; transcoding a further segment of the data asset according to the adaptive transcoding parameters; and transmitting the further segment of the data asset. receiving, in a server, a request for a data asset from the client, the request being received at an I/O port of a server servicing a communications channel; establishing a server-side network layer filter on the I/O port communications channel with the client; transcoding a first segment of the data asset according to initial transcoding parameters; transmitting a first fragment of the transcoded first segment of the data asset from the server to the client over the communication channel; transmitting a second fragment of the transcoded first segment of the data asset from the server to the client over the communication channel; receiving, in the server, first and second acknowledgement messages, the first and second acknowledgement messages acknowledging reception of the first and second fragments by the client respectively, the first and second acknowledgement messages being temporally successive acknowledgement messages received in the server at different times; locally timestamping, by the server, the first and second acknowledgement messages; generating an estimate of a bandwidth of the communications channel as a difference in byte-values acknowledged between the first and second acknowledgement messages divided by a time difference of the first and second acknowledgement messages; filtering, by a bandwidth smoothing filter, the estimate of the bandwidth; generating adaptive transcoding parameters at least in part from the filtered estimate of the bandwidth, the filtered estimate generated at the server; transcoding a further segment of the data asset according to the adaptive transcoding parameters; and transmitting the further segment of the data asset.