sock代理服务原理(TCP穿透)

Sock学习1 (网络基本知识、Sock简介) 网络基本知识两台计算机之间的通信必须满足一下一些必然的条件1)两台主机需要一个唯一的标识,标识他们所在的位置(ip地址)2)他们需要有共同的源(协议)3)每台主机需要相应的端口号,每台主机有不同的应用程序通讯,每个通讯就是通过端口号来区分的。端口号的范围为0~65535,但是其中0~1023 被系统保留。TCP/IP协议TCP/IP协议 是目前世界上应用最广泛的协议。是以TCP/IP为基础的不同层... 阅读详情

原文转自:http://www.cppblog.com/zuhd/archive/2010/06/08/117366.html

sock代理分为sock4代理和 sock5代理。sock4支持TCP(事实仅支持TCP),无需用户名、密码验证;sock5支持TCP和UDP,根据代理服务器设置是否需要用户名、密码认证。TCP和UDP代理工作原理产不多,UDP代理网上多的是,google一下即可。这里只讲TCP代

理工作原理。
sock代理工作原理大致如下:
1。[需要代理方]向服务器发出请求信息;
2。[代理方]应答;
3。[需要代理方]接到应答后发送向[代理方]发送目的ip和端口;
4。[代理方]与目的连接;
5。[代理方]将[需要代理方]发出的信息传到目的方,将目的方发出的信息传到[需要代理方];
6。代理完成。
下面对sock4和sock5的代理工作原理流程分别详细说明,并给出示例代码。
sock4的TCP代理工作流程:
1。我们首先还是连接服务器,然后发送数据给服务器。由于是无用户密码验证,我们需要发送9个字节的数据,展开写为 04 01 + 目标端口(2字节) + 目标IP(4字节) + 00,其中目标端口和目标IP就是我们真正要连接的服务器端口和服务器地址;
2。代理服务器返回8字节的数据,我们只要判断第二字节是否为90即可,若是90连接成功,否则失败.剩下的操作和不存在代理服务器一样,可直接用发送\接受数据。
sock5的TCP代理工作流程:
1。向服务器的代理端口建立tcp连接。一般为1080;
2。向服务器发送 05 02 00 02(此为16进制码,以下同),让代理服务器选择认证方式 ;
05
02 这里确认2种认证方式 无需认证和需要认证,只需要验证一种方式,可以直接发送05 01 00查询服务器是否支持无认证代理方式;
00 不需要认证;
02 需要认证;
3。如果接到 05 00 则是可以代理或则05 02需要认证,这里只需要判断第二字节就行;
如果需要认证,需要向服务器发送01 用户名长度(2字节)用户名 密码长度(2字节)密码,然后接收服务器返回数据,如果第二字节为 00,则认证通过,否则无法认证,则连接失败;
4。发送 05 01 00 01 + 目的地址(4字节)+ 目的端口(2字节),目的地址和端口都是16进制码(不是字符串)。
例202.103.190.27 - 7201
则发送的信息为:05 01 00 01 CA 67 BE 1B 1C 21
(CA=202 67=103 BE=190 1B=27 1C21=7201)
5。接收代理服务器返回的数据,我们只要判断第二字节是否为00即表示代理连接完成;
6。以后操作和直接与目的方进行TCP连接相同。

