Fw: [技術] tcp over tcp: 關掉tcp retransmission?

看板Linux作者 (我抓得到什麼呢?)時間11年前 (2012/11/23 17:19), 編輯推噓0(0033)
留言33則, 2人參與, 最新討論串1/1
※ [本文轉錄自 Network 看板 #1Ghpy3VD ] 剛剛在網路上看文章: http://sites.inka.de/~W1011/devel/tcp-tcp.html 他提到了這個在tcp over tcp時(ex.ssh port forward/sslvpn/...)會碰到的狀況 剛好和我在無線網路tunneling跑server時會碰到的情形有點像 所有的東西都比沒有tunnel時慢很多 (無線網路是學校的,我不能去設定port forwarding) 所以我在想:有沒有可能吧上面那一層(被tunnel)的retransmission關掉 (OS: linux) 可是linux下只有一個共用的tcp stack設定( /proc/sys/net/ip4/* ) 沒有辦法在不同的interface有不同的參數 還有什麼方法嗎? 像是在iptables(netlimiter)中砍掉重複的封包? 如果可以的話,要怎麼做呢? 先謝謝大家看完這麼怪的問題Orz ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: kdjf (140.112.245.32), 時間: 11/23/2012 17:19:07 ※ 編輯: kdjf 來自: 140.112.245.32 (11/23 17:20)

11/23 17:58, , 1F
沒掉封包都很好/一開始掉就崩潰了
11/23 17:58, 1F

11/23 18:01, , 2F
不過看文章是用udp來閃,有沒有可能退化用fix timeout來解
11/23 18:01, 2F

11/23 18:02, , 3F
決?(有沒有這設定項我不清楚)
11/23 18:02, 3F

11/23 18:02, , 4F
fixed timeout
11/23 18:02, 4F

11/23 18:27, , 5F
可是整個系統一起fixed timeout,可能還沒掉封包我就先受不了
11/23 18:27, 5F

11/23 18:28, , 6F
架這個tunnel時,我也會用同一個wlan上網/做別的事
11/23 18:28, 6F

11/23 23:33, , 7F
是說改天先試看fixed timeout好了
11/23 23:33, 7F

11/23 23:33, , 8F
再去看看iptables rule有沒有可能把完全一樣的封包擋掉
11/23 23:33, 8F

11/23 23:37, , 9F
比對封包超耗資源(CPU/RAM),直覺認為不太可能有此項功能
11/23 23:37, 9F

11/24 01:26, , 10F
只是要比對seq/ack/checksum就好了吧 conntrack原本就在做了
11/24 01:26, 10F

11/24 08:17, , 11F
問題是TCP重傳是藉由IP,你不能保證會是同樣的封包,有可能
11/24 08:17, 11F

11/24 08:18, , 12F
是seg1(先前送的)和要新傳送的seg2,一起合併用單一IP送出
11/24 08:18, 12F

11/24 08:29, , 13F
那樣只看一樣的seq/ack呢?是說看了一下conntrack(8)可能只用
11/24 08:29, 13F

11/24 08:30, , 14F
flag去猜status, 而不是分析完整的tcp header
11/24 08:30, 14F

11/24 09:02, , 15F
突然想到你把完全一樣的封包擋掉,假設萬一真的需要重傳,不
11/24 09:02, 15F

11/24 09:03, , 16F
是永遠就卡住了嗎?理論上你沒實作一個完整的tcp(或至少重
11/24 09:03, 16F

11/24 09:04, , 17F
要的部分),很難在ip層只靠簡單的判斷就判斷哪個封包不要
11/24 09:04, 17F

11/24 12:04, , 18F
因為包了兩層TCP,只要有一層會重傳就夠了 不過我原本沒有想
11/24 12:04, 18F

11/24 12:11, , 19F
到封包可能被合並的問題
11/24 12:11, 19F

11/24 12:35, , 20F
iptables不也是全系統共用的嗎?還是你上層有VM?如果你讓
11/24 12:35, 20F

11/24 12:35, , 21F
iptables丟棄重覆的IP封包,豈不連底下那層都不會重傳了?
11/24 12:35, 21F

11/24 12:36, , 22F
我換一個方式重述,iptables和在其之上的tcp模組,在對方送
11/24 12:36, 22F

11/24 12:36, , 23F
來ack之前,兩者都不會知道重傳到底需不需要,只能timeout後
11/24 12:36, 23F

11/24 12:37, , 24F
重傳.所以所謂的'重覆',在收到對方ack之前,都不可能判定一
11/24 12:37, 24F

11/24 12:38, , 25F
不需要,所以光靠比對是否重覆封包不足以判定是否該丟棄
11/24 12:38, 25F

11/24 12:38, , 26F
^定不需要
11/24 12:38, 26F

11/24 15:34, , 27F
上下兩層可以跑不同的interface/user,下面那層跑正常的tcp
11/24 15:34, 27F

11/24 15:35, , 28F
iptables rule只會丟掉上層的retrans. (-i ppp/tap/tun)
11/24 15:35, 28F

11/24 15:36, , 29F
可是我現在在iptables中找不到可用的extension...
11/24 15:36, 29F

11/24 15:41, , 30F
看來離想要的東西有點遠了
11/24 15:41, 30F
u32好像有能力抓出packet.seq, 可是不能存變數 我想要像這樣: (if (packet.seq > latest_seq -10) DROP) ^^^^^^^^^^ 不知到要存在哪裡 ※ 編輯: kdjf 來自: 140.112.245.32 (11/24 16:36) 突然想到:retransmission不會發生的太快,可以用LAG target把seq抓到userspace 用script去改寫新的rule~ 改天要用到tunnel時來試試看好了XDD 如果有成果的話,也許是第一次變成developer? (逃 ※ 編輯: kdjf 來自: 140.112.245.32 (11/24 16:43) ※ 編輯: kdjf 來自: 140.112.245.32 (11/24 16:46)

11/24 20:10, , 31F
我剛發現,有人為了tcp over tcp的問題弄ssh over udp,不過
11/24 20:10, 31F

11/24 20:11, , 32F
略略搜尋下沒有看到有什麼專案
11/24 20:11, 32F

11/24 21:37, , 33F
over udp中間搞個不友善的NAT就掛點了啊QQ
11/24 21:37, 33F
文章代碼(AID): #1Ghp-Dkn (Linux)