學寫 HTTP Tunnel
2008-04-07 15:06
169 查看
我有位朋友, 佢做嘅公司 block 咗所有 IM 同 Web IM. 唯一可以用嘅就係 Gmail 入面嘅 Google Talk. 但係近幾日, Gmail 去倒, 但係 Google Talk 就 block 咗. 要同佢傾計, 唯有狂 send Gmail 啦...
我想學一下點寫 HTTP push, 所以好快手咁寫咗個 HTTP Tunnel 出黎, 仲可以係 IIS 同 UltiDev Cassini 上面行, 亦都學咗好多嘢, 我想係呢度 conclude 一下學咗啲咩. 係 conclude 之前想提返大家少少關於 tunneling 嘅嘢.
HTTP 係 half-duplex, 要 tunnel 一條 full-duplex TCP, 就要用兩條 HTTP connection
Client 個程式 listen 住 localhost:12345, 咁所有 traffic 開去呢個 port, 就會 encapsulate 落 HTTP packet 入面, 再 send 去 tunnel server
Server 接到 packet, 就會用 blocking 嗰條 HTTP push channel, 去 send 返俾 client
理論上, 雖然係開 local resources 嘅嘢, 但係 IIS 唔應該會有問題
咁以下就係學倒嘅嘢
有兩條 HTTP, 一條係 Client -> Server, 另一條係 Server -> Client
Client -> Server, 呢條只不過係普普通通嘅 Web Services 都得, 因為係 client 去 server, 就好似 HTTP model 咁, 亦都唔會 blocking
Server -> Client, 呢條就會 block 住, 直到有 data 或者 timeout
如果用 Web Services 寫第二條, 佢會 block 住之後所有嘅 request, 即係第一條係唔俾人 block connect, 唔知點解, 我亦唔可以開兩個 Worker Process (因為 socket 只會 bind 住其中一個)
要咁寫, 一定要用 .ASHX (Generic Handler), 唔一定要 IHttpAsyncHandler, 普通嘅 IHttpHandler 都得
如果 send 唔用 .ASHX, 就會有機會 block 住 receive, 所以兩個都應該寫 .ASHX
HttpWebRequest.Proxy 唔 set 嘅話, 係唔會行倒 ISA server 嘅 NTLM authentication
WinInet 開嘅 HTTP connection 係有限制, 去 HTTP 1.1 最多兩條, HTTP 1.0 最多四條
Local server 係無呢個 limit
Registry 有得 set, 不過唔係好 work
FireFox 有可能會開 8 條, 最少 2 條, 可以人手較, 但係唔方便, 亦都唔係 workaround, 因為我想用 MSN Messenger
寫個程式時要 limit 只係會開 2 條, 張 N 條嘅 connection encapsulate 入呢兩條入面
用 observer pattern 去管理 connection 嘅 closure
因為 WinSock 有兩種 closure: graceful 同 reset
又因為你有兩個 socket 可以收 closure
所以, 你有 4 種 closure 方法
用 observer pattern 最簡單, 不過你最好寫個 manager 去做管理, 唔可以只係一個 List<> 就攪掂
最終, 訓咗兩晚覺就攪掂咗個程式, 仲可以行 HTTPS. 用咗大概 42 小時, 但係實際落手做只係做咗 11 個鐘左右.
p.s. 有 PortReverser + HttpTunnel, 就可以夾埋做一個 traverse NAT/HTTP firewall 嘅 package
我想學一下點寫 HTTP push, 所以好快手咁寫咗個 HTTP Tunnel 出黎, 仲可以係 IIS 同 UltiDev Cassini 上面行, 亦都學咗好多嘢, 我想係呢度 conclude 一下學咗啲咩. 係 conclude 之前想提返大家少少關於 tunneling 嘅嘢.
HTTP 係 half-duplex, 要 tunnel 一條 full-duplex TCP, 就要用兩條 HTTP connection
Client 個程式 listen 住 localhost:12345, 咁所有 traffic 開去呢個 port, 就會 encapsulate 落 HTTP packet 入面, 再 send 去 tunnel server
Server 接到 packet, 就會用 blocking 嗰條 HTTP push channel, 去 send 返俾 client
理論上, 雖然係開 local resources 嘅嘢, 但係 IIS 唔應該會有問題
咁以下就係學倒嘅嘢
有兩條 HTTP, 一條係 Client -> Server, 另一條係 Server -> Client
Client -> Server, 呢條只不過係普普通通嘅 Web Services 都得, 因為係 client 去 server, 就好似 HTTP model 咁, 亦都唔會 blocking
Server -> Client, 呢條就會 block 住, 直到有 data 或者 timeout
如果用 Web Services 寫第二條, 佢會 block 住之後所有嘅 request, 即係第一條係唔俾人 block connect, 唔知點解, 我亦唔可以開兩個 Worker Process (因為 socket 只會 bind 住其中一個)
要咁寫, 一定要用 .ASHX (Generic Handler), 唔一定要 IHttpAsyncHandler, 普通嘅 IHttpHandler 都得
如果 send 唔用 .ASHX, 就會有機會 block 住 receive, 所以兩個都應該寫 .ASHX
HttpWebRequest.Proxy 唔 set 嘅話, 係唔會行倒 ISA server 嘅 NTLM authentication
WinInet 開嘅 HTTP connection 係有限制, 去 HTTP 1.1 最多兩條, HTTP 1.0 最多四條
Local server 係無呢個 limit
Registry 有得 set, 不過唔係好 work
FireFox 有可能會開 8 條, 最少 2 條, 可以人手較, 但係唔方便, 亦都唔係 workaround, 因為我想用 MSN Messenger
寫個程式時要 limit 只係會開 2 條, 張 N 條嘅 connection encapsulate 入呢兩條入面
用 observer pattern 去管理 connection 嘅 closure
因為 WinSock 有兩種 closure: graceful 同 reset
又因為你有兩個 socket 可以收 closure
所以, 你有 4 種 closure 方法
用 observer pattern 最簡單, 不過你最好寫個 manager 去做管理, 唔可以只係一個 List<> 就攪掂
最終, 訓咗兩晚覺就攪掂咗個程式, 仲可以行 HTTPS. 用咗大概 42 小時, 但係實際落手做只係做咗 11 個鐘左右.
p.s. 有 PortReverser + HttpTunnel, 就可以夾埋做一個 traverse NAT/HTTP firewall 嘅 package
相关文章推荐
- 几种建立http-tunnel的方法
- Android studio出现 Error:Unable to tunnel through proxy. Proxyreturns "HTTP/1.1 400 Bad Request"
- AndroidStudio问题Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request解决方法
- ActionScript 3的HTTPTunnel的实现
- HttpTunnel技术介绍
- HttpTunnel解读和防御
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法
- ErrorUnable to tunnel through proxy. Proxy returns HTTP1.1 400 Bad Reques
- Http Tunnel 小记
- HTTP隧道工具HTTPTunnel
- 在导入新项目之后出现Error:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 400 Bad Request”的错误
- 防火墙穿透学习--HttpTunnel工作原理与程序结构分析
- HttpTunnel解读和防御
- HTTP 隧道通讯库 HTTPTunnel
- Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"
- HttpTunnel防火墙穿透指南
- Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"
- http tunnel 原理 及 穿透防火墙方法-1
- Android开发:解决ErrorUnable to tunnel through proxy. Proxy returns HTTP1.1 400 Bad Request
- HTTP隧道工具HTTPTunnel