tcp中的RST報文段理解


一、出現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情況,后續工作中遇見相同情況會補充上去


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM