「網絡」異常網絡RST包出現的原因分析

有以下情況會發送RST包

1.connect一個不存在的端口;

2.向一個已經關掉的連接send數據;

3.向一個已經崩潰的對端發送數據(連接之前已經被建立);

4.close(sockfd)時,直接丟棄接收緩衝區未讀取的數據,並給對方發一個RST。這個是由SO_LINGER選項來控制的;

5.a重啟,收到b的保活探針,a發rst,通知b。

TCP socket在任何狀態下,只要收到RST包,即可進入CLOSED初始狀態。

值得注意的是RST報文段不會導致另一端產生任何響應,另一端根本不進行確認。收到RST的一方將終止該連接。程序行為如下:

阻塞模型下,內核無法主動通知應用層出錯,只有應用層主動調用read()或者write()這樣的IO系統調用時,內核才會利用出錯來通知應用層對端RST。

非阻塞模型下,select或者epoll會返回sockfd可讀,應用層對其進行讀取時,read()會報錯RST。

案例:那端主動發,就是哪端有問題。

「網絡」異常網絡RST包出現的原因分析


「網絡」異常網絡RST包出現的原因分析



分享到:


相關文章: