HttpTunnel解读和防御

HTTPTunnel测试 HTTPTunnel 阅读详情

1. 简介

httptunnel是通过HTTP通道来传输其他协议数据的工具软件,下载地址为:http://www.http-tunnel.

com,目前最新版本3.0.5


2. htc

htc是客户端,安装在防火墙内部网络一侧

htc源文件包括htc.c, common.c, tunnel.c, http.c, base64.c这几个文件和port目录下的库

程序流程:
main.c (htc.c)
  parse_arguments (argc, argv, &arg); 解析命令行参数, htc.c

  如果转发端口 (arg.forward_port != -1),在此端口打开socket监听 s = server_socket (arg.forward_port, 0),
      backlog=0, 其实不收连接, 注意用了SO_REUSEADDR选项, common.c;

  进入死循环 for (;;);
    如果定义输入输出的终端设备(arg.device),打开设备fd = open_device (arg.device),common.c;

    否则如果定义了转发端口(arg.forward_port != -1),输入输出通过连接的socket来进行fd = wait_for_connection_on_socket (s),就是accept() , htc.c;

    打开一个新的通道  tunnel = tunnel_new_client (arg.host_name, arg.host_port,
      arg.proxy_name, arg.proxy_port,
      arg.content_length); tunnel.c
    注意tunnel结构中的in_fd, out_fd都初始化为-1,表示没有连接, 缺省的content_length是100K字节.

    设置通道的一些选项:strict_content_length, keep_alive, max_connection_age, user_agent这些在HTTP头说明中会用到, 支持代理; 

    如果要进行代理认证(arg.proxy_authorization != NULL),将认证参数进行base64编码,作为通道的proxy_authorization参数;

    通道连接对方tunnel_connect (tunnel), tunnel.c, 建立http tunnel,主要是调用
      函数tunnel_write_request (tunnel, TUNNEL_OPEN, auth_data, sizeof auth_data)
        如果要写入和已经写入的数据长度超过content_length, 对tuenel进行填充;
          对于客户端已经连接好的tunnel,超时时进行断开;
          对于断开(或第一次连接)的客户端, 调用tunnel_out_connect (tunnel)发起连接
            调用do_connect()连接服务器(第一个连接), socket描述符为tunnel->out_fd.
            设置该socket的一些选项;
            调用shutdown(out_fd, 0), 不接收数据;
            调用http_post()函数向服务器发送HTTP的POST命令; http.c

          调用tunnel_write_data (tunnel, &request, sizeof request)函数向服务器写要执行的请求(此时为TUNNEL_OPEN)

          继续写data部分,先写长度,然后是数据(此时为dummy的auth_data=42, length=1)
          (即HTTP的POST命令向服务器写TUNNEL_OPEN命令和一个dummy数据)
          然后进行数据长度判断是否在此连接中数据写多了

      进入函数tunnel_in_connect (tunnel) , 数据进入的连接
        调用do_connect()连接服务器(第2个连接),socket描述符为tunnel->in_fd.
        设置该socket的一些选项;
        调用http_get()函数向服务器发送HTTP的GET命令; http.c
        调用shutdown(in_fd, 1), 不再写数据;
        调用http_parse_response (tunnel->in_fd, &response)解析HTTP服务器返回数据;
        处理统计信息
    此时tunnel_connect完成

    进入下一个循环
      poll选择用户的输入设备fd和网络tunnel的in_fd(第2条连接)数据,也就是用户的输入信息和服务器返回的信息进行对倒:
                        fd输入->tunnel->out_fd输出; tunnel->in_fd输入->fd输出.
      handle_input()
        handle_device_input()处理用户输入信息, common.c
      handle_input()
        handle_tunnel_input()处理来自通道的信息, common.c

客户端一共向服务器发起了两个连接, 第一个连接用于发送数据,第2个连接用于接收数据


3. hts

hts是服务器端,安装在外部网络一侧

hts源文件包括hts.c, common.c, tunnel.c, http.c这几个文件和port目录下的库

