1. 程式人生 > >記錄一次,三次握手中缺少第二次握手導致的問題(即缺少SYN ACK返回,實際是tcp_tw_recycle設定導致的問題)

記錄一次,三次握手中缺少第二次握手導致的問題(即缺少SYN ACK返回,實際是tcp_tw_recycle設定導致的問題)

三次握手中缺少第二次握手導致的問題

阿里雲新購的ECS,映象使用的微柳科技的Centos7+PHP環境,實際使用中發現如下現象:
1.公司IP/某常用IP經常無故無法連線伺服器(包括ssh-22,mysql-3306,http-80等)
2.在公司IP無法連線的時候,手機網或其他IP網路,可以連上
3.關閉防火牆,開啟阿里安全組也不行
4.伺服器抓包正常連線ssh的包大概有30行,非正常的連線只有一行SYN包,沒有SYN ACK包
5.最突出的現象,時斷時續

解決過程:

剛開始以為是伺服器的問題,為此加了好幾個centos/linux群請教幾個群主等,他們聽完描述後基本上告訴我是公司網路的問題,我在公司網路上也花費了很多時間,卻始終未解決問題.
其實在這時候,抓包已經做過了,對於伺服器沒有返回SYN ACK包也看到了,也懷疑了,但卻不知道怎麼百度這個問題,因為無法對這個第二次握手增加準確的關鍵詞來描述(百度”三次握手 第二次”之類的關鍵詞,結果都是知乎的文章,我也是醉了).
後來實在沒辦法,只能自補一下三次握手,然後從中抽取出 SYN ACK這個關鍵詞,百度這個詞得到了tcp_tw_recycle這個設定,看了前輩們的描述,立馬感覺就是這個問題,依法配置伺服器後,得到解決.
解決辦法較為簡單

#>vi /etc/sysctl.conf
//將以下兩項置0
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_timestamps = 0
//之後執行sysctl -p或重啟
#>sysctl -p

注:本人直接修改了以上兩項,建議各位瞭解以上兩項後再做修改,因為這兩項是基礎配置,而且tcp_timestamps 還有其他用處.
總結:基礎知識永不過時,思路大於做事.

在此補充兩個抓包圖
正常包:
抓的正常包
異常包:
抓的異常包
圖2中,只有SYN,沒有SYN ACK