1. 如何得知socket的緩存大小,這個緩存是否有上限,是否會溢出
一:如何得知socket的緩沖大小?
通過socket選項可以獲得socket的緩沖大小。(以下是python代碼,sock為socket對象)
sock.getsockopt(SOL_SOCKET,SO_RCVBUF):獲取接收緩沖區的大小
sock.getsockopt(SOL_SOCKET,SO_SNDBUF):獲得發送緩沖區的大小
註:UDP協議在內核實現中沒有發送緩沖區。
二:這個緩沖是否有上限?
緩沖區存在上限,沒一個socket對象的緩沖區有上限,系統中所有的socket緩沖區的總大小也存在上限。
三:是否會溢出?
TCP協議是可靠的有序的位元組流協議,其可靠性與接收端的滑動窗口機制有關,而滑動窗口和TCP的接收緩沖區有關。
TCP協議的緩沖區不會溢出,如果接收緩沖區已滿,則通告窗口為0,不能在接收發送端發過來的數據。如果發送緩沖區已滿(則可以說明對端的接收緩沖區一定已滿),應用層的send調用阻塞(採用阻塞式IO)。所以說TCP協議的緩沖區不會溢出。
UDP協議的緩沖區會溢出,UDP協議在實現上沒有發送緩沖區,接收緩沖區存在上限,當UDP的接收緩沖區達到上限時,以後接收到的數據報直接丟棄,這也是UDP協議不可靠的一個原因。
-----------------------------------------------------------------------------------------------------------
推薦你看一下陶輝的」高性能網路編程「系列,肯定會受益匪淺。
2. 關於socket通信中tcp緩存的問題
不會清空的,只有在收到ack後才會清空對應的數據。如果沒有收到ACK,在一個超時時間後,發送端會重新嘗試發送緩存裡面的數據,你網路斷開以後再接上,數據依舊可以發送過去,但是如果斷開時間過長,發送方已經放棄重新發送了,則再連接上也不能發送數據了。