2015-11-13 24 views
0

我遇到了我懷疑是TCP的行爲,但是我不明白,並希望得到幫助。在定期調用的循環中通過TCP發送的第一個請求花費了很多時間

定期調用通過TCP發送請求並讀取響應的循環。

無論循環的大小如何,發送的第一個請求 - 響應對幾乎總是比其他對需要更多的時間。

這不會發生當我在同一臺機器上運行客戶端和服務器,因此我懷疑這是與TCP有關。

的代碼示例波紋管示出了該問題:

調用每一秒:

for (int sentPackets = 0; sentPackets < totalPackets; sentPackets++) { 

     // send request 
     stream.write(packet); 
     stream.flush();    
     long sentAt = System.currentTimeMillis(); 

     // read response 
     String response = StreamReader.read(inputStream, buffer); 
     long receivedAt = System.currentTimeMillis(); 

     long dif = receivedAt - sentAt; 

     System.out.println("dif: "+ dif); 

StreamReader是utilty從套接字讀取。

read方法實現以下所示的:

public static String read(DataInputStream stream, byte[] buffer) throws IOException { 

    int totalBytes = 0; 

    // keep reading from stream until entire packet is available 
    while (totalBytes < buffer.length) { 

     // read into buffer, from position of latest byte read, up to size of buffer 
     int bytesRead = stream.read(buffer, totalBytes, buffer.length - totalBytes); 

     // premature end of stream 
     if (bytesRead == -1) { 

      System.out.println("unexpected end of stream during socket read operation"); 
      break; 
     } 

     else 
      totalBytes = bytesRead; 
    } 

    return new String(buffer); 
} 

有時間戳之間沒有其他操作,只寫和讀插座。

在導致此行爲的循環之間會發生什麼,而這不會發生在本地主機上?

波紋管是一些可視化的例子。

dif: 172 
dif: 15 
dif: 0 
dif: 0 

dif: 0 
dif: 0 
dif: 0 
dif: 0 

dif: 203 
dif: 0 
dif: 16 
dif: 0 

dif: 47 
dif: 0 
dif: 0 
dif: 16 

dif: 16 
dif: 16 
dif: 0 
dif: 0 

回答

1

我懷疑Nagle's algorithm

Nagle算法,約翰·納格而得名,是通過減少需要在發送數據包的數量提高了TCP/IP網絡的效率的一種手段網絡。它通過組合一些小的傳出消息,並一次發送它們。

對於Windows上的本地主機(但不是Mac或Linux),Nagle的算法已禁用。

如果等待時間確實存在問題,您可以使用TCP_NODELAY套接字選項禁用Nagle的算法。如果您發送大量小包,它將以較高帶寬爲代價減少延遲。

+0

我正在閱讀,並在鏈接中提到寫讀寫讀取是好的。所以不確定什麼是好的。另外,我可以禁用它從Java的特定連接或其OS範圍設置? – John

+0

這工作,並實際上解決了我有過的另一個問題。非常感謝你。 – John

+0

用於特定連接。 –

相關問題