配置代理IP的时候,很多工具会问协议选哪种,选了 SOCKS5 之后,客户端和服务器之间到底先聊了什么?今天就把这段接头暗号拆开看一遍,理解了它,代理IP连接建立时那些时快时慢、偶尔失败的现象,都会好解释得多。
先说结论:SOCKS5 的连接建立不是一步到位的,而是四轮对话。前两轮是互相摸底,后两轮才是真正报出要去哪。整个过程快则几毫秒,慢的时候却可能反复重试,差别往往就出在某一轮上。
为什么要分四轮而不是一口气把目的地报完?因为服务器要先确认两件事:第一,对方是不是用同一个协议的客户端,第二,两边认不认同一个认证方式。这两件事不先谈妥,直接传地址过去,服务器既不知道该怎么处理,也不知道该不该信你。
四轮会话,每一轮都在确认一件事
第一轮,客户端先开口。它发出一条问候消息,告诉服务器:我用的协议版本是 5,我这边支持哪些认证方式。这一步相当于报家门——我叫什么、我带了哪些通行证,你先看看认不认。
第二轮,服务器回话。它从客户端列出的方式里挑一种,回一条确认消息。如果两边能谈拢,握手就继续往下走;如果服务器一个都不认,会话直接结束。很多连接在还没开始传数据之前就失败,问题多半出在这一轮。
第三轮,客户端正式报目的地。它会说出这次要做什么——通常是请求建立一条到目标站的连接,同时附上目标站的地址和端口。这轮消息里的信息量最大,地址写错、端口写错,都会在这一轮被服务器拦下来。
第四轮,服务器给出答复。它回一条状态消息,告诉客户端连接建好没有,同时附上服务器这边的地址信息。到这里,四轮对话结束,客户端和服务器之间才真正开始传业务数据。
四轮对话走完,快的时候一个往返就够了,慢的时候可能因为认证协商多来回一次。这也是为什么同样一条代理IP,在不同的工具里连接速度看起来不一样——有些工具把认证提前配置好,有些则每次都现场商量。
为什么连接偶尔会卡在握手上
四轮对话看起来简单,但每一轮都可能出岔子。第一轮发出去没回应,通常是服务器根本没在监听这个端口;第二轮谈不拢,往往是认证方式对不上;第三轮被拒,多半是目标地址或端口不合法;第四轮失败,则是服务器连目标站没连上。
卡在第一轮和第二轮,属于代理IP这半边的问题,换地址、查配置更有效;卡在第三轮和第四轮,目标站那边的因素更多,换出口未必有用。分清是哪一轮卡住,比盲目重试效率高得多。
四轮对话的耗时也很有讲究。第一轮发出问候后,等待服务器回应的时间通常很短,如果这里就反复超时,多半是服务器地址或端口本身有问题;第三轮之后的等待变长,则可能是目标站响应慢。把耗时和轮次对应起来,判断代理IP链路健康状况就有了抓手。
握手失败和连上之后断掉,是两回事
握手指的是建立连接前的四轮对话,它失败说明连门都没进去;而连接建立之后又断掉,那属于传输阶段的问题,排查方向完全不同。把这两件事分开,报错信息才有意义。
第一轮确认版本:客户端报协议版本号,服务器认不认是第一条分水岭。
第二轮确认方法:认证方式在这一轮敲定,两边谈不拢就直接散伙。
第三轮确认目的地:地址和端口在这一轮报出,写错就会被当场拦下。
把这些轮次理顺之后,再看代理IP连接建立的过程,就不只是一个连上了的结果,而是每一步都有明确含义。哪一轮慢、哪一轮失败,心里自然有数,排查起来也就不再是靠运气反复试。