//代理服务器登录
CString g_proxyserver = “”;
int g_proxyport = 1080;
CString g_proxyuser = “”;
CString g_proxypwd = “”;
int g_proxyid = 3; //2 - sock4代理 3 - sock5代理
char server_name[100]= {0}; //真正的服务器地址
int server_port=8000; //真正的服务器端口
SOCKET ConnecToProxyServer()
{
SOCKADDR_IN ToAddr;
SOCKET m_hSocketpop = socket(AF_INET, SOCK_STREAM ,0); // SOCK_DGRAM;
memset(&ToAddr, 0, sizeof(ToAddr));
ToAddr.sin_family = AF_INET;
ToAddr.sin_addr.s_addr = inet_addr(g_proxyserver);//这是我的SOCKS服务器
ToAddr.sin_port = htons(g_proxyport);
int retErr = connect(m_hSocketpop,(SOCKADDR*)&ToAddr,sizeof(ToAddr));
if(retErr == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
char buf[100] = {0};
if(g_proxyid == 3) //sock5 代理方式
{
// 让PROXY选择认证方法
buf[0] = 0x05;
buf[1] = 0x02; //确认2种认证方式 无需认证和需要认证
buf[2] = 0x00; // 无需认证
buf[3] = 0x02; // 需要认证
if(send(m_hSocketpop,(const far char*)buf,4,0) == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
Sleep(100);
if(recv(m_hSocketpop,buf,10,0) == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
if(buf[1] == 0x02)
{//需要认证
char userStr[128] = {0};
userStr[0]=0x01;
userStr[1]=g_proxyuser.GetLength();
strcpy(userStr+2,g_proxyuser);
userStr[2+g_proxyuser.GetLength()]=g_proxypwd.GetLength();
strcpy(userStr+3+g_proxyuser.GetLength(),g_proxypwd);
int result=send(m_hSocketpop,userStr,strlen(userStr), 0);
if(result == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
Sleep(100);
char validateChar[2] = {1};
result=recv(m_hSocketpop,validateChar,2, 0);
if(result == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
if(validateChar[1]!=’\x00’)
{//认证失败
closesocket(m_hSocketpop);
return -1;
}
}
// 向PROXY服务器发送CONNECT 请求,
memset(buf, 0, 100);
buf[0] = 0x05;
buf[1] = 0x01; // connection request.
buf[2] = 0x00; // reserved!
buf[3] = 0x01; // address type:Ip V4 ;
((ULONG)(buf+4))=inet_addr(server_name);
((USHORT)(buf+8))=htons(server_port);
if(send(m_hSocketpop,(const far char*)buf,10,0) == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
Sleep(100);
// 接收PROXY服务器返回的REPLY
memset(buf, 1, 100);
if(recv(m_hSocketpop,buf, 20,0) == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
if(buf[1] != 0) // 只有当第二个字节为0时,才表示成功。
{
// printf(“Cannot connect to the remote server!\n”);
closesocket(m_hSocketpop);
return -1;
}
// theApp.m_ClientSocket.Attach(m_hSocketpop);
}
if(g_proxyid == 2) //sock4 代理方式
{
int result;
memset(buf, 0, 100);
buf[0] = 0x04;
buf[1] = 0x01; // connection request.
((USHORT)(buf+2))=htons(server_port);
((ULONG)(buf+4))=inet_addr(server_name);
buf[8] = 0x00;
result = send(m_hSocketpop, (const far char*)buf, 9, 0);
if(result == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
Sleep(100);
char EchoStr[10];
memset(EchoStr,0,10);
result=recv(m_hSocketpop,EchoStr,8, 0);
if(result == SOCKET_ERROR)
{
closesocket(m_hSocketpop);
return -1;
}
if(EchoStr[1] != 90)
{
closesocket(m_hSocketpop);
return -1;
}
// theApp.m_ClientSocket.Attach(m_hSocketpop);
}
return m_hSocketpop;
}
调用方式:
strcpy(server_name, theApp.m_ServerIP);
server_port = 8080;
SOCKET m_socket = ConnecToProxyServer();
if(m_socket == -1)
{
return 0;
}
int type = 1000;
send(m_socket, (char*)&type, sizeof(int), 0);

SOCK5如何用代理UDP连接

1。向服务器的1080端口建立tcp连接

2。向服务器发送 05 01 00

3。如果接到 05 00 则是可以代理

4。发送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字节)

5。服务器返回 05 00 00 01 +服务器地址+端口

7.需要申请方发送
00 00 00 01 +目的地址IP(4字节)+目的端口 +所要发送的信息

8。当有数据报返回时
向需要代理方发出00 00 00 01 +来源地址IP(4字节)+来源端口 +接受的信息

使用sock5代理时TCP数据:
客户端 sock5服务器
SYN
ACKSYN
ACK
05 01 00 00 00 00
05 00 00 00 00 00
05 01 00 03 0E 31 39 32 2E 31 36 38 2E 37 35 2E 31 31 34 00 6E (…..192.168.75.114.n)
05 00 00 01 C0 A8 4D 56 08 D4
ACK
+OK X1 NT-POP3 Server iflytek.com (IMail 8.15 228888-9)..
USER hjma..
+OK send your password..
PASS xxxxxxx..
+OK maildrop locked and ready..
STAT..
+OK 0 0..
QUIT..
+OK POP3 Server saying Good-Bye..
ACKFIN
ACK
ACKFIN
ACK

出处:http://www.cnblogs.com/zhangdongsheng/

SOCK5代理服务器透明穿透技术  SOCK5代理服务器透明穿透技术一、目标(Target)在尽量不改变现有代码的情况下,透明穿越socks 5代理。二、技术分析(Technology Analyse)2.1 sock 5 代理分析由于目前socks规范中,socks4不支持UDP,只有socks5才支持,而目前视频应用中,码流传输采用的是UDP,所以如果客户端只支持SOCK4代理,则视频应用将受到限制。从 阅读详情

相关推荐

UDP打洞原理与N2N内网穿透

UDP打洞原理与N2N内网穿透技术

qq_19393857的博客 5216

ccproxy使用指南

目的:虚拟机中需要访问外网,下载东西 开始做一个好运维 2021-12-16 1.ccproxy是什么? CCProxy是一个国产的支持HTTP、FTP、Gopher、SOCKS4/5、 Telnet、Secure(HTTPS)、News(NNTP)、 RTSP、MMS等代理协议的代理服务器软件 2.原理是什么? 对Web客户端来说,代理就是扮演服务器的角色,接受请求报文,返回响应报文。 对Web服务端来说,代理扮演的是客户端角色,发送Web请求报文,接受Web响应报文。 3.window..

1万+

树莓派实现内网穿透

树莓派实现内网穿透 一、实验材料 能连上公网的树莓派、一台具有公网ip的云服务器 二、实验原理 使用frp服务作为内网穿透,云服务器作为frp服务端,开放一个端口作为流量转发,不同网段的设备可通过云服务器的端口连接到树莓派 frp 一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 为什么使用 frp ? 通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网

weixin_43869261的博客 3812

转载的socks4 socks5 rfc1928一大堆

SOCKS协议最初由David Koblas设计,后经Ying-Da Lee改进成SOCKS 4协议。SOCKS4协议主要是如下几个RFChttp://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocolhttp://www.rfc-editor.org/rfc/rfc1928.txthttp://www.smartftp.com/Products/SmartFTP/RFC/socks4a.protocolSOCKS 4只支持TCP转发。请求报文格式如下:

laotse的专栏 2万+

Halcon 3D点云处理实战:从PLY文件读取到曲面匹配的完整流程(附避坑指南)

本文详细介绍了Halcon在3D点云处理中的完整流程,从PLY文件读取到曲面匹配,特别强调了3D算子的应用技巧和避坑指南。通过实战案例和参数优化建议,帮助开发者高效处理工业视觉检测中的复杂点云数据,提升匹配精度和性能。

weixin_42535720的博客 278

TIBCO Spotfire 入门指南

数据分析工具 - TIBCO Spotfire 入门指南(一) 文章目录数据分析工具 - TIBCO Spotfire 入门指南(一)前言一、Sportfire 是什么?二、使用Sportfire 创建一个简单的数据分析模型1.设置分析(加载数据)2.编辑数据源3.创建图表3.1 创建交叉表3.2 创建饼图3.3 创建树形图3.4 创建散点图3.5 创建自定义筛选器总结 前言 通过对本指南的学习,你可以了解到如何开始用TIBCO Sportfire分析数据,并能详细了解您可以做什么以及怎么做 一、Spo

kaiakai111的博客 1万+

QNX使用多网卡后无法使用ifconfig命令修改IP地址

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

weixin_33843947的博客 1159

Delphi中使用FireDAC与uniDAC高效连接PostgreSQL的实战指南

本文为Delphi开发者提供了使用FireDAC与uniDAC组件高效连接PostgreSQL数据库的实战指南。文章详细对比了两款组件的选择策略,重点解析了驱动依赖(libpq.dll)的配置、连接参数设置、常见错误排查及性能优化技巧,旨在帮助开发者快速构建稳定可靠的数据库连接。

tomato的博客 806

Socket套接字通信 TCP UDP详解(网络通信)

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。......

qq_41796226的博客 3630

用RK3588 NPU加速人脸识别:从本地测试到服务器部署的完整流程(含ONNX模型)

本文详细介绍了如何利用RK3588 NPU加速人脸识别系统,从模型优化到高并发服务部署的全流程。通过RetinaFace和FaceNet模型的协同推理,结合ONNX模型转换和NPU特有优化技巧,显著提升识别效率。文章还涵盖了gRPC通信架构设计、性能压测及实际部署经验,为开发者提供了一套完整的解决方案。

weixin_29058331的博客 465

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

网络穿透:TCP 打洞、UDP 打洞与 UPnP

TCP 打洞(TCP Hole Punching)是一种使 NAT 后的两个客户端通过第三方服务器建立直接连接的方法。NAT 通常会阻止外部主机直接与内部主机通信,因此需要借助外部服务器来协调连接。UDP 打洞(UDP Hole Punching)与 TCP 打洞类似,是一种让处于 NAT 后的两台主机通过第三方服务器建立直接 UDP 连接的技术。与 TCP 不同的是,UDP 是无连接的协议,允许 NAT 主机更容易接受来自外部的连接请求。

四楼没电梯的专栏 4970

一文学会Inner-MPDIoU:YOLOv11边界框回归优化全解析

Inner-MPDIoU 凭借“辅助边框+最小点距离”的双重创新,成功解决了传统 IoU 损失在小目标、遮挡场景、位置偏差场景下的收敛和判别难题,为 YOLOv11 注入了更强的边框回归能力。从原理剖析到代码集成,本教程已为你铺就了一条“定位精度跃升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“定位精准”的答卷——相信我,当你看到检测框完美贴合目标的那一刻,你会明白这份尝试的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在边框回归领域的边界。

know_F0727的博客 141

<转>sock代理服务原理(TCP穿透)

原文转自:http://www.cppblog.com/zuhd/archive/2010/06/08/117366.html sock代理分为sock4代理和 sock5代理。sock4支持TCP(事实仅支持TCP),无需用户名、密码验证;sock5支持TCP和UDP,根据代理服务器设置是否需要用户名、密码认证。TCP和UDP代理工作原理产不多,UDP代理网上多的是,google一下即可。这里...

weixin_30443075的博客 334

五、MT8168 音频驱动之SPEAKER

本章主要讲解MT8168平台的内部SPEAKER驱动配置。分为HP接法和LINE OUT接法。2.1.3 audio_custom_exp.h设置。2.1.4 mixer_paths.xml设置。2.2.3 mixer_paths.xml设置。2.1.2 ProjectConfig 设置。2.2.2 ProjectConfig 设置。2.2.1 deconfig设置。2.1.1 DTS设置。......

Joon2020的博客 1664

基于Linux的PCIe设备驱动开发入门到精通-- 11.2 锁机制与并发控制 (自旋锁、互斥锁) 11.3 性能瓶颈分析与优化建议

本文探讨Linux驱动开发中的性能优化方法论,重点聚焦并发控制与性能瓶颈分析。从锁机制选择(自旋锁、互斥锁等)到工具使用(ftrace、perf),详细介绍了定位锁竞争和CPU热点的实战步骤,包括ftrace事件跟踪和perf火焰图分析。针对常见性能瓶颈(CPU/内存/I/O/锁竞争),提出了锁粒度优化、无锁结构替换、中断处理优化等解决方案。强调性能优化需要理论结合实践,通过"假设-测量-验证"的循环持续迭代。为开发者提供了一套从问题定位到解决的完整方法论,助力开发高性能工业级驱动。

MHD0815的博客 130

用TCP穿透NAT(TCP打洞)的实现

1. TCP穿透原理:     我们假设在两个不同的局域网后面分别有2台客户机A和 B,AB所在的局域网都分别通过一个路由器接入互联网。互联网上有一台服务器S。      现在AB是无法直接和对方发送信息的,AB都不知道对方在互联网上真正的IP和端口, AB所在的局域网的路由器只允许内部向外主动发送的信息通过。对于B直接发送给A的路由器的消息,路由会认为其“不被信任”而直接丢弃。     

晴天的专栏 1821

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

穿透Socks5的UDP

网络编程中,对于数据传输实时性要求较高的场合,大家都会选择UDP来作为数据传输协议,在TCP/IP协议族中UDP协议较TCP协议需要的网络系统资源更少。然而在企业应用中,由于网络安全原因等会导致除了特定端口以外的IP数据无法通过专用的路由或网关。为了支持这类应用,制定了专门的支持Socks连接的socks4/socsk5协议。Socks协议允许实现此类功能的代理软件可以允许防火墙(本

zhhxidian2005的专栏 1597

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TCP穿透的方法

【代码】TCP穿透的方法。

yeshen.org 769

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Http 代理穿透

HTTP代理服务器中能够提供一种HTTP CONNECT代理服务,能够允许用户建立TCP连接到任何端口。通过CONNECT方法穿透代理的实现方法为:CONNECT代理服务器的代理端口(如:8080);如果成功返回就可以按照正常的Socket进行通讯。当然在此之前需要先获得代理相关的信息。如何获取HTTP代理相关信息。

零落年华的专栏 542

破壁者指南:内网穿透技术的深度解构与实战方法

内网穿透技术:实现NAT后服务访问的关键方案 摘要: 内网穿透技术是解决NAT后服务访问的核心方案,主要包括UDP打洞、TCP打洞、中继转发等关键技术。本文系统介绍了内网穿透的技术背景、核心原理和实现方法:首先分析了NAT环境下的网络连接挑战,然后详细阐述了STUN协议检测NAT类型的方法,并通过代码示例展示了UDP打洞的具体实现过程。此外,文章还分类整理了各类穿透技术(直接连接、打洞技术、中继转发和协议辅助),并通过流程图直观呈现技术体系结构。该技术在现代微服务架构、远程办公等场景中具有重要应用价值,其混

Jaxonic的博客 1834

如何实现 子网穿透

子网穿透是指在存在 NAT(网络地址转换)设备的网络环境中,使得两个位于不同私有子网的设备能够建立直接通信。NAT 通常隐藏私有网络设备的 IP 地址,阻碍外部设备直接访问内部设备。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1339

UDP穿透原理及实现

本文介绍了UDP穿透技术实现跨局域网通信的原理与实现。

LWD的博客 1353

常见内网穿透工具使用总结

链接:http://v0w.top/2020/08/11/IntranetProxy/0x00 前言本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。0...

code小生 480
上一篇: HTTP 隧道 (HTTP代理Socket客户) (转)
下一篇: 关于设置http响应头connection的作用
whackw
博客等级 码龄16年 203粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值