TCP的连接建立过程(以下节选自Wikipedia)
TCP用三路握手(three-way handshake)过程建立一个连接。

  • 客户端通过向服务器端发送一个SYN来建立一个主动打开,作为三路握手的一部分。

  • 服务器端应当为一个合法的SYN回送一个SYN/ACK。

  • 最后,客户端再发送一个ACK。当服务端受到这个ACK的时候,就完成了三路握手,并进入了连接建立状态。

    GFW如何阻断TCP连接?
    首先,连接被阻断的一个最直观表现(以Chrome为例)是显示“This webpage is not available”,如果你有兴趣点击更多那个按钮时,会发现有一行小字,类似于:

  1. Error code: ERR_CONNECTION_RESET


要说起这个RESET,就有意思了:
RESET其实TCP的报文之一,用于重置连接。例如,当服务器发现客户端请求的端口不存在、连接信息不正确或服务器意外宕机时,会给客户端返回一个 RESET报文。可见,RESET本来的功能只是为了应对一些极端情况。而GFW却利用了这一点,用来阻断客户端与服务器的连接。

GFW为何要伪装RESET而不是直接丢包呢?
显然,RESET比直接丢掉包要好。因为如果直接丢掉数据包,客户端并不知道网络的具体情况,考虑到TCP的超时重传,客户端就会不停地等待和重发——这 势必会加重GFW的负担。但当客户端收到RESET时就知道连接已丢失,从而主动放弃向服务器发送请求。可见,这种封锁方式不会耗费太多的资源而效果更 好,成本也更低。

GFW的关键词过滤
上面就是GFW阻断TCP连接的原理。接下来的话,GFW要做的工作就很简单了:关键词过滤。
大概2002年左右(够早的!!!),我们可爱的方院士在威海就搞出来了一套关键词过滤系统。
对于出现在HTTP包头的关键词(如“Host: www.youtube.com”),GFW会马上向客户端(你)和服务器(youtube)同时发送RESET,从而干扰正常的TCP连接。
其次,对于能够放行的网站(如Wikipedia)。GFW还会监控数据流,如果在数据流中发现了黑名单中的关键词(如“falun”)时,也会试图打断连接,从而会出现网页已经打开了一部分突然又告诉你了无法显示的状况。
需要注意的是,这样的封锁会长达90秒,也就是说在随后的90秒内,这个网站你就别想上去了。

总结
其实这两天楼主发现,GFW现在已经不是直接RESET了,而是先卡你个几分钟……然后丢给你个TIMEOUT,真是喜闻乐见。
虽然说GFW丧心病狂,但是不得不说,方院士还是一个很牛的人(具体可以看看方院士的那篇论文,相当有头脑)。
嘛……还有件令人担心的事情是,写这种东西不会被查水表吧?