本文打算用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协议相关推荐

  1. 如何用java实现一个p2p种子搜索(3)-dht协议实现

    dht协议实现 上一篇完成了路由表的实现,建立了路由表后,我们还要对路由表进行初始化,因为一开始路由表为空,所以我们需要借助一些知名的dht网络中的节点,对这些节点进行find_node,然后一步步初 ...

  2. Socks5代理:一种安全的网络代理协议

    在今天的数字化世界中,网络安全已经成为了一个极为重要的话题.人们越来越关注网络安全问题,因为互联网已经成为了各行各业的基石.但是,随着网络的发展,各种网络攻击也层出不穷,比如黑客攻击.DDoS攻击等等 ...

  3. Socks5代理Socks5 Proxy

    Socks5代理Socks5 Proxy Socks5代理是基于Socks协议的一种代理模式.其中,5表示该协议的版本号.它可以让局域网的计算机通过socks5代理服务器,访问外网的内容.由于它工作在 ...

  4. Socks5代理IP技术详解:如何选择和使用最佳IP代理服务

    作为网络工程师,你可能已经听说过Socks5代理IP,这是一种用于匿名浏览和数据访问的代理技术.在本文中,我们将深入探讨Socks5代理IP的技术细节,以及如何选择和使用最佳IP代理服务. 什么是So ...

  5. ios设备使用socks代理_iOS使用socks5代理服务器

    借由着苹果公司发布春节新品发布会的空挡,我们今天就捞点干货,说点和苹果有关系的主题,咱们就说说IOS配合其他工具的相关使用 说到这,我们就先说说咱现在要提的ios配合的工具是啥,那就是我们接下来要说到 ...

  6. Socks5代理:网络安全的重要工具

    随着网络的发展和普及,网络安全问题也日益引起人们的关注.为了保障网络安全,许多企业和个人都采用了代理技术.其中Socks5代理作为一种广泛应用的代理技术,具有很强的安全性和隐私保护性,成为了网络安全的 ...

  7. SOCKS5代理的四大应用场景

    SOCKS5协议使用隧道通过网络传输数据.它通过发送数据包来做到这一点.数据包是为传输而分解的数据位,然后在到达目的地后重新组合.隧道可以建立有效的连接.绕过防火墙并在网络上启用不受支持的协议.SOC ...

  8. 使用Socks5代理保障HTTP传输的网络安全

    一.引言 在互联网时代,网络安全越来越受到人们的关注,特别是在数据传输过程中,很容易出现信息泄露.窃听等安全问题.为了保障网络传输的安全性,我们可以使用代理服务器来进行传输,而Socks5代理是其中一 ...

  9. 搭建一个socks5代理 解决狗东对ip限制nolanjdc无法获取短信问题(搬运工unke原创)

    前言: SOCKS5 是一个代理协议,它在使用 TCP/IP协议 通讯的前端机器和服务器机器之间扮演一个中介角色,使得 内部网 中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全 ...

最新文章

  1. 基于YOLO的密集人脸检测(课程设计)
  2. Mac OS X 在Finder新建文本文件
  3. SoaBox 1.1.6 GA 发布,SOA 模拟环境
  4. SpaceVim 语言模块 lua
  5. 使用PostgREST的RestAPI操作之 类型转JSON对象 | 嵌入视图
  6. 成绩的案例java_java-成绩案例
  7. mysql 导入1045错误_解决MyQL数据库中1045错误的方法——Windows系统
  8. Jersey MongoDB的使用
  9. [整理]充分发挥FireWork功能,实现超酷多级下拉菜单,爆强!
  10. Qt 小例子学习14 - 动态滚动QScrollArea
  11. 算法笔记 : 透视变换(透射变换)
  12. 献给在这个世界上摇摆不定的朋友们
  13. Seq2Seq模型中的序列解码策略
  14. OpenMeetings安装
  15. 最大后验概率估计算法(简单,通俗易懂)
  16. Python如何下载网页上的视频
  17. 算法题 子数组之和为零
  18. 利用计算机网络犯罪案例,网络犯罪指导性案例实务指引
  19. 最新网站生成APP源代码+Flutter项目/带控制端
  20. 【BAT-表姐御用04ren进阶命令】文件数字顺序命名及改名(含命令解释)

热门文章

  1. JAVA常用数据库连接池
  2. 为什么有的人中级职称是评审,有的是考试呢
  3. 线上卖运动鞋怎么引流?怎么在抖音卖鞋子?
  4. 非线性模型的最小二乘(LS)近似解
  5. SpringBoot-项目1-用户(注册,登录,修改密码,修改个人资料,上传头像)
  6. 运用字节流实现txt文件的复制
  7. Vue实现的聊天系统
  8. Java并发编程JUC-小结
  9. 2022我是如何拿到小米、京东、字节的offer,什么会导致Java应用程序的CPU使用率飙升
  10. python moviepy 的用法,看这篇就能入门