1. 程式人生 > >5種TCP連線中出現RST的情況。連線復位Reset a connection.

5種TCP連線中出現RST的情況。連線復位Reset a connection.

應該沒有人會質疑,現在是一個網路時代了。應該不少程式設計師在程式設計中需要考慮多機、區域網、廣域網的各種問題。所以網路知識也是避免不了學習的。而且筆者一直覺得TCP/IP網路知識在一個程式設計師知識體系中必需佔有一席之地的。

在TCP協議中RST表示復位,用來異常的關閉連線,在TCP的設計中它是不可或缺的。傳送RST包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄快取區的包傳送RST包。而接收端收到RST包後,也不必傳送ACK包來確認。

其實在網路程式設計過程中,各種RST錯誤其實是比較難排查和找到原因的。下面我列出幾種會出現RST的情況。

1 埠未開啟

伺服器程式埠未開啟而客戶端來連線。這種情況是最為常見和好理解的一種了。去telnet一個未開啟的TCP的埠可能會出現這種錯誤。這個和作業系統的實現有關。在某些情況下,作業系統也會完全不理會這些發到未開啟埠請求。

比如在下面這種情況下,主機241向主機114傳送一個SYN請求,表示想要連線主機114的40000埠,但是主機114上根本沒有開啟40000這個埠,於是就向主機241傳送了一個RST。這種情況很常見。特別是伺服器程式core dump之後重啟之前連續出現RST的情況會經常發生。

當然在某些作業系統的主機上,未必是這樣的表現。比如向一臺WINDOWS7的主機發送一個連線不存在的埠的請求,這臺主機就不會迴應。

2 請求超時

曾經遇到過這樣一個情況:一個客戶端連線伺服器,connect返回-1並且error=EINPROGRESS。 直接telnet發現網路連線沒有問題。ping沒有出現丟包。用抓包工具檢視,客戶端是在收到伺服器發出的SYN之後就莫名其妙的傳送了RST。

比如像下面這樣:

有89、27兩臺主機。主機89向主機27傳送了一個SYN,表示希望連線8888埠,主機27迴應了主機89一個SYN表示可以連線。但是主機27卻很不友好,莫名其妙的傳送了一個RST表示我不想連線你了。

後來經過排查發現,在主機89上的程式在建立了socket之後,用setsockopt的SO_RCVTIMEO選項設定了recv的超時時間為100ms。而我們看上面的抓包結果表示,從主機89發出SYN到接收SYN的時間多達110ms。(從15:01:27.799961到15:01:27.961886, 小數點之後的單位是微秒)。因此主機89上的程式認為接收超時,所以傳送了RST拒絕進一步傳送資料。

3 提前關閉

關於TCP,我想我們在教科書裡都讀到過一句話,'TCP是一種可靠的連線'。 而這可靠有這樣一種含義,那就是作業系統接收到的來自TCP連線中的每一個位元組,我都會讓應用程式接收到。如果應用程式不接收怎麼辦?你猜對了,RST。

看兩段程式:

01 //server.c
02
03 int main(int argc, char** argv) 
04
05 int listen_fd, real_fd; 
06 struct sockaddr_in listen_addr, client_addr; 
07 socklen_t len = sizeof(struct sockaddr_in); 
08 listen_fd = socket(AF_INET, SOCK_STREAM, 0); 
09 if(listen_fd == -1) 
10
11 perror("socket failed   "); 

相關推薦

5TCP連線出現RST情況連線復位Reset a connection.

應該沒有人會質疑,現在是一個網路時代了。應該不少程式設計師在程式設計中需要考慮多機、區域網、廣域網的各種問題。所以網路知識也是避免不了學習的。而且筆者一直覺得TCP/IP網路知識在一個程式設計師知識體系中必需佔有一席之地的。 在TCP協議中RST表示復位,用來異常的關閉連線,在TCP的設計中它是

IIS7錯誤:不能在此路徑使用此配置節如果在父級別上鎖定了該節,便會出現這種情況鎖定是默認設置的(overrideModeDefault="Deny")......

命令 hand .exe ... 註意 net 解決 節點 windows IIS 7訪問的時候出現以下異常: 不能在此路徑中使用此配置節。如果在父級別上鎖定了該節,便會出現這種情況。鎖定是默認設置的(overrideModeDefault="Deny")...... 解決

整合 solr7.5.0到tomcat7,出現兩錯誤403 – Forbidden和java.lang.NoSuchMethodError

環境說明     solr-7.5.0     apache-tomcat-7.0.91.zip     jdk1.8.0_171 1.安裝solr     1.1  建立solrHome資

7-5 求一批整數出現最多的個位數字

輸入格式:輸入在第1行中給出正整數NNN(≤1000\le 1000≤1000),在第二行中給出NNN個不超過整型範圍的非負整數,數字間以空格分隔。 輸出格式:在一行中按格式“M: n1 n2 …”輸出,其中M是最大次數,n1、n2、……為出現次數最多的個位數字,按從小到大的順序排列。數字間

