Tag Archives: Network
Google 将在今年 12 月的 ACM CoNEXT 会议上发表他们在改善 Web 应用响应时延方面的一个工作,通过修改 TCP 协议利用三次握手时进行数据交换的“TCP Fast Open”。虽然 paper 是两天前才释出,但相关的 RFC 草案则早在 2011 年 3 月份就提交到了 IETF,并且在两周前进行了一次 UPDATE,这里是 DIFF。
对于 TCP Fast Open 方案的内容,淘宝的一个朋友已经根据 RFC 草案进行了解读。我就不再赘述,感兴趣的朋友可以去看 paper 或者 RFC。我这里只是想讨论一下这个东西的应用前景。
由于对背景并没有做深入了解,我相信已经有很多人尝试去做过类似的工作,但我想类似的工作应该没有得到过大规模的应用。对于已经成型很久很久的 TCP 协议,让人很难有修改它的欲望,因为改那么底层的东西意味着很多很多的麻烦。
但是是否愿意付出代价,有一个前提是有没有足够的好处。TFO 给出的好处是:在 RTT (Round Trip Time) 比较低时,客户端页面加载时间优化大约在 4%~5%;RTT 越长,好处越大,平均大约在 25%。
除了页面加载变快改善了用户体验之外,TFO 给服务器端也带来了一些好处。由于每个请求都节省了一个 RTT,相应地也减少了服务器端的 CPU 消耗。paper 中给出的数据是每秒事务数由 2876.4 上升到 3548.7。
虽然 paper 中大部分时间在强调 TFO 对 web 页面加载的显著加速作用,但我认为即使 TFO 能成为互联网标准,它目前的状态离成为标准还有很长一段距离,因而在短期内它是无法影响到主流互联网世界的。但这并不意味着它没有机会,依小弟的愚见,目前它的推广应用可能有两个方向:
1. 移动互联网。移动互联网的 RTT 目前远大于传统互联网(常理推测,需数据支撑),因而一个 RTT 节省的效果无法被忽视;另外移动互联网终端操作系统多样化,不像桌面终端系统那么单一。 Google 自己就掌握着其中一个很重要的 android,百度也计划推出自己的“易平台”。这些互联网公司有动力去改善移动用户访问自身网站的用户体验。
2. 互联网企业数据中心。虽然数据中心内部访问时延很低,但对于典型的请求/响应的服务而言,减少一次 RTT 带来的好处还是有吸引力的,最起码能减少计算能力浪费和增加吞吐吧。再加上很多企业内部使用的都是定制的开源操作系统和定制的网络库,升级的代价并不是那么高。如果我是企业基础设施的负责人,我想我会很慎重地考虑这个方案的。
在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开请求,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。
对这个现象深入分析后发现,这是一个基于 epoll 的连接池实现上的问题,或者说是特性 :)
首先解释一下导致这个现象的原因。
在使用 epoll 时,对端正常断开连接(调用 close()),在服务器端会触发一个 epoll 事件。在低于 2.6.17 版本的内核中,这个 epoll 事件一般是 EPOLLIN,即 0x1,代表连接可读。
连接池检测到某个连接发生 EPOLLIN 事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样一来,上层尝试在对端已经 close() 的连接上读取请求,只能读到 EOF,会认为发生异常,报告一个错误。
因此在使用 2.6.17 之前版本内核的系统中,我们无法依赖封装 epoll 的底层连接库来实现对对端关闭连接事件的检测,只能通过上层读取数据时进行区分处理。
不过,2.6.17 版本内核中增加了 EPOLLRDHUP 事件,代表对端断开连接,关于添加这个事件的理由可以参见 “[Patch][RFC] epoll and half closed TCP connections”。
在使用 2.6.17 之后版本内核的服务器系统中,对端连接断开触发的 epoll 事件会包含 EPOLLIN | EPOLLRDHUP,即 0x2001。有了这个事件,对端断开连接的异常就可以在底层进行处理了,不用再移交到上层。
重现这个现象的方法很简单,首先 telnet 到 server,然后什么都不做直接退出,查看在不同系统中触发的事件码。
注意,在使用 2.6.17 之前版本内核的系统中,sys/epoll.h 的 EPOLL_EVENTS 枚举类型中是没有 EPOLLRDHUP 事件的,所以带 EPOLLRDHUP 的程序无法编译通过。
在这个互联网已经渗透入每个角落的时代,GUCAS 的网络接入收费显得非常不合时宜:(二年级以上同学)每个月 25 元套餐,其中包括5G国内流量、2G 国际流量,国内流量超出部分按 10元/G 收费,国际超出部分按 1元/M 收费。幸好有了 IPv6 BT(IPv6 流量不计入收费流量),不然 GUCAS 的网络就是一个悲剧。
对于高年级同学来说稍微好一点的是,某些实验室会有免费的网络,还可稍解流量窘迫。但如果不下 BT、不看视频、不视频聊天的话,5G 每月也是用不完的,而且 25 元的价钱也并不便宜,所以很多高年级同学都是宿舍共用一个上网帐号。
共用上网帐号有几种方式:1> 使用路由器,这是比较简洁的方式,但是这样就无法使用 IPv6——目前的路由器一般不支持 IPv6 路由功能,因此需要使用特别的配置才能同时支持 IPv6;2> 使用代理,一台电脑作为主机,为另一台电脑开一个代理,这种方式可以使用 IPv6,但缺点是主机分配的 IP 可能变化,需要手动更新代理地址,而且部分软件并不能完美支持代理。
我这里尝试了另外一种方式,使用无线自组网共享互联网接入,只适用于两台都带无线网卡的电脑共享上网。简单点儿来说,就是让两台电脑无线网卡相连,其中一台(主机)将有线的互联网接入通过无线链路共享给另外一台(从机)。这种方案同样适用于那些家里有两台笔记本却只有一个网口的家庭,省了买路由器的钱。
注:下文使用操作系统平台为 Windows XP SP3。
首先,需要将主机的有线连接即“本地连接”设为可共享。具体方法是,在主机上右击“本地连接”,选择“属性”,进入“高级”选项卡,“选中 Internet 连接共享”中的两个复选框,即“允许其他网络用户通过此计算机的 Internet 连接来连接”和“允许其他网络用户控制或禁用共享的 Internet 连接”。
其次,将两台电脑进行无线自组网。无线自组网的建立方式根据网卡管理软件的不同可能有不同的方法,简单的来说就是建立一个两台笔记本之间的一个点到点的(不需要接入点的)无线连接。一个典型的配置是:
主机:
Ethernet adapter 无线网络连接:
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 192.168.0.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
从机:
Ethernet adapter 无线网络连接:
Connection-specific DNS Suffix . : mshome.net
IP Address. . . . . . . . . . . . : 192.168.0.27
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.0.1
需要注意的一点是,两台电脑需要在同一个 Windows 工作组中,这里两台电脑的工作组都是 MSHOME。
如果对无线自组网不是很了解,以上两步可以通过软件来进行设定。联想有一款叫做“闪联任意通”的软件,配置起来相对简单好用,用它的“共享网络”功能即可做到以上两步。但是闪联任意通有一些BUG,会造成服务占用 CPU 过高。一旦配置成功之后,记住建立的点到点网络 SSID(一般以 PAN_ 开头),以后每次两台电脑都连接至该网络即可。不再需要闪联任意通的运行。
最后,将从机有线接口的 IPv4 功能禁用,将从机无线接口的 IPv6 功能禁用。具体方法是,在从机上右击“本地连接”,选择“属性”,在“常规”选项卡中的“此连接使用下列项目”选择框中的“Internet 协议 (TCP/IP)”前的复选框去掉,确定退出;在从机上右击“无线网络连接”(也可能是其它名称),在类似于上面的位置找到“Microsoft TCP/IP 版本 6”,去掉前面的复选框。
经过上面三步之后,就可以保证从机的 IPv4 的流量会走无线接口,使用主机共享的 IPv4 互联网接入;而 IPv6 的流量会走有线接口,使用本地交换机提供的 IPv6 互联网接入。第二步建立的点到点网络会保存到无线网络配置中,两台电脑开机只要打开无线,一般就会自动连接到该点到点网络,无需再进行额外的手动修改。(即便是使用代理的同学,由于无线的 IP 不会变化,这样做也能带来不用修改代理地址的好处。)
综上,这种方式可以完美地实现共享 IPv4 接入而又不影响 IPv6 连接。
由于小弟最近上网受到诸多限制,在校时帐号爆掉,回家又没有网络可上,所以尝试了各种上网方法,也许对大家有用呢,所以下面分享及记录一下: 1. 手机作为 modem,使用 GPRS 拨号上网 这个一般受到手机版本影响,三星这方面做得非常不错。将手机使用数据线连接到电脑,打开 Samsung … Continue reading
Wireshark 是一个强大的抓包及网络分析软件,可以用来嗅探和分析多种网络协议的数据包和流,RTP 和 RTCP 也是其中的两种。 对 RTP 流的分析过程,在 … Continue reading
JPerf is the GUI frond-end of IPerf, a … Continue reading
Ubuntu 8.04 以前的 NetworkManager(nm-applet) 还差强人意,好歹还能通过它来配置一下网络。中间跳过了 Ubuntu 8.10,而新的 Ubuntu … Continue reading
最近好几个朋友都加入了一个叫做“你为什么不关掉电脑去做爱做的事”的豆瓣小组,当然,我也加入了。 也许是大学时候养成的毛病,也许是因为现在网络是免费的,我虽然不会沉迷于游戏,但却经常在该工作的时候沉迷于网络,其中典型的包括小百合 BBS、Google Reader 等。最近我想控制一下这些浪费时间的行为,就把 bbs.nju.edu.cn, reader.google.com 等这些域名在 … Continue reading
最近我的 WinXP 经常无法连接 IPV6 站点,但是 IPV6 地址的获取是正常的,同一台电脑上的 Ubuntu … Continue reading

