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

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

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

TCP連接建立中的異常

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

建連接時(shí)SYN超時(shí)問題

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

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

關(guān)于SYN Flood攻擊

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

避免方式

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

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

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

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

通過設(shè)置 tcp_abort_on_overflow 的值。當(dāng)超出處理能時(shí),對(duì)新的 SYN 直接回報(bào) RST,丟棄連接。

斷開連接中的異常

TIME_WAIT數(shù)量太多

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

優(yōu)化法一:tcp_tw_reuse

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

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

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

由于引入了時(shí)間戳,我們在前面提到的 2MSL 問題就不復(fù)存在了,因?yàn)橹貜?fù)的數(shù)據(jù)包會(huì)因?yàn)闀r(shí)間戳過期被自然丟棄。

優(yōu)化法二:tcp_max_tw_buckets

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

這個(gè)方法過于暴力,而且治標(biāo)不治本,帶來的問題遠(yuǎn)比解決的問題多,不推薦使用。

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

    關(guān)注

    14

    文章

    7568

    瀏覽量

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

    關(guān)注

    8

    文章

    1353

    瀏覽量

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

    關(guān)注

    2

    文章

    95

    瀏覽量

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

    關(guān)注

    0

    文章

    66

    瀏覽量

    7010
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    如何標(biāo)識(shí)一個(gè)TCP連接

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

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

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

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

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

    為什么建立TCP連接有時(shí)成功有時(shí)失敗?

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

    tcp連接異常怎么回事

    使用ucosiiilwip ,enc28j60。 在做tcp client測試時(shí),每2s發(fā)送一次數(shù)據(jù),10分鐘左右就出現(xiàn)異常。通過抓包工具,發(fā)現(xiàn)是tcp連接時(shí) 發(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連接,是指建立一個(gè)TCP連接時(shí)
    的頭像 發(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ā)送接收指令即可實(shí)現(xiàn)數(shù)據(jù)的收發(fā)。下面以
    的頭像 發(fā)表于 07-06 15:39 ?1.2w次閱讀

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

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

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

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

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

    當(dāng)面試官問你:TCP 通信過程的長連接與短連接是什么?
    的頭像 發(fā)表于 08-08 11:30 ?1219次閱讀
    <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 ?739次閱讀

    TCP的長連接和短連接

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