<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:如何在不殺掉進(jìn)程前提,關(guān)閉一個 TCP 連接?

          共 1612字,需瀏覽 4分鐘

           ·

          2022-01-14 21:35

          大家好,我是小林。

          之前有位讀者在面試中,被問到這么一個問題。

          如何在不殺掉進(jìn)程前提,關(guān)閉一個 TCP 連接?

          這個我之前的文章也提及過「處于 establish 狀態(tài)的連接,收到 SYN 報文會發(fā)生什么?

          我這里再把關(guān)鍵的點,講一下。

          正文

          大家在關(guān)閉 TCP 連接第一反應(yīng)都是「殺掉進(jìn)程」。

          是的,這個是最粗暴的方式,殺掉客戶端進(jìn)程和服務(wù)端進(jìn)程影響的范圍會有所不同:

          • 在客戶端殺掉進(jìn)程的話,就會發(fā)送 FIN 報文,來斷開這個客戶端進(jìn)程與服務(wù)端建立的所有 TCP 連接,這種方式影響范圍只有這個客戶端進(jìn)程所建立的連接,而其他客戶端或進(jìn)程不會受影響。

          • 而在服務(wù)端殺掉進(jìn)程影響就大了,此時所有的 TCP 連接都會被關(guān)閉,服務(wù)端無法繼續(xù)提供訪問服務(wù)。

          所以,關(guān)閉進(jìn)程的方式并不可取,最好的方式要精細(xì)到關(guān)閉某一條 TCP 連接。

          有的小伙伴可能會說,偽造一個四元組相同的 RST 報文不就行了?

          這個思路很好,但是不要忘了還有個序列號的問題,你偽造的 RST 報文的序列號一定能被對方接受嗎?

          如果 RST 報文的序列號不能落在對方的滑動窗口內(nèi),這個 RST 報文會被對方丟棄的,就達(dá)不到關(guān)閉的連接的效果。

          所以,要偽造一個能關(guān)閉 TCP 連接的 RST 報文,必須同時滿足「四元組相同」和「序列號正好落在對方的滑動窗口內(nèi)」這兩個條件

          直接偽造符合預(yù)期的序列號是比較困難,因為如果一個正在傳輸數(shù)據(jù)的 TCP 連接,滑動窗口時刻都在變化,因此很難剛好偽造一個剛好落在對方滑動窗口內(nèi)的序列號的 RST 報文。

          辦法還是有的,我們可以偽造一個四元組相同的 SYN 報文,來拿到“合法”的序列號!

          因為如果處于 establish 狀態(tài)的服務(wù)端,收到四元組相同的 SYN 報文后,會回復(fù)一個 Challenge ACK,這個 ACK 報文里的「確認(rèn)號」,正好是服務(wù)端下一次想要接收的序列號,說白了,就是可以通過這一步拿到服務(wù)端下一次預(yù)期接收的序列號。

          然后用這個確認(rèn)號作為 RST 報文的序列號,發(fā)送給服務(wù)端,此時服務(wù)端會認(rèn)為這個 RST 報文里的序列號是合法的,于是就會釋放連接!

          在 Linux 上有個叫?killcx?的工具,就是基于上面這樣的方式實現(xiàn)的,它會主動發(fā)送 SYN 包獲取 SEQ/ACK 號,然后利用 SEQ/ACK 號偽造兩個 RST 報文分別發(fā)給客戶端和服務(wù)端,這樣雙方的 TCP 連接都會被釋放,這種方式活躍和非活躍的 TCP 連接都可以殺掉。

          使用方式也很簡單,只需指明客戶端的 IP 和端口號。

          ./killcx?<IP地址>:<端口號>

          killcx 工具的工作原理,如下圖。

          它偽造客戶端發(fā)送 SYN 報文,服務(wù)端收到后就會回復(fù)一個攜帶了正確「序列號和確認(rèn)號」的 ACK 報文(Challenge ACK),然后就可以利用這個 ACK 報文里面的信息,偽造兩個 RST 報文

          • 用 Challenge ACK 里的確認(rèn)號偽造 RST 報文發(fā)送給服務(wù)端,服務(wù)端收到 RST 報文后就會釋放連接。

          • 用 Challenge ACK 里的序列號偽造 RST 報文發(fā)送給客戶端,客戶端收到 RST 也會釋放連接。

          正是通過這樣的方式,成功將一個 TCP 連接關(guān)閉了!

          這里給大家貼一個使用 killcx 工具關(guān)閉連接的抓包圖,大家多看看序列號和確認(rèn)號的變化。

          所以,以后抓包中,如果莫名奇妙出現(xiàn)一個 SYN 包,有可能對方接下來想要對你發(fā)起的 RST 攻擊,直接將你的 TCP 連接斷開!

          怎么樣,很巧妙吧!

          圖解系列文章:
          小林的2021年終總結(jié)
          圖解文章匯總
          計算機基礎(chǔ)學(xué)習(xí)路線
          小林的圖解系統(tǒng),大曝光!
          不鴿了,小林的「圖解網(wǎng)絡(luò) 3.0 」發(fā)布!
          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一本大道HEYZO乱码专区 一本大道东京热无码中文字幕 | 99re在线免费视频 | 99re免费视频在线观看 | 青青草青娱乐 | 俺也去色网络 |