成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

模擬百萬級TCP并發

開發 開發工具
TCP并發是指一個服務器同時“hold住”的連接數量,確切的說就是指服務器端看到的“ESTABLISHED”狀態的TCP連接數量。

什么是TCP并發

TCP并發是指一個服務器同時“hold住”的連接數量,確切的說就是指服務器端看到的“ESTABLISHED”狀態的TCP連接數量。通過netstat -n|grep ^tcp|awk '{print $NF}'|sort -nr|uniq -c可以查看當前服務器TCP狀態統計報告,下圖是我的執行結果(我正在通過SSH連接這臺機器所以有一個“ESTABLISHED”狀態的TCP連接)

測試TCP并發就是指讓這個值達到的頂峰,要實現這個必須滿足兩點:

  • 短時間內構造百萬級連接
  • 服務器端同時hold住百萬級連接

需要注意的是上面的“測試”不包括“連接之后的交互”僅僅是指“hold住連接”。

傳統工具為什么無法滿足

很多服務器都是TCP結構的比如Mysql、Tomcat、Nginx,這些工具也有相應的壓力測試工具,比較著名的包括:Jmeter、Tsung。這些工具的實現基本上是一致的

  • 同時啟動多個任務
  • 每個任務打開一個socket連接到服務器

這種測試方法受限于三個資源

  • 可以啟動的任務數量(線程數或者進程數)
  • 可以打開的socket數量(文件描述符)
  • 受限于本機可用端口最大值——65535

第一個限制我們可以通過“協程”之類的技術手段解決;第二個限制在內存滿足的情況下可以通過調整系統參數解決(參考我的《你真知道“Too many open files”?》);第三個限制幾乎是致命的——傳統上只能通過多臺服務器一塊協同。

即便解決了上述三個問題也很難在“短時間”內造成巨大的壓力,大量的socket會吃光內存,多臺服務器協同必然是一個分布式問題(想想就掉頭發)。

新的思路

TCP連接給人的感覺是一個“通道”,這其實這是一個“錯覺”。所有的網絡基本上都是基于“存儲轉發”的經過。三次握手之后的TCP連接到達“ESTABLISHED”狀態,服務器會為它保留資源——即使客戶端已經不再理睬這個連接。那么我們是不是可以不經過TCP/IP協議棧直接通過raw socket構造三次握手呢?只要我們大批量的構造三次握手就可以對服務器構成巨大的壓力了。

我們重點關注Client->Server的兩個箭頭。第一個數據包是SYN數據包,seq=隨機數;第二個數據包是ACK數據包,ACK=收到數據包的seq+1,seq=收到數據包的ack。其實TCP數據包之間是沒有直接關系的,我們收到一個數據包就可以直接算出回復數據包的ack、seq

上面的思路基本上可以證明我們的方法在理論上是可行的,在實踐上我們還需要克服一些問題

  • 怎么獲取Server到Client的SYN+ACK(三次握手中的第二個箭頭);畢竟我們不是直接使用Socket打開TCP連接(這樣做就不需要自己構造TCP三次握手了)
  • Server在收到Client請求后會嘗試對Client進行ARP地址,如果發現無法解析就認為是一個非法的數據包直接發送RST數據包關閉TCP連接

第一個問題我們通過libpcap“旁路”kernel,直接獲取原始數據包。下圖是libpcap的原理

libpcap底層使用的是BPF(Berkeley Packet Filter)驅動,這是kernel中專門用來“調試”的驅動程序最早是為Unix開發現在已經成為各種操作系統的標配(只要支持tcpdump那么底層一定是有實現這個驅動模型的)。它獨立于kernel中的其他協議棧直接和讀取數據鏈路層的數據包。

通過libpcap我們可以獲取所有的數據包(即便操作系統不處理)然后構造自己的數據包通過raw socket直接把寫入到數據鏈路層。整個“收包”->“處理”->“回包”完全不需要kernel參與。

第二個問題其實在前面的文章中我已經給出了答案——構造并且回復ARP數據包(《深入理解ARP攻擊 》)。簡單來說就是通過libpcap獲取arp request,通過raw socket回復arp response。

動手

我努力去掉所有不相關的東西只保留了最精簡的部分,不到300行的代碼。代碼分為兩大部分“發起TCP SYN數據包”和“回復SYN+ACK數據包、ARP request數據包”。具體內容可以看這里

這次我特意放上了cmake文件,執行以下cmake就可以編譯了。

https://github.com/fireflyc/million-tcp-client

模擬多個IP地址

受限于端口上限,一臺服務器只能模擬65535個TCP連接。但是我提供的演示程序是可以指定IP地址的,這個IP地址只需要和目標IP在同一個網絡內就可以了。比如我的測試環境:

測試機器有自己的IP地址172.16.46.128,但是這個IP地址并沒有用途,只是為了方便我SSH連接。服務器的IP地址是172.16.46.133,我啟動三個tcp-client分別綁定200、201、202。

每個TCP-Client進程都可以模擬65535個TCP連接。(這個其實還有改進的余地)

【本文是51CTO專欄作者邢森的原創文章,轉載請聯系作者本人獲取授權】

 

責任編輯:武曉燕 來源: 寫程序的康德
相關推薦

2009-03-12 09:44:05

高并發開源數據庫MySQL

2011-11-03 13:59:05

2025-05-26 02:11:00

2019-12-31 10:33:57

Netty高性能內存

2011-08-23 17:12:22

MySQL支撐百萬級流

2025-02-14 03:00:00

2014-02-10 16:27:09

百萬級IOPSOceanStor 1

2020-01-13 10:20:30

架構聊天架構百萬并發量

2025-05-30 03:40:00

2021-02-18 22:18:50

TCP 服務器源碼

2019-02-12 09:34:00

微博短視頻架構

2025-02-28 10:10:48

2024-12-04 13:52:30

2024-12-26 09:15:28

2021-05-24 10:55:05

Netty單機并發

2022-09-09 08:41:43

Netty服務端驅動

2025-05-06 07:19:52

2025-02-10 08:20:09

2025-03-31 01:22:00

2012-02-01 16:32:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品美女久久久久aⅴ国产馆 | 国产精品久久久久久久7电影 | 成人免费三级电影 | 欧美xxxx做受欧美 | 午夜久久久久久久久久一区二区 | 久热久热| 台湾佬伊人 | 男女激情网 | 久久视频免费观看 | av中文字幕在线 | 亚洲国产精品美女 | 久久久看 | 欧美激情国产日韩精品一区18 | 国产欧美精品在线观看 | 日韩欧美一区二区三区在线播放 | 日韩欧美精品在线播放 | caoporn地址| www.一区二区三区.com | 国产午夜精品一区二区三区嫩草 | 鸳鸯谱在线观看高清 | 免费在线观看一级毛片 | 人人干免费 | 欧美在线观看一区 | 亚洲久久 | 久久久久久久久久久91 | 欧美日韩不卡 | 天天激情综合 | 亚洲综合在线播放 | 97国产一区二区精品久久呦 | 国产精品久久久久久影视 | 国产综合在线视频 | 精品免费国产视频 | 欧美视频一区二区三区 | 亚洲在线日韩 | 国产成人免费视频网站高清观看视频 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 欧美日韩视频在线播放 | 亚洲国产精品99久久久久久久久 | 国产乱人伦| 日本久草 | 欧美激情免费在线 |