1. 程式人生 > >TCP網路程式設計中RST分節總結

TCP網路程式設計中RST分節總結

RST為“復位”,它是TCP在某些錯誤情況下所發出的一種TCP分節。

有三個條件可以產生RST:

       1), SYN到達某埠但此埠上沒有正在監聽的伺服器。對於UDP,當一個數據報到達目的埠時,該埠沒在使用,它將產生一個ICMP埠不可達的資訊。而TCP則使用復位。

       2), TCP想取消一個已有連線

       3), TCP接收了一個根本不存在的連線上的分節。

1.  connect 

函式返回錯誤ECONNREFUSED:

如果對客戶的SYN的響應是RST,則表明該伺服器主機在我們指定的埠上沒有程序在等待與之連線(例如伺服器程序也許沒有啟動),這稱為硬錯(

hard error),客戶一接收到RST,馬上就返回錯誤ECONNREFUSED.

TCP為監聽套介面維護兩個佇列。兩個佇列之和不超過listen函式第二個引數backlog

當一個客戶SYN到達時,若兩個佇列都是滿的,TCP就忽略此分節,且不傳送RST.這個因為:這種情況是暫時的,客戶TCP將重發SYN,期望不久就能在佇列中找到空閒條目。要是TCP伺服器傳送了一個RST,客戶connect函式將立即返回一個錯誤,強制應用程序處理這種情況,而不是讓TCP正常的重傳機制來處理。這樣客戶區別不了這兩種情況:作為SYN的響應,意為“此埠上沒有伺服器”的RST還是意為“有伺服器在此埠上但其佇列滿”的

RST.

有以下兩種處理方法:忽略新的SYN,或為此SYN響應一個RST

2.往一個對端已經關閉的套接字上寫入資料會收到一個RST訊號

如果此時不判斷read , write函式的返回值,就不知道伺服器是否響應了RST, 此時客戶端如果向接收了RST的套介面進行寫操作時,核心給該程序發一個SIGPIPE訊號。此訊號的預設行為就是終止程序,所以,程序必須捕獲它以免被終止。

3.  伺服器主機崩潰後重啟

如果伺服器主機與客戶端建立連線後崩潰,如果此時,客戶端向伺服器傳送資料,而伺服器已經崩潰不能響應客戶端ACK,客戶TCP將持續重傳資料分節,試圖從伺服器上接收一個ACK,如果伺服器一直崩潰客戶端會發現伺服器已經崩潰或目的地不可達,但可能需要比較長的時間;

如果伺服器在客戶端發現崩潰前重啟,伺服器的TCP丟失了崩潰前的所有連線資訊,所以伺服器TCP對接收的客戶資料分節以RST響應。

相關推薦

TCP網路程式設計RST總結

RST為“復位”,它是TCP在某些錯誤情況下所發出的一種TCP分節。 有三個條件可以產生RST:        1), SYN到達某埠但此埠上沒有正在監聽的伺服器。對於UDP,當一個數據報到達目的埠時,該埠沒在使用,它將產生一個ICMP埠不可達的資訊。而TCP則使用復

關於網路程式設計Socket的初步總結

