RST包標示覆位、用來異常的關閉鏈接,在下列場景下會產生RST包:服務器
- connect一個不存在的端口,會收到對方服務器的RST響應;
- 向一個已經關閉的鏈接發送數據,會收到對方服務器的RST響應;
- 向一個已經崩潰的對端發送數據(鏈接以前已經被創建),會收到對方服務器的RST響應;
- close(sockfd)時,直接丟棄接收緩衝區未讀取的數據,並給對方發一個RST。這個是由SO_LINGER選項來控制的;
- a重啓,收到b的keepalive探針,a向b發送rst,通知b。
下列狀況只會發送FIN包,而不發送RST包:it
- 使用shutdown、close關閉套接字。
- 套接字關閉前,使用sleep。對運行的程序Ctrl+C。
- 套接字關閉前,執行return、exit(0)、exit(1)。
TCP 鏈接在任何狀態下,只要收到RST包,便可進入CLOSED狀態。select
收到RST報文段的一端不會對發送的一端發出任何響應,只會終止該鏈接。在應用層行爲以下:程序
- 阻塞模型下,內核沒法主動通知應用層出錯,只有應用層主動調用read()或者write()這樣的IO系統調用時,內核纔會利用出錯來通知應用層。
- 非阻塞模型下,select或者epoll會返回sockfd可讀,應用層對其進行讀取時,read()會報錯。