0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TCP連接建立中的異常

麥辣雞腿堡 ? 來源:盼盼編程 ? 作者:盼盼編程 ? 2023-10-08 17:01 ? 次閱讀

建連接時SYN超時問題

如果 server 端因為某種情況沒有收到 client 回來的 ACK,那么,這個連接處還處于一個未建立的狀態(tài)。于是,server端如果在一定時間內(nèi)沒有收到,則 server 端的 TCP 會重發(fā) SYN_ACK。

Linux下,默認重試次數(shù)為5次,重試的間隔時間從1s開始每次都翻倍,5次的重試時間間隔為1s, 2s, 4s, 8s, 16s,總共31s,第5次發(fā)出后還要等32s都知道第5次也超時了。如果第五次重傳之后,還未收到客戶端的 ACK,server 端的 TCP 才會把斷開這個連接。

關(guān)于SYN Flood攻擊

攻擊者短時間偽造不同 IP 地址的 SYN 報文,服務(wù)端每接收到一個 SYN 報文,就進入SYN_RCVD 狀態(tài),但服務(wù)端發(fā)送出去的 ACK + SYN 報文,無法得到未知 IP 主機的 ACK 應(yīng)答,久而久之就會占滿服務(wù)端的 SYN 接收隊列(未連接隊列),使得服務(wù)器不能為正常用戶服務(wù)。

避免方式

設(shè)置 tcp_syncookies = 1。當 SYN 隊列滿了后,TCP 會通過源地址端口、目標地址端口和時間戳打造出一個特別的 Sequence Number 發(fā)回去(又叫cookie)。

如果是攻擊者則不會有響應(yīng),如果是正常連接,則會把這個 SYN Cookie 發(fā)回來,然后服務(wù)端可以通過 cookie 建連接。

設(shè)置 netdev_max_backlog 的值,確定鏈接隊列的大小。當網(wǎng)卡接收數(shù)據(jù)包的速度大于內(nèi)核處理的速度時,會有一個隊列保存這些數(shù)據(jù)包。

通過設(shè)置 netdev_max_backlog 的值,確定 SYN_RCVD 狀態(tài)連接的最大個數(shù)。

通過設(shè)置 tcp_abort_on_overflow 的值。當超出處理能時,對新的 SYN 直接回報 RST,丟棄連接。

斷開連接中的異常

TIME_WAIT數(shù)量太多

從上面的描述可以知道,TIME_WAIT 是個很重要的狀態(tài),但是如果在大并發(fā)的短鏈接下,TIME_WAIT 就會太多。TIME_WAIT過多會占用大量的內(nèi)存資源和端口資源。

優(yōu)化法一:tcp_tw_reuse

設(shè)置tcp_tw_reuse = 1,則可以復(fù)用處于 TIME_WAIT 的 socket 為新的連接所用。

有一點需要注意的是,tcp_tw_reuse 功能只能用客戶端(連接發(fā)起方),因為開啟了該功能,在調(diào)用 connect() 函數(shù)時,內(nèi)核會隨機找一個 time_wait 狀態(tài)超過 1 秒的連接給新的連接復(fù)用。

使用 tcp_timestamps = 1 選項,還有一個前提,需要打開對 TCP 時間戳的支持,即這個時間戳的字段是在 TCP 頭部的「選項」里,用于記錄 TCP 發(fā)送方的當前時間戳和從對端接收到的最新時間戳。

由于引入了時間戳,我們在前面提到的 2MSL 問題就不復(fù)存在了,因為重復(fù)的數(shù)據(jù)包會因為時間戳過期被自然丟棄。

優(yōu)化法二:tcp_max_tw_buckets

這個值默認為 18000,當系統(tǒng)中處于 TIME_WAIT 的連接一旦超過這個值時,系統(tǒng)就會將后面的 TIME_WAIT 連接狀態(tài)重置。

這個方法過于暴力,而且治標不治本,帶來的問題遠比解決的問題多,不推薦使用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7443

    瀏覽量

    88447
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1337

    瀏覽量

    78865
  • 連接
    +關(guān)注

    關(guān)注

    2

    文章

    95

    瀏覽量

    20917
  • 服務(wù)端
    +關(guān)注

    關(guān)注

    0

    文章

    66

    瀏覽量

    6959
