一、出現RST包的情況
1、連接請求到達時,目的端口不存在情況
2、向一個已經關閉的連接發送數據
3、向一個已經崩潰的對端發送數據(連接之前已經被建立)
4、請求超時。 使用setsockopt的SO_RCVTIMEO選項設置recv的超時時間。接收數據超時時,會發送RST包
5、close(sockfd)時,直接丟棄接收緩沖區未讀取的數據,並給對方發一個RST。這個是由SO_LINGER選項來控制的
6、TCP收到了一個根本不存在的連接上的分節
7、.處理半打開連接, 一方關閉了連接,另一方卻沒有收到結束報文(如網絡故障),此時另一方還維持着原來的連接。而一方即使重啟,也沒有該連接的任何信息。這種狀態 就叫做半打開連接。而此時另一方往處於半打開狀態的連接寫數據,則對方回應RST復位報文
二、收到RST包后的表現
1、TCP socket在任何狀態下,只要收到RST包,即可進入CLOSED初始狀態
2、值得注意的是RST報文段不會導致另一端產生任何響應,另一端根本不進行確認。收到RST的一方將終止該連接
三、程序中表現
1、阻塞模型下,內核無法主動通知應用層出錯,只有應用層主動調用read()或者write()這樣的IO系統調用時,內核才會利用出錯來通知應用層對端RST
2、非阻塞模型下,select或者epoll會返回sockfd可讀,應用層對其進行讀取時,read()會報錯RST
以上是通過網絡和書本知識總結的RST情況,后續工作中遇見相同情況會補充上去