2015-01-14 57 views
2

假設我有一個TCP客戶端和一個TCP服務器。首先,客戶端向服務器發送一些數據,但服務器忙於做其他事情,所以它不會讀取這個連接。數據保存在服務器主機上的TCP接收緩衝區中。在這一點上,請幫我澄清以下不同情況下會發生什麼:關閉/關閉對TCP接收緩衝區的影響

  1. 服務器調用read之前,客戶端此連接上調用close。並且FIN已經到達服務器TCP,並且服務器TCP已經發送了ACK。此時,如果服務器在此套接字上調用read,它將返回什麼?它是否返回TCP接收緩衝區中的未讀數據?還是隻返回0來表示EOF,並且未讀數據被丟棄?
  2. 在服務器呼叫read之前,客戶端在此連接上調用shutdownSHUT_WR。並且FIN已經到達服務器TCP,並且服務器TCP已經發送了ACK。此時,如果服務器在此套接字上調用read,它將返回什麼?它是否返回TCP接收緩衝區中的未讀數據?還是隻返回0來表示EOF,並且未讀數據被丟棄?
  3. 在服務器調用read之前,客戶端剛剛退出而不調用closeshutdown。並且客戶端主機中的TCP將發送FIN,這個FIN已經到達服務器TCP,並且服務器TCP已經發送了ACK。此時,如果服務器在此套接字上調用read,它將返回什麼?它是否返回TCP接收緩衝區中的未讀數據?還是隻返回0來表示EOF,並且未讀數據被丟棄?

回答

2

在服務器調用讀取之前,客戶端調用在此連接上關閉。 FIN已經到達服務器TCP,並且服務器TCP已經發送了ACK。所以在這一點上,如果在這個套接字上讀取服務器調用,什麼會讀取返回?它是否返回TCP接收緩衝區中的未讀數據?

是的。

或者它只是返回0來指示EOF,並且未讀取的數據被丟棄?

號服務器調用read之前,客戶端調用關機與此相關的SHUT_WR。 FIN已經到達服務器TCP,並且服務器TCP已經發送了ACK。所以在這一點上,如果在這個套接字上讀取服務器調用,什麼會讀取返回?它是否返回TCP接收緩衝區中的未讀數據?或者它只是返回0來指示EOF,並且未讀數據被丟棄?

同上。

在讀取服務器調用之前,客戶端只是在不調用close或shutdown的情況下退出。客戶端主機中的TCP將發送FIN,此FIN已到達服務器TCP,並且服務器TCP已發送ACK。所以在這一點上,如果在這個套接字上讀取服務器調用,什麼會讀取返回?它是否返回TCP接收緩衝區中的未讀數據?或者它只是返回0來指示EOF,並且未讀數據被丟棄?

同上。

接收緩衝區的唯一方法可以得到清除是通過讀取所有的數據,或者如果服務器收到一個重置,即一個RST,這可以通過各種方式引起的,或者如果服務器關閉過程中的沒有讀取所有數據的套接字,在這種情況下,如果存在未決讀取數據,則其問題RST