有以下情況會發送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。
案例:那端主動發,就是哪端有問題。
閱讀更多 barbarian 的文章