TCP網路程式設計中RST分節總結
RST為“復位”,它是TCP在某些錯誤情況下所發出的一種TCP分節。
有三個條件可以產生RST:
1), SYN到達某埠但此埠上沒有正在監聽的伺服器。對於UDP,當一個數據報到達目的埠時,該埠沒在使用,它將產生一個ICMP埠不可達的資訊。而TCP則使用復位。
2), TCP想取消一個已有連線
3), TCP接收了一個根本不存在的連線上的分節。
1. connect
函式返回錯誤ECONNREFUSED:
如果對客戶的SYN的響應是RST,則表明該伺服器主機在我們指定的埠上沒有程序在等待與之連線(例如伺服器程序也許沒有啟動),這稱為硬錯(
TCP為監聽套介面維護兩個佇列。兩個佇列之和不超過listen函式第二個引數backlog。
當一個客戶SYN到達時,若兩個佇列都是滿的,TCP就忽略此分節,且不傳送RST.這個因為:這種情況是暫時的,客戶TCP將重發SYN,期望不久就能在佇列中找到空閒條目。要是TCP伺服器傳送了一個RST,客戶connect函式將立即返回一個錯誤,強制應用程序處理這種情況,而不是讓TCP正常的重傳機制來處理。這樣客戶區別不了這兩種情況:作為SYN的響應,意為“此埠上沒有伺服器”的RST還是意為“有伺服器在此埠上但其佇列滿”的
有以下兩種處理方法:忽略新的SYN,或為此SYN響應一個RST。
2.往一個對端已經關閉的套接字上寫入資料會收到一個RST訊號。
如果此時不判斷read , write函式的返回值,就不知道伺服器是否響應了RST, 此時客戶端如果向接收了RST的套介面進行寫操作時,核心給該程序發一個SIGPIPE訊號。此訊號的預設行為就是終止程序,所以,程序必須捕獲它以免被終止。
3. 伺服器主機崩潰後重啟
如果伺服器主機與客戶端建立連線後崩潰,如果此時,客戶端向伺服器傳送資料,而伺服器已經崩潰不能響應客戶端ACK,客戶TCP將持續重傳資料分節,試圖從伺服器上接收一個ACK,如果伺服器一直崩潰客戶端會發現伺服器已經崩潰或目的地不可達,但可能需要比較長的時間;
相關推薦
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