java实现一个socks5代理 一了解socks5协议
本文打算用java 实现一个socks5代理,写之前在网上搜索发现资料也比较少,决定做个总结
1.首先我们讲解什么是代理
用一幅形象的图解释什么事代理,我们的请求过来后 代理将请求转达到真正的网络,再将结果转发回来。我们的浏览器看起来就像和真正的网站之间进行通信一样,我们要做的就是对请求和响应的转发工作
2.要想接受浏览器的请求,必须先和应用程序之间进行握手连接,只有应用程序同意了,才能将数据包发给我们,我们才能将返回的结果发给应用程序,下面讲讲握手过程
socks5的文档,英语好的可以看看 ,下面我翻译一下握手过程
第一步,程序将发送给代理请求握手的信号
VER |
NMETHODS |
METHODS |
1 | 1 | 1~255 |
ver 代表协议版本占用一个字节 这里肯定是 : 5
nmethods 代表下一个字段专用的字节数量 这里不确定
methods 代表客户端拥有的加密方式占用1~255个字节都有可能,比如说0 代表不加密 1代表加密 2代表 另一种加密等
代理收到后返回
VER | METHOD |
1 | 1 |
method代表代理选择了一种握手方式
eg.
client --> 5 2 0 2 代表着 版本5 有两种握手方式 加密的和不加密的供代理选择
proxy--> 5 0 代表着版本5 选择了不加密的协议方式
或者是
client--> 5 1 0 只有一种不加密的握手方式
proxy--> 5 0 选择了不加密的握手方式
上面的过程就叫做第一步握手连接,client 和proxy之间互相选择连接方式,如果client的所有握手方式proxy都不满足,则直接断开连接就好了
经过上一步的握手 client将发送如下信息到proxy
VER |
CMD |
RSV |
ATYP |
DST.ADDR |
DST.PORT |
1 | 1 | 1 | 1 | variable | 2 |
cmd 字段,占用一个字节 1代表 想要tcp连接 3 代表想要udp连接
rsv 保留字,默认0
atyp 1 ip4
3 域名
4ip6
dst.addr 如果上一个字段是1 则这个字段是4位ip4地址
如果是3 则这个字段第一个字节代表域名长度,紧跟其后的是域名
如果是6 则这个字段16位ip6地址
dst.port 两个字节代表目的地端口
proxy返回
ver | rep | rsv | atyp | bnd.addr | bnd.port |
1 | 1 | 1 | 1 | 2 |
rep 代表proxy告诉应用程序处理的情况,0代表处理成功,否则可以直接断开连接了
所以有可能是这样的情况
eg.
client--> 5 1 0 1 123 123 123 123 0 80 表示tcp连接 到123.123.123.123 的80 端口
proxy-->5 0 0 1 0 0 0 0 0 0 代表着已经连接上了,并且将atype置1代表后面的是ip和端口 ,由于大多客户端的实现都会忽略后面的ip和端口,我们直接全写0
这样握手就完成了。
然后我们已经拿到了程序想要访问的地址和端口,我们新建一个socket 自己连接到ip和端口,然后一边接受应用程序发的数据,转发给网站,一遍接受网站返回的数据,转发给应用程序,这样达到了让他们俩通信的目的
注意
这里解释一点,为什么java用两个byte表示端口,用四个byte表示ip地址,byte的范围是-128~127 而ip地址每一位的范围是0 ~255 之间从数量上一个byte刚好有256个数足够表示一位ip地址,但是当ip地址超过127时自动变成-128 ,也就是说当某位ip地址超过127 比如说是129,那么当他超过127时自动从-128开始计算,也就是说129==--127
我们拿到某位ip是负的时,我们只需要用256加上这位负的地址,就能求出真正的地址
两位地址表示端口,计算机上有65535个端口,一位byte只能表示256个数是远远不够的,这时当端口超过127 就从-128开始计算,当端口超过256 就向前进一位,从0开始计算,比如说端口时 1 60,并不是代表60端口,而是1*256+60=316 端口, 某端口时 1 -69 ,代表着1*256+(256-69)==443端口,如果你收到的端口时1 -69 则代表443端口(https用的端口),
公式就是 如果端口是正数 实际端口=256*前面一位+后面一位。如果端口是负的 实际端口=256*前面一位+(256+后面一位) ps(因为后面一位是负的,所以加上后面一位代表减去那个数的绝对值)。
这就是处理端口和ip的方法
附上根据一个bytebuffer 和长度 解析出ip/域名 和端口的方法
//解析地址public String getHost(ByteBuffer a,int len){if(len<8){return null;}StringBuffer sb=new StringBuffer();if(a.get(3)==3){//说明是网址地址int size=a.get(4); //网址长度for(int i=5;i<(5+size);i++){sb.append((char)a.get(i));}}else if(a.get(3)==1){//说明是ip地址for(int i=4;i<=7;i++){int A=a.get(i);if(A<0) A=256+A;sb.append(A);sb.append(".");}sb.deleteCharAt(sb.length()-1);}return sb.toString();}//解析端口public int getPort(ByteBuffer a,int len){if(len<4){return 0;}int port = a.get(len-1);int thod=a.get(len-2);if(port>0){return 256*thod+port;}else{return 256*thod +(256+port);}}
java实现一个socks5代理 一了解socks5协议相关推荐
- 如何用java实现一个p2p种子搜索(3)-dht协议实现
dht协议实现 上一篇完成了路由表的实现,建立了路由表后,我们还要对路由表进行初始化,因为一开始路由表为空,所以我们需要借助一些知名的dht网络中的节点,对这些节点进行find_node,然后一步步初 ...
- Socks5代理:一种安全的网络代理协议
在今天的数字化世界中,网络安全已经成为了一个极为重要的话题.人们越来越关注网络安全问题,因为互联网已经成为了各行各业的基石.但是,随着网络的发展,各种网络攻击也层出不穷,比如黑客攻击.DDoS攻击等等 ...
- Socks5代理Socks5 Proxy
Socks5代理Socks5 Proxy Socks5代理是基于Socks协议的一种代理模式.其中,5表示该协议的版本号.它可以让局域网的计算机通过socks5代理服务器,访问外网的内容.由于它工作在 ...
- Socks5代理IP技术详解:如何选择和使用最佳IP代理服务
作为网络工程师,你可能已经听说过Socks5代理IP,这是一种用于匿名浏览和数据访问的代理技术.在本文中,我们将深入探讨Socks5代理IP的技术细节,以及如何选择和使用最佳IP代理服务. 什么是So ...
- ios设备使用socks代理_iOS使用socks5代理服务器
借由着苹果公司发布春节新品发布会的空挡,我们今天就捞点干货,说点和苹果有关系的主题,咱们就说说IOS配合其他工具的相关使用 说到这,我们就先说说咱现在要提的ios配合的工具是啥,那就是我们接下来要说到 ...
- Socks5代理:网络安全的重要工具
随着网络的发展和普及,网络安全问题也日益引起人们的关注.为了保障网络安全,许多企业和个人都采用了代理技术.其中Socks5代理作为一种广泛应用的代理技术,具有很强的安全性和隐私保护性,成为了网络安全的 ...
- SOCKS5代理的四大应用场景
SOCKS5协议使用隧道通过网络传输数据.它通过发送数据包来做到这一点.数据包是为传输而分解的数据位,然后在到达目的地后重新组合.隧道可以建立有效的连接.绕过防火墙并在网络上启用不受支持的协议.SOC ...
- 使用Socks5代理保障HTTP传输的网络安全
一.引言 在互联网时代,网络安全越来越受到人们的关注,特别是在数据传输过程中,很容易出现信息泄露.窃听等安全问题.为了保障网络传输的安全性,我们可以使用代理服务器来进行传输,而Socks5代理是其中一 ...
- 搭建一个socks5代理 解决狗东对ip限制nolanjdc无法获取短信问题(搬运工unke原创)
前言: SOCKS5 是一个代理协议,它在使用 TCP/IP协议 通讯的前端机器和服务器机器之间扮演一个中介角色,使得 内部网 中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全 ...
最新文章
- 基于YOLO的密集人脸检测(课程设计)
- Mac OS X 在Finder新建文本文件
- SoaBox 1.1.6 GA 发布,SOA 模拟环境
- SpaceVim 语言模块 lua
- 使用PostgREST的RestAPI操作之 类型转JSON对象 | 嵌入视图
- 成绩的案例java_java-成绩案例
- mysql 导入1045错误_解决MyQL数据库中1045错误的方法——Windows系统
- Jersey MongoDB的使用
- [整理]充分发挥FireWork功能,实现超酷多级下拉菜单,爆强!
- Qt 小例子学习14 - 动态滚动QScrollArea
- 算法笔记 : 透视变换(透射变换)
- 献给在这个世界上摇摆不定的朋友们
- Seq2Seq模型中的序列解码策略
- OpenMeetings安装
- 最大后验概率估计算法(简单,通俗易懂)
- Python如何下载网页上的视频
- 算法题 子数组之和为零
- 利用计算机网络犯罪案例,网络犯罪指导性案例实务指引
- 最新网站生成APP源代码+Flutter项目/带控制端
- 【BAT-表姐御用04ren进阶命令】文件数字顺序命名及改名(含命令解释)