今天在寫一個Python與html5 Websocket 實例,麼次終止運行重新運行腳本總是提示地址已經存在並且被使用!查詢相關文檔才知道在socket編程中,當通過客戶端向服務器端發送消息,關閉了連接後,這時如果馬上再去運行服務器端程序,會提示這個錯誤:
socket.error: [Errno 98] Address already in use
這是因為在TCP/IP終止連接的四次握手中,當最後的ACK回復發出後,有個2MSL的時間等待,MSL指一個片段在網絡中最大的存活時間,這個時間一般是30秒,所以基本上過60秒後就可以重新連接!
為什麼要等待2MSL?是因為在最後發出ACK回復後,發送方不能確認ACK是否被另一端正常收到,如果另一端沒有收到ACK回復的話,將會在1MSL後再次發送FIN片段。所以說發送方等待2MSL時間,也就是剛好它發ACK回復和對方發送FIN片段的時間,如果此時間內都沒有再次收到FIN片段的話,發送方就假設對方已經正常接收到了ACK回復,此時它就會正常關閉連接!