A system comprising: a first network node, the first network node having a transmit buffer; a second network node, the second network node including a receive buffer; at least one communication path (702, 703) connecting the first network node to the second network node; a first cache forming part of the first network node; and a second cache forming part of the second network node, wherein: the first cache is configured to communicate with a host to request commands and associated data, to control data flow to and from the host, to manage storage of commands and data from the host and to cache data received from the host; the first network node is configured to transmit the data from the first cache via the transmit buffer to the second network node over the at least one communication path; the second network node is configured to receive the data transmitted by the first network node via the receive buffer and to store the received data in the second cache prior to providing the data from the second cache to a connected device; the second network node is configured to use operating parameters of the second cache to calculate a hunger parameter representative of the capability of the second cache to receive more data; the second network node is configured to communicate the hunger parameter to the first network node; and the first network node is configured to use the hunger parameter received from the second network node to change the configuration of the first cache, in particular when a hunger rate indicated by the hunger parameter is relatively high: raising a low water mark of the cache and/or increasing a size of the cache so as to result in the first network node requesting more commands and associated data from the host, and when a hunger rate indicated by the hunger parameter is relatively low: lowering a high water mark of the cache and/or reducing a size of the cache so as to result in the first network node requesting fewer commands and associated data from the host. a first network node, the first network node having a transmit buffer; a second network node, the second network node including a receive buffer; at least one communication path (702, 703) connecting the first network node to the second network node; a first cache forming part of the first network node; and a second cache forming part of the second network node, wherein: the first cache is configured to communicate with a host to request commands and associated data, to control data flow to and from the host, to manage storage of commands and data from the host and to cache data received from the host; the first network node is configured to transmit the data from the first cache via the transmit buffer to the second network node over the at least one communication path; the second network node is configured to receive the data transmitted by the first network node via the receive buffer and to store the received data in the second cache prior to providing the data from the second cache to a connected device; the second network node is configured to use operating parameters of the second cache to calculate a hunger parameter representative of the capability of the second cache to receive more data; the second network node is configured to communicate the hunger parameter to the first network node; and the first network node is configured to use the hunger parameter received from the second network node to change the configuration of the first cache, in particular when a hunger rate indicated by the hunger parameter is relatively high: raising a low water mark of the cache and/or increasing a size of the cache so as to result in the first network node requesting more commands and associated data from the host, and when a hunger rate indicated by the hunger parameter is relatively low: lowering a high water mark of the cache and/or reducing a size of the cache so as to result in the first network node requesting fewer commands and associated data from the host. the first cache is configured to communicate with a host to request commands and associated data, to control data flow to and from the host, to manage storage of commands and data from the host and to cache data received from the host; the first network node is configured to transmit the data from the first cache via the transmit buffer to the second network node over the at least one communication path; the second network node is configured to receive the data transmitted by the first network node via the receive buffer and to store the received data in the second cache prior to providing the data from the second cache to a connected device; the second network node is configured to use operating parameters of the second cache to calculate a hunger parameter representative of the capability of the second cache to receive more data; the second network node is configured to communicate the hunger parameter to the first network node; and the first network node is configured to use the hunger parameter received from the second network node to change the configuration of the first cache, in particular when a hunger rate indicated by the hunger parameter is relatively high: raising a low water mark of the cache and/or increasing a size of the cache so as to result in the first network node requesting more commands and associated data from the host, and when a hunger rate indicated by the hunger parameter is relatively low: lowering a high water mark of the cache and/or reducing a size of the cache so as to result in the first network node requesting fewer commands and associated data from the host.