解決socket.error: [Errno 98] Address already in use問題

剛剛開始使用flask框架寫了兩個小程序。然后我先訪問了第一個“Hello,Web”的小程序,運行通過,然后想看看第二個inputname的程序是不是寫對,但是linux報錯:
socket.error: [Errno 98] Address already in use
大概意思就是地址被占用。因為socket默認是不支持地址復用的。為什么程序跑完了端口還是被占用著?這個問題就要TCP連接的“四次揮手”。
我們可能都有聽過TCP/IP中“三次握手,四次揮手”,前者我們可能會更加了解一點,后者就不知道是什么樣子。我也是T_T,所以我決定弄懂它。

三次握手
三次握手

(1)第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=J,并將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
(2)第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,并將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
(3)第三次握手:Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,并將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。

四次揮手
四次揮手(一方被動)

由于TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務后,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。
(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
(2)第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
(4)第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

同時揮手

在TCP/IP終止連接的四次握手中,當最后的ACK回復發出后,有個2MSL的時間等待,MSL指一個片段在網絡中最大的存活時間,這個時間一般是30秒,所以基本上過60秒后就可以重新連接!
為什么要等待2MSL?是因為在最后發出ACK回復后,發送方不能確認ACK是否被另一端正常收到,如果另一端沒有收到ACK回復的話,將會在1MSL后再次發送FIN片段。所以說發送方等待2MSL時間,也就是剛好它發ACK回復和對方發送FIN片段的時間,如果此時間內都沒有再次收到FIN片段的話,發送方就假設對方已經正常接收到了ACK回復,此時它就會正常關閉連接!

以上就解釋了為什么會出現跑另一個程序時會出現地址占用的情況。

接下去就是解決方案:
如果并發連接請求過多的時候,即短時間內連接請求很多,系統自動釋放已占用端口的時間還沒有到,又有連接請求(可用的端口已經被用完),所以還會出現 Address already in use錯誤提示),就會產生大量的TIME_WAIT狀態的連接。這種情況下就有必要調整下linux的TCP/IP內核參數,讓系統更快的釋放TIME_WAIT連接。對于并發連接量大的情況我們需要這樣設置:

用vi打開配置文件:
# vi  /etc/sysctl.conf 
然后,在這個文件中,加入下面的幾行內容:
net.ipv4.tcp_syncookies = 1    # 這一行配置文件里如果有就不用添加了  
net.ipv4.tcp_tw_reuse = 1  
net.ipv4.tcp_tw_recycle = 1  
net.ipv4.tcp_fin_timeout = 5 
最后輸入下面的命令,讓內核參數生效:
# /sbin/sysctl -p  
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容