收藏 人收藏

    評論

    相關(guān)推薦

    TCP和UDP建立連接的差異和可靠性的差異

    TCP 建立連接需要經(jīng)過三次握手,同時 TCP 斷開連接需要經(jīng)過四次揮手,這也表示 TCP 是一
    發(fā)表于 09-02 16:10 ?730次閱讀

    如何標識一個TCP連接

    tcp應(yīng)用,server事先在某個固定端口監(jiān)聽,client主動發(fā)起連接,經(jīng)過三路握手后建立tcp
    的頭像 發(fā)表于 10-10 10:33 ?2820次閱讀

    STM32H7+FREERTOS+LWIP建立TCP連接,連接不穩(wěn)定怎么解決?

    利用ST的Demo建立TCP連接,但是當建立TCP連接超過4個時,
    發(fā)表于 04-25 06:05

    14-TCP 協(xié)議(連接異常與RST)

    1. RST 段當 TCP連接出現(xiàn)嚴重的錯誤時,必須釋放連接。通過將 TCP 首部的 RST 標志位置 1,就可以通知對端發(fā)生錯誤,以終止
    發(fā)表于 07-24 10:01

    為什么建立TCP連接有時成功有時失敗?

    時開發(fā)板自帶的里程改的,TCP這部分基本沒有改,只是增加了自己的應(yīng)用進去。首次使用以太網(wǎng)接口,還不太清楚建立連接的機理,有了解這塊的朋友嗎,請問建立
    發(fā)表于 09-19 04:36

    tcp連接異常怎么回事

    使用ucosiiilwip ,enc28j60。 在做tcp client測試時,每2s發(fā)送一次數(shù)據(jù),10分鐘左右就出現(xiàn)異常。通過抓包工具,發(fā)現(xiàn)是tcp連接時 發(fā)送了 RTS ACK
    發(fā)表于 05-20 09:57

    CH9121配置成TCP Client/Server,無法和電腦建立TCP連接怎么解決?

    9121配置成TCP Client/Server,無法和電腦建立TCP連接
    發(fā)表于 10-12 08:18

    TCP連接建立與終止

    學(xué)習(xí)TCP-IP的很好的書。TCP-IP詳解卷1。
    發(fā)表于 05-10 15:44 ?0次下載

    大神告訴你TCP建立連接為什么是三次握手

    所謂三次握手(Three-Way Handshake)即建立TCP連接,是指建立一個TCP連接
    的頭像 發(fā)表于 04-16 11:43 ?1w次閱讀
    大神告訴你<b class='flag-5'>TCP</b><b class='flag-5'>建立</b><b class='flag-5'>連接</b>為什么是三次握手

    TCP通信通過網(wǎng)絡(luò)調(diào)試助手與S7-1200建立TCP連接

    S7-1200 V4.5 版本開始支持網(wǎng)絡(luò)視圖組態(tài)開放式用戶通信連接,不需要在程序調(diào)用 TCON 等建立連接指令,只需要調(diào)用發(fā)送接收指令即可實現(xiàn)數(shù)據(jù)的收發(fā)。下面以
    的頭像 發(fā)表于 07-06 15:39 ?1.1w次閱讀

    要是沒有一端進行監(jiān)聽是否可以建立TCP連接呢?

    TCP 網(wǎng)絡(luò)通信過程,我們都是先有 server 端調(diào)用 listen 監(jiān)聽某個端口號,然后 client 向 server 發(fā)起連接請求,最終建立
    的頭像 發(fā)表于 11-16 17:42 ?2106次閱讀
    要是沒有一端進行監(jiān)聽是否可以<b class='flag-5'>建立</b>起<b class='flag-5'>TCP</b><b class='flag-5'>連接</b>呢?

    什么是Socket連接?Socket與TCP連接的關(guān)系

    主機 A 的應(yīng)用程序必須通過 Socket 建立連接才能與主機B的應(yīng)用程序通信,而建立 Socket 連接需要底層 TCP/IP 協(xié)議來
    發(fā)表于 03-31 15:10 ?997次閱讀

    TCP通信過程的長連接與短連接是什么?

    當面試官問你:TCP 通信過程的長連接與短連接是什么?
    的頭像 發(fā)表于 08-08 11:30 ?1034次閱讀
    <b class='flag-5'>TCP</b>通信過程<b class='flag-5'>中</b>的長<b class='flag-5'>連接</b>與短<b class='flag-5'>連接</b>是什么?

    TCP連接建立與中止

    常重要的 。 TCP 連接建立可以簡單地稱為三次握手,而連接的中止則可以稱為四次揮手。 建立連接
    的頭像 發(fā)表于 10-08 16:52 ?669次閱讀

    TCP的長連接和短連接

    TCP在真正開始進行數(shù)據(jù)傳輸之前,Server 和 Client 之間必須建立一個連接。當數(shù)據(jù)傳輸完成后,雙方不再需要這個連接時,就可以釋放這個連接
    的頭像 發(fā)表于 11-13 10:46 ?913次閱讀