main() (hts.c)
  parse_arguments (argc, argv, &arg); 解析命令行参数, hts.c

  调用tunnel = tunnel_new_server (arg.port, arg.content_length)建立新的tunnel的服务端;
    初始化tunnel, in_fd, out_fd都为-1
    在tunnel->server_socket监听 server_socket (tunnel->dest.host_port, 1), backlog=1, 注意用了SO_REUSEADDR选项, common.c;

  设置通道的一些选项:strict_content_length, keep_alive, max_connection_age, 这些在HTTP头说明中会用到; 

  写PID文件

  进入死循环
    如果定义输入输出的终端设备(arg.device),打开设备fd = open_device (arg.device),common.c;
    tunnel_accept接受外部连接, tunnel.c
      accept()连接
      解析HTTP协议请求数据: http_parse_request (s, &request), http.c
        POST或PUT命令, 将此socket设置为tunnel的in_fd, 用于接收客户端的数据;
        GET命令, 将此socket设置为tunnel的out_fd, 用于发送去往客户端的数据;
    如果设置了转发端口(arg.forward_port != -1), 调用do_connect连接到这个端口,描述符为fd, 注意这个连接是本机的
         自己连自己的内部连接, hts起到代理转发作用, 目标端口也就是真正的被HTTP包裹的协议端口.
    进入下一个循环
      poll: fd 和tunnel->server_socket, 也就是网络通道数据和内部连接数据对倒
      handle_input()
        handle_device_input()处理fd输入信息, common.c
      handle_input()
        handle_tunnel_input()处理来自通道的信息, common.c

服务器端接收了客户端的两个连接, POST命令对应的连接服务器接收数据, GET命令对应的连接服务器

发送数据
   

4. 防御

对于http tunnel的防御, 可以根据以下方面(或的关系):
1)过滤POST/GET URL关键字: "/index.html?crap="
2)htc发的HTTP请求部分并不在一个包内发完, 分多次小包发送, 可以严格限制此类连接;
3)HTTP数据一般都是成比较大的块的,如果在连接中发现多次传输小包,可能是http tunnel;
4)根据数据行为检查,如果两机器间的HTTP同时存在POST/PUT和GET的连接,而且数据传输并不是很顺畅

,总有一定中断然后突发一阵,可能是http tunnel;

5. 总结

http tunnel利用HTTP的POST和GET两个命令建立了两个连接, 分别用于客户端向服务器发送和接收数

据, 而且考虑到了HTTP数据的合法性, 会随时检查所接收或发出的数据是否超过content-length规定

的长度, 如果是则填充完后重新开连接进行处理新的数据, 保证了数据始终是合法的HTTP数据, 完全

等价于客户端在同时用HTTP协议在上传和下载一个大文件, 文件数据中不需要不需要任何的HTTP命令

或HTML语言标志, 某篇文章中试图以此来检查是行不通的.

对于http tunnel的防御, 由于它完全遵守了HTTP协议, 用HTTP协议异常来检测是检测不到的, 防御

的1,2措施只是制标, 因为代码公开, 完全可以修改成其他URL和完整的HTTP包头一次发送; 防御3,4只

是理论上的,需要相当的智能化处理才有可能不误伤正常HTTP数据, 资源消耗大,更适合在IDS而非防火