1,要實現通訊必須先建立套接字 2,上一步驟中建立的套接字只用於listen()和accept(),不用於收發資料【以tcp為例來說】 [https://blog.csdn.net/David_xtd/article/details/7087843?utm_source=blogxg

網路程式設計TCP網路程式設計connect()、listen()和accept()三者之間的關係

舉個簡單的例子(以下程式碼只是示範性的,用於說明不同套接字的作用,實際的函式會需要更多的引數): /* 建立用於監聽和接受客戶端連線請求的套接字 */ server_sock = socket(); /* 繫結監聽的IP地址和埠 */ bind(server_sock); /* 開始監聽 */ li

【Linux 網路程式設計TCP網路程式設計connect()、listen()和accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下: connect()函式:對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次握手,而這個連接的過程是由核心完成,不是這個函式完成的,這個函式的作用僅僅是通知 Linux 核心

TCP網路程式設計connect()、listen()和accept()三者之間的關係

基於 TCP 的網路程式設計開發分為伺服器端和客戶端兩部分,常見的核心步驟和流程如下:connect()函式對於客戶端的 connect() 函式,該函式的功能為客戶端主動連線伺服器,建立連線是通過三次

關於網路程式設計MTU、TCP、UDP優化配置的一些總結

轉載來自:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html 首先要看TCP/IP協議,涉及到四層:鏈路層,網路層,傳輸層,應用層。    其中乙太網(Ethernet)的資料幀在鏈路層

淺談 TCP/IP 網路程式設計 socket 的行為

來源:PromisE_謝  連結:www.cnblogs.com/promise6522/archive/2012/03/03/2377935.html 我認為,想要熟練掌握 Linux 下的 TCP/IP 網路程式設計,至少有三個層面的知識需要熟悉: TCP/IP

網路程式設計重要函式總結:如何判斷socket關閉

1、阻塞模式與非阻塞模式下recv的返回值各代表什麼意思?有沒有區別?(就我目前瞭解阻塞與非阻塞recv返回值沒有區分,都是 <0:出錯,=0:連線關閉,>0接收到資料大小,特別:返回值 <0時並且(errno == EINTR || errno == EWOULDBLOCK |

Linux系統網路程式設計TCP通訊socket--send導致程序被關閉

send(sockfd, buff, sizeof(buff), 0); 在linuxTCP通訊中上述send形式是常用的設定方式,但是如果在TCP連結斷開後呼叫該send函式,多次即會導致程序結束。 解決方法 最簡單的方式就是 send(sockfd, buff, sizeo

網路程式設計當強制結束TCP服務端之後客戶端可能出現Connection refused錯誤

當客戶端連線到服務端時,強制結束服務端程式,當再次啟動服務端,客戶端在連線時出現Connection refused錯誤,原因為服務端重新啟動後的埠號發生改變,改變的原因不清楚,可以用getsockn

談談網路程式設計應用層(基於TCP/UDP)的協議設計

 對於初涉網路程式設計的開發人員來說,在通訊協議的設計上一般會有所困惑。一般的網路程式設計書籍上也較少涉及這方面的內容。估計是覺得太簡單了。這塊確實是不難,但如果不瞭解,又很容易出簍子或者繞彎路。下面我就來談談基於TCP/UDP的協議設計。     1、基於TCP的協議

淺談TCP/IP網路程式設計socket的行為

socket錯誤碼: EINTR: 4 阻塞的操作被取消阻塞的呼叫打斷。如設定了傳送接收超時,就會遇到這種錯誤。 只能針對阻塞模式的socket。讀,寫阻塞的socket時,-1返回,錯誤號為INTR。另外,如果出現EINTR即errno為4,錯誤描述Interrupted system call,操作

TCP網路程式設計心得體會淺談

**在tcp程式設計中,我們以服務端為傳送端,客戶端為接收端舉例。通訊過程中傳送端和接收端都有一個接收緩衝區和傳送緩衝區(也就是說一邊兩個緩衝區),在程式設計過程中當我們使用send方法的時候所做的工作就是—-將程式中的資料傳送到計算機核心的傳送緩衝區,而當我們使用recv()方法時就是—將

java網路程式設計常用的類

java網路程式設計中常用的類 1、InetAddress 用於封裝計算機的IP地址和DNS(Domain Name System域名系統)(沒有埠資訊) InetAddress沒有構造器,要得到物件只能通過靜態方法實現 /** * 使用getLocalHost的方法建立InetA

Android網路程式設計的URLConnection的IP設定

虛擬機器測試:10.0.0.2 PC連線乙太網:通過cmd命令,進入命令視窗。輸入ipconfig檢視乙太網介面卡ipv4地址 Android測試機連入本機WiFi網路:如圖 如果Android上提示 java.net.SocketTimeoutEx

【Python】TCP網路程式設計

【Python TCP網路使用】 注意: 必須先啟動伺服器!!!不然會報錯 import socket; def LanJian_TcpClient(): with socket.socket(socket.AF_INET, socket.SOCK_STREAM)

網路程式設計time_wait的作用和套接字選項SO_REUSEADDR

這兩天看APUE為一個簡單的問題特別惱火,該問題起源於兩個套接字選項就是SO_REUSEADDR和SO_REUSEPORT其實在看的過程中問學長了,學長解釋的也比較清楚,就是自己悟性不好,一時半會沒理解。自己在網上找了幾篇優秀的部落格看了,受益頗多! 先從套接字選項SO_REUSEADD

基於linux環境tcp網路程式設計(線上英英詞典)文件【2】

程式碼: client.c /************************************************************************* File Name: client.c Author: Young

Java網路程式設計7.TCP網路程式設計之客戶端鍵盤錄入伺服器控制檯輸出

TCP網路程式設計之客戶端鍵盤錄入伺服器控制檯輸出 1、鍵盤錄入資料 BufferedReader br = new BufferedReader(new InputStreamReader(S

TCP網路程式設計經典案列

伺服器端 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; imp