事情是这样的,Emacs这款编辑器可以安装插件。这些插件既可以通过本地文件
安装,也可以通过类似GitHub的在线仓库下载安装。使用list-packages就能列
出仓库里有的插件。因为载入的本地缓存,所以要想得到最新的列表,就需要执
行refresh命令。
遇到的问题就是,执行refresh命令之后,状态栏一直显示“Contacting host
melpa.org:443”。
折腾
我条件反射地认为,melpa.org被墙了,立马给Emacs加上proxy。然而还是一直
Contacting。最后我各种尝试,从终端启动Emacs,给系统启用全局代理,尝试
安装不同版本的Emacs。分析执行过程的message,启动debug模式。
都没有得到解决,甚至还给packages.el报了bug。社区的人都很热心,回答我的
是一个日本友人,然而还是没有得到解决。搞了一天多,搞得我都有点心烦,甚
至考虑要不就用Atom或者Vim算了,不折腾了。
醒悟
由于最初以为是被墙了,所以详细研究了一下梯子技术。DNS污染,IP封锁,DPI,
这些高大上的名词确实很长见识。也突然意识到,在程序的世界里,1就是1,0就
是0,没有任何事情是魔法。网络连接也一样,底层都有迹可循的,No Response
也会状态显示的。
所以为什么不抓取Emacs与melpa之间的数据包,看一下,到底是程序的问题,还
是网络的问题。
抓包
这是我认为有问题的抓包结果
这是在windows下正常工作的抓包结果
第一遍我也没看懂这些东西到底在说什么,慢慢查文档还是搞懂了,顺带搞懂了
ip,tcp,http的区别。
互联网传输的基本单位是IP Packet,client与server之间的共同语言(协议)叫
做tcp,http。第一个包SYN,意思就是client想与server建立连接。ACK是回应,
到底准不准。这套握手,回应叫做tcp。连接建立成功后,client说,我们换种
语言吧,用http交流吧。然后用http说,我想要插件列表。直到收到finish包,
此次会话就算结束了。
结论
仔细对比,两个抓包结果。发现行为都差不多,最后都正常finish了。所以我得
出一个坑爹的结论,其实refresh这个命令是成功执行了,但是状态显示没有改
变。windows下的Emcas版本是25,linux下是24.5。
虽然结论很坑爹,但是顺带学会了怎么抓包和粗浅的tcp协议还是算有所收获。