墙上进行.

 
http协议解决粘包拆包半包 的编码解码过程、 以及netty 使用http协议的原理 本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能。 1 http协议 1.1 描述 标示 ASCII 描述 字符 CR 13 Carriage return (回车) \r LF 10 Line feed character(换行) \n SP 30   Horizontal space(... 阅读详情

相关推荐

NSL-KDD入侵检测数据集完整使用指南:从解压到模型评估

网络入侵检测是网络安全领域的核心任务,机器学习模型需要高质量的数据集来训练和评估。NSL-KDD作为经典的入侵检测基准数据集,通过去除冗余样本和难度分级,有效解决了KDD Cup 99中模型“背样本”导致的评估失真问题,被广泛用于异常检测算法的对比研究。本文从数据集背景出发,详细解析其41维特征的四大分类——TCP连接基本特征、内容特征、基于时间与基于主机的统计特征,并给出标签映射、One-Hot编码、标准化以及测试集隔离等预处理关键步骤。在此基础上,以随机森林为例演示模型训练与评估流程,分析特征重要性及二

weixin_30888413的博客 415

HTTP协议中的Tranfer-Encoding:chunked编码解析

 当不能预先确定报文体的长度时,不可能在头中包含Content-Length域来指明报文体长度,此时就需要通过Transfer-Encoding域来确定报文体长度。    通常情况下,Transfer-Encoding域的值应当为chunked,表明采用chunked编码方式来进行报文体的传输。chunked编码是HTTP/1.1 RFC里定义的一种编码方式,因此所有的HTTP/1.1应用都应当支

牧码人的专栏 2687

httptunnel:在HTTP请求中通过隧道传输的双向数据流

httptunnel:在HTTP请求中通过隧道传输的双向数据流

Http Trunked协议使用

1. 为什么要使用Http Trunked协议? 一般http通信时会使用content_length头信息来表示服务器发送的文档内容长度,这是因为我们已经提前知道了文档内容的长度,但 有时候我们无法提前知道我们需要传输的文档的长度,这时我们就要采用分块传输的方式来发送内容,也就是通过我们的http trunked协议。 Http1.1x协议的chunked编码方式,可以确保接...

weixin_34014555的博客 824

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

公司的历史项目在导出功能上引用的是poi-3.12版本,后续再做word模板导出功能时用到了poi-3.15版本,升级完后发现项目的很多导出功能都瘫痪了。用旧版本,新功能无法使用;用新版本,旧功能瘫痪,且整改的工作量比较大。使用maven-shade-plugin,将某个版本的依赖名称进行修改,重新引入即可。

S_White_Island的博客 1万+

2024“华为杯”中国研究生数学建模竞赛(A题)深度剖析_数学建模完整过程+详细思路+代码全解析

目标是优化风力涡轮机的功率调度,使其在给定的实时风速数据下,最小化涡轮机关键组件(如塔架和主轴)的疲劳损伤。问题的挑战在于,考虑通信延迟和测量噪声的同时,要确保功率输出与风速变化的响应快速且准确。

2401_82549447的博客 6633

Http chunk方式传输数据

Http协议 响应格式: HTTP/1.1 200 OK\r\n [HeaderKey]:[空格][HeaderValue]\r\n [HeaderKey]:[空格][HeaderValue]\r\n [HeaderKey]:[空格][HeaderValue]\r\n ......这里省略很多 \r\n [数据区] 请求格式: GET/POST[空格][相对或者绝对路径][空格]H

naruto_Mr的专栏 8434

Unity小游戏接入抖音敏感词检测

摘要: 本文介绍了Unity小游戏接入抖音敏感词检测的方法。抖音官方提供了两种API:SensitiveWordCheck用于检测敏感词,ReplaceSensitiveWords用于替换敏感词。此外,若使用键盘输入事件,可通过tt.onKeyboardComplete监听回调,平台会自动屏蔽敏感词(替换为*)。接入官方字库可有效避免审核驳回,适用于小游戏中的用户输入功能(如起名系统)。附官方文档链接及参数说明。

类人_猿的博客 4596

几种建立http-tunnel的方法

基本概念不多解释了,直入主题。GNU HTTP Tunnel (http://www.nocrew.org/software/httptunnel.html)是一个开源的http-tunnel项目,包括了tunnel server(hts命令)和tunnel client(htc命令),有(x)nix和windows版本。我们就用它来建立自己的tunnel。1。静态tunnel。        h

Builder的空间 8047

通过情感分类实例 详细介绍如果借助Huggingface平台 完成Transformers模型运行(包括配置环境-tokenizer-Model-输出头-预测)

attention_mask和padding是配套使用的,当人为去修改padding的时候,也要把attention_mask里面的参数进行修改。下载Huggingface包,Huggingface可以说是一个社区,集成了很多nlp的模型、数据集、预训练权重文件等等,并且免费,只需要pip install下载即可。那么用什么做分类就选择什么输出头,就import什么东西。代码中使用了自动分词器选择,它是由checkpoint指定的预训练模型关联的,不用我们自己选择tokenizer,它自动帮我们选择好了。

LZL2020LZL的博客 1137

OpenClaw零基础教程:30分钟搭建你的第一个AI自动化助手

别再看那些满是代码、专业术语的教程了,那些都是给程序员看的。这篇教程,我把所有步骤拆到了极致,你跟着点鼠标就行,点错了都没关系,大不了重装一遍,5分钟的事。

2601_94871597的博客 97

HTTP 响应的分块传输

Transfer-Encoding 响应头用于告诉客户端服务器发送内容的编码格式。 其可选值有: chunked:数据分块发送。此时应缺省 Content-Length 响应头。 compress:使用 Lempel-Ziv-Welch 算法进行传输的格式,目前没有浏览器在支持。 deflate:使用 deflate 压缩算法 zlib 结构...

weixin_30695195的博客 659

【AI应用实战-Codex】Mac intel芯片下安装Codex(二)

摘要:本文介绍了在Intel芯片Mac上安装OpenAI Codex桌面应用时遇到的问题及解决方法。由于官方仅提供ARM64版本,导致Intel Mac无法直接运行。解决方案包括:1)使用社区脚本将ARM版DMG与x64 Electron重新打包成兼容版本;2)使用VSCode插件配合CLI作为替代方案。文章详细记录了重新打包过程中遇到的"electron_common_owl_features"绑定缺失错误,通过注入stub代码、重算ASAR完整性哈希等步骤成功解决问题。最终生成的Co

