1. 程式人生 > >一個客戶端快速頻繁的連線伺服器:Cannot assign requested address

一個客戶端快速頻繁的連線伺服器:Cannot assign requested address

背景機制:
1. 一個tcp伺服器,埠1234;伺服器限定只能維持一個tcp連線。該tcp伺服器是原先已有的。
2. 一個web伺服器,使用tcp客戶端連線tcp server的1234埠。一個post請求對應一次[tcp client連線tcp server:1234],完成post請求後,斷開該tcp連線。
問題現象:

當其中一個web頁面中有多個ajax的post請求時,tcp client連線不上tcp server,並出現錯誤。

  • 大致上是由於客戶端頻繁的連伺服器,由於每次連線都在很短的時間內結束,導致很多的TIME_WAIT,以至於用光了可用的端 口號

    ,所以新的連線沒辦法繫結埠,即“Cannot assign requested address”。是客戶端的問題不是伺服器端的問題。通過netstat,的確看到很多TIME_WAIT狀態的連線。

  • client端頻繁建立連線,而埠釋放較慢,導致建立新連線時無可用埠。

解決方法1(沒啥效果):

執行命令修改如下2個核心引數 (需要root許可權)

sysctl -w net.ipv4.tcp_timestamps=1  開啟對於TCP時間戳的支援,若該項設定為0,則下面一項設定不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1  表示開啟TCP連線中TIME-WAIT sockets的快速回收

解決方法2:
這裡我用的是該方法,放慢速度去連線伺服器。當有多個ajax的post需要同時請求時,就一個一個的去請求。