GFW的工作原理(4)——“连接被重置!”

“对不起,连接被重置了”这句话很多翻墙党应该很熟悉,很多人就是从这开始意识到墙的存在了,当然也有不少人以为这只是网络暂时故障甚至从自己身上找原因(小白可以理解)。

到底是怎么一回事呢?

这得从TCP说起。TCP[1](Transmission Control Protolcol,传输控制协议)是传输层的一个重要协议,TLS[2]就以TCP为基础。没有TCP,就没有我们现在的互联网。

TCP某种程度上来说比IP还要重要:TCP提供的是面向连接的可靠服务:所谓面向连接就是指在两个主机之间建立一个虚电路(可以理解为虚拟的专线),所有的数据都沿着虚电路传递(不会说有哪些数据中途选择了别的路径);而可靠指的是保证先发送的数据包一定是先到达目的地的,而且如果数据包中途损坏或丢失,那么TCP就会重传数据包,一定要把数据包送到目的地。TCP处理的数据包被称作报文,由头部和用户数据组成,而头部组成中有一个很重要的部分就是控制标志(当然还有大家很熟悉的端口了,端口是传输层的概念),下面会介绍。

面向连接,可靠,谁都喜欢。事实上一开始的传输层只有TCP,UDP和其他都是后来加上去的。论速度,TCP比不过UDP,这是由协议原理决定的,因为UDP是无连接的……
咳咳,我们还是先看看到底TCP是怎么一回事吧:

大家猜一猜TCP连接是怎样的呢?就假设A是客户端,B是服务器端,那么这一连接会怎么建立呢?“当然是A直接传送数据给B了!”

错了!首先要建立连接:B在此之前就要做好建立连接的准备,被动监听连接,然后A发起连接了:

1,首先,A发送一个控制标志为SYN( synchronous的缩写,意思是同步,用途也的确是同步:A选了一个随机数作为第一个序号并发给B)的报文段给B;

2,B接收到之后,就发送一个控制标志为SYN+ACK报文段(实际操作的时候是把这两个标志段置为1,ACK是acknowledgement 的缩写,意思是确认)给A,同时序号加1;

3,A再发送一个控制标志为ACK的报文段给B(序号不变),然后连接就建立了!通常这三个报文段都不传输任何用户数据的。

这段过程被称作three-way handshake(三路握手),用来打开并初始化连接同步客户端与服务器端,是必须的。然后就可以开始传送数据啦!

因为TCP是可靠的,所以当A发送了一个报文之后,B接着发回的报文会进行确认(ACK啊,同时随着数据的传输,序号不断加1),就这么把数据传输下去。TCP是全双工的,这意味着这一个连接中可以同时传递两个方向的数据。

“啊,我要终止连接了!”“很好,那就接着进行三路握手吧!只是要把SYN换成FIN(finish,结束的意思)。”

”那个,这是正常结束,如果说出现了一些异常情况该怎么办啊?比如说,客户端或服务器端在连接建立之后很久都没反应,还有就是客户端请求了一个不存在的端口之类的,或者有什么其他异常发生让我想要终止连接,这时候总不能握手了吧?(特别是如果有一方掉线了,怎么握手结束啊!)“

”我们今天的主角就是负责干这事的。嗨,RST(reset,重置的意思)!“”大家好,我是RST,跟前面出场的SYN和ACK等人都是控制标志。只要我被客户端或服务器端接收到,那么连接就会马上被终止了,而且发出我的主机也会马上终止连接。“

一块板砖飞上台。”谁啊?为什么袭击我?“”老实交代,你他妈跟GFW是什么关系!连接被重置,连接被重置,连接被重置……老子他妈想找个资料看个WIKI都不行,这都是你干的好事吧!“”喂喂,这可不怪我,GFW滥用我之前可没有经过我的同意!说到底还是IPv4[3]太不可靠了,结果搞得GFW可以轻易伪造我,再分别伪装成服务器端和客户端把我发送给墙内的客户端和墙外的服务器端,直接把连接终止了。“

”越来越糊涂了:你的可靠性不能靠高层协议保证吗?“”废话,当然不能了,用户数据打包的时候是从最高的应用层一层层包裹处理下来,最终由物理层协议送出去,GFW在网络层动手脚,你说被包在里面的高层协议有没有办法?对了,别误会,用户数据的加密是不会受到任何影响的,本机上完成加密之后在传输过程中就没有人能动用户数据了。“”那TCP是怎么把连接变得可靠的?“”很简单,发现后来的报文来了可之前的报文没有到达(根据序号判断)或损坏的时候,命令重传,同时不处理之后的报文,等报文正确传回之后再重新排序,一定要让先发送的先到达。“”……好吧,这样也行。“

这么说吧,IPv4没有任何身份认证机制,这导致GFW可以轻易伪造一个控制标志为RST的报文,然后分别发送给客户端和服务器端。你知道的,GFW大部分部署在国际出口的旁路上,当监测到关键字的时候就会启动RST报文的伪造和发送。明文的URL和HTTP get数据包中的关键字都会触发这种机制,还有一些网站是只要你试图连接就会触发RST。[4]而且GFW还会连着发一大堆RST包,生怕你接不到呢:)

”妈的,原来是这样!该死的GFW,越来越高了,究竟怎么样才能推倒它呢?“
”……我也不知道,不过我想翻墙党中应该有人会有答案吧。TCP很复杂的,这次不过是简单说说,有空再仔细聊聊吧!“

下一篇,看看该死的GFW是怎么过滤HTTP明文数据包的吧!

科普文链接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

参考资料:
1,https://en.wikipedia.org/wiki/Transmission_Control_Protocol
2,SSL/TLS的原理以及互联网究竟是如何工作的(3)
                                    ————TLS的专场!
https://plus.google.com/109790703964908675921/posts/NwWoGQ9mcDY
3,SSL/TLS的原理以及互联网究竟是如何工作的(6)
                                                                    ——嘿,我是IP!
https://plus.google.com/109790703964908675921/posts/8GLWQxp5yJN
4,翻墙路由器的原理与实现
https://docs.google.com/document/d/1mmMiMYbviMxJ-DhTyIGdK7OOg581LSD1CZV4XY1OMG8/edit

原文:https://plus.google.com/109790703964908675921/posts/Hwcm9QURSYh

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s