C/C++字串出現‘\’的情況

    A common typing error is to place the hands on the keyboard one row to the right of the correct position. So "Q" is typed as "W" and "J" is typed as "K

IIS7錯誤:不能在此路徑使用此配置節如果在父級別上鎖定了該節,便會出現這種情況鎖定是預設設定的

IIS 7訪問的時候出現以下異常: 不能在此路徑中使用此配置節。如果在父級別上鎖定了該節,便會出現這種情況。鎖定是預設設定的(overrideModeDefault="Deny")...... 解決方案: 因為 IIS 7 採用了更安全的 web.config 管理機制

劍指offer之統計一個數字在排序陣列出現的次數

1.題目描述 統計一個數字在排序陣列中出現的次數。 2.問題分析 方法一: 因為是排序的陣列,首先在陣列中找到第一個值為k的位置begin,之後從begin找下一個不等於值k的位置end,則,次數為end - begin。 例如:1 2 2 3 3 3 5,k = 3

windows環境本地連線 mysql 出現 1130 錯誤

由於專案需要,要將資料庫密碼改成 admin ,但是改完之後再連線就出現了 1130 錯誤,判斷可能是沒有許可權登入,要修改許可權。 一:修改配置檔案 在 mysql 的安裝路徑中找到 my.ini 配置檔案,在裡面找到「mysqld」,在其下面加入下面這一句,跳過密碼驗證。 skip-

mysql出現host ‘XXXXXX’ is blocked because of many connection errors

出現錯誤的原因: 同一ip在短時間內產生太多(超過mysql資料庫max_connection_errors的最大值)終端的資料庫連線而導致的阻塞; 解決方法 更改max_connection_errors的值,即提高允許的max_connection_errors的數量 修

統計一個數字在排序陣列出現的次數(牛客劍指offer)

題目描述: 統計一個數字在排序陣列中出現的次數 class Solution { public:     int GetNumberOfK(vector<int> data ,int k) {     } };  Solu

統計每個母音字母在字串出現的次數

CLICK HERE TO HAVE A TRY Time limit1000 ms Memory limit32768 KB 原題: 統計每個母音字母在字串中出現的次數。 Input 輸入資料首先包括一個整數n,表示測試例項的個數,然後是n行長度不超過

java連線MySQL出現版本錯誤及連線資料庫程式碼

今天eclipse連線mysql遇到不少問題。 我用的環境如下(錯誤的情況下):  eclipse 4.7; jdk1.7(Java project); mysql5.6; mysql-connector-java-8.0.12.jar(需要匯入); 部分連線語句(

matlab出現錯誤: Error using xlsread (line 247)Error: 伺服器出現意外情況

        此問題出現的原因是:         由於我的系統中裝了一個福昕閱讀器,該程式佔用了excel的com埠,所以當Matlab再去呼叫這個埠時就會出現異常​。具體解決方法:點選管理旁邊的

寫入一個方法,輸入一個檔名和一個字串,統計這個字串在這個檔案出現的次數

public class Test1 { /* * * 寫一個方法,輸入一個檔名和一個字串,統計這個字串在這個檔案中出現的次數。 * */ public static void main

Android開發出現Attempt to invoke virtual method...on a null object reference

摘要: 載入Android佈局檔案時出現錯誤: java.lang.NullPointerException: Attempt to invoke virtual method '........' on a null object reference 出錯原因可能是未能在

統計母音 --統計每個母音字母在字串出現的次數

a:1 e:1 i:1 o:1 u:1 a:2 e:1 i:3 o:0 u:1 我的程式碼:這道題最關鍵的就是格式問題,因為格式導致提交了N多次都沒AC #include<stdio.h> #include<string.h> int main() { char a[200];  

給定一個字串:要求輸入英文語句,輸出英文語句每個單詞在字串出現的次數

def geshu(src): n=0; str1 = src.split(); len1=len(str1); for s in str1: n = 0; for i in range(len1):

idea配置maven出現的問題

剛剛在配置maven時出現的問題。 顯示一個什麼...忘記截圖了。 後來解決的辦法是,換maven的版本。 因為我用的JDK是1.6的,而maven用了3.3.9的,所以出現了那個錯誤。 我換成maven3.3.2的版本後問題就解決了。

統計這個字串在這個檔案出現的次數

import java.io.BufferedReader; import java.io.FileReader; public final class MyUtil { // 工具類中的方法都是靜態方式訪問的因此將構造器私有不允許建立物件(絕對好習慣)

Java——在一個字串查詢一個子串,計算出來這個子串在字串出現的次數

引入包:import java.util.Scanner;main函式:public static void main(String[] args){Scanner s = new Scanner(Sy