TCP之RST包

RST包標示覆位、用來異常的關閉鏈接,在下列場景下會產生RST包:服務器

  1. connect一個不存在的端口,會收到對方服務器的RST響應;
  2. 向一個已經關閉的鏈接發送數據,會收到對方服務器的RST響應;
  3. 向一個已經崩潰的對端發送數據(鏈接以前已經被創建),會收到對方服務器的RST響應;
  4. close(sockfd)時,直接丟棄接收緩衝區未讀取的數據,並給對方發一個RST。這個是由SO_LINGER選項來控制的;
  5. a重啓,收到b的keepalive探針,a向b發送rst,通知b。

下列狀況只會發送FIN包,而不發送RST包:it

  1. 使用shutdown、close關閉套接字。
  2. 套接字關閉前,使用sleep。對運行的程序Ctrl+C。
  3. 套接字關閉前,執行return、exit(0)、exit(1)。 

TCP 鏈接在任何狀態下,只要收到RST包,便可進入CLOSED狀態。select

收到RST報文段的一端不會對發送的一端發出任何響應,只會終止該鏈接。在應用層行爲以下:程序

  • 阻塞模型下,內核沒法主動通知應用層出錯,只有應用層主動調用read()或者write()這樣的IO系統調用時,內核纔會利用出錯來通知應用層。
  • 非阻塞模型下,select或者epoll會返回sockfd可讀,應用層對其進行讀取時,read()會報錯。
相關文章
相關標籤/搜索