3550

HttpTunnel技术介绍

1. 概述 HttpTuunnel(也叫Http隧道,Http穿梭),是这样一种技术: 它用HTTP协议在要通信的Client和Server建立起一条”Tunnel”,然后Client和Server之间的通信,都是在这条Tunnel的基础之上。 HttpTunnel通常被用在受限的网络环境中,比如在NAT环境中的Client,受防火墙限制的环境中的Client等,在这样的环境中,Clien...

xiaomin1991222的专栏 519

用 MVC 框架把 ABAP 报表写成可扩展的应用(2)

本文介绍了一个基于MVC架构的SAP报表模板,解决了传统ABAP报表开发中的三个核心痛点: 选择屏幕校验逻辑分散问题 - 通过统一的选择屏幕控制器集中管理校验逻辑 在线与后台输出不一致问题 - 共享同一数据模型,通过不同控制器实现多样化展示 屏幕流转管理混乱问题 - 主控制器统一管理所有屏幕流程和事件 该模板采用分层架构: Model层专注数据获取和业务规则 Controller层管理流程和交互 View层负责展示逻辑 特别适用于需要同时支持交互式ALV展示和后台批处理输出的报表场景,通过标准化的扩展点设计

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 78

(考研湖科大教书匠计算机网络)第四章网络层-第三节3、4:划分子网的IPv4地址和无分类IP地址

子网掩码: 32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号子网掩码使用连续的比特1来对应网络号和子网号子网掩码使用连续的比特0来对应主机号将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址如下图。

快乐江湖的博客 1350

HTTP协议:分块编码Trunked

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33989058的博客 640

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

关于HTTP协议,一篇就够了

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990...

moliyiran的专栏 334

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

13 | HTTP Tunnel:复杂网络下消息通道高可用设计的思考

在第 1 讲“架构与特性:一个完整的 IM 系统是怎样的?”中,有讲到即时消息系统中非常重要的几个特性:实时性、可靠性、一致性、安全性。实际上,这些特性的实现大部分依赖于通道层的稳定和高可用。对于即时消息系统来说,消息的通道主要承载两部分流量:一部分是用户发出的消息或者触发的行为,我们称为;一部分是服务端主动下推的消息和信令,我们称为。由此可见,消息通道如果不稳定,一来会影响用户发送消息的成功率和体验,二来也会影响消息的下推,导致用户没法实时收到消息。

qq_37756660的博客 1475

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

HttpTunnel--穿透防火墙的利器

使用Http通道软件可以突破防火墙的限制,利用唯一Http访问的权限获得其他Internet应用。那么什么是通道呢?这里所谓的通道,是指一种绕过防火墙端口屏蔽的通讯方式。防火墙两端的数据包封装在防火墙所允许通过的数据包类型或是端口上,然后穿过防火墙与对方通讯,当封装的数据包到达目的地时,再将数据包还原,并将还原后的数据包转交到相应的服务器上。   http://www.http-tunnel

asli33的专栏 1487
上一篇: HttpTunnel工作原理及源程序分析
下一篇: IPSec over HTTPS
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值