网络那些事:浏览器、网络协议以及常见软件
0.前言
你是从什么时候开始接触网络的呢?十年前的人们大多数是从PC和网吧开始的,如今的人们几乎都是从手机和WiFi开始的。浏览器、社交软件和购物软件等已经成为绝大数人的标准配置。
2017年,互联网之父伯纳斯·李因“发明万维网、第一个浏览器和使万维网得以扩展的基本协议和算法”而获得2016年度的图灵奖。网络改变了人们的生活,成为我们不可或缺的一部分。
本篇将从浏览器开始,以HTTP为例子,通过WireShark软件介绍网络协议和数据传输,为后面博客要介绍的网络爬虫做铺垫。
1.浏览器那些事
最流行的网络浏览器是Google Chrome,Microsoft Edge(之前是Internet Explorer,简称IE浏览器), Safari,Opera和Firefox。浏览器最重要的浏览器内核,又称为浏览器引擎,比如IE浏览器的内核Trident,火狐的内核Gecko,以及已经废弃的Opera内核Presto,然后就是一大堆WebKit内核的变体。WebKit开源算是苹果做的一件好事,另一个是Clang/LLVM。
WebKit产生了很多分支,除了具体的浏览器外,一些支持RIA的语言和框架也提供了WebKit的封装,C++有QtWebKit以及谷歌的CEF框架、Java中JavaFX的WebView。谷歌在WebKit的基础上,弄出了Blink内核,还自己做了一个JavaScript引擎V8。然后,在V8的基础上产生了Node.js,极大的改善了JavaScript的开发生态圈。
此外,HTML5技术和WebGL技术的引入丰富了浏览器在多媒体和3D渲染方面的功能,加速了落后技术如Flash的淘汰过程。
2.网络协议那些事
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。一般的说法是,OSI七层与TCP/IP五层,而TCP/IP承担当今互联网上的绝大部分数据传输任务。
关于网络协议的第一手资料来源IETF组织制作的一系列标准文档,又称为RFC文档。实际上的网络标准非常的多,如今RFC系列文档已经达到了八千多份。这些文档可以在IETF官网进行下载。
如果官网的网速较慢,可以在香港中文大学的ftp站点上下载,http://ftp.cuhk.edu.hk/pub/doc/ripe/rfc/。
最常见的协议是HTTP协议,其基础是TCP/IP协议。HTTP的知识点可以先看一下Runoob的介绍。
首先,我们看一下浏览器通过HTTP下载HTML文件的过程,以火狐打开百度主页为例:
打开百度主页,按F12,选择网络选项,点击右侧"显示请求细节"按钮,如图所示:
可以看到HTTP的请求头和响应头。上图显示的界面又称为Web Console,几乎所有的浏览器按F12都会出来,在javascript的ide出现以前,这就是前端开发者调试javascript代码最常用的工具。
3.WireShark那些事
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
与网络协议打交道,经常要做的事情就是抓包,而最常用的抓包工具就是WireShark。Linux下常用的抓包工具是tcpdump,当然,如果是图形化的Linux也可以使用WireShark以及其命令行工具。
下载安装好WireShark后,选择对于的网卡,以HTTP协议进行过滤,进入bing主页,可以看到:
可以看到HTTP的内容,也可以看到TCP和IP的内容。但是浏览器的请求往往或产生很多条HTTP记录,不容易看清楚。用curl和wget之类的命令行工具会比较清晰。
比如用curl获去百度主页的内容: curl www.baidu.com
不过内容不是我们想要的,与浏览器不一致,原因是百度的服务器检测到了User-Agent字段。
先使用 curl -v www.baidu.com 查看请求头,代理为curl/7.53.1:
$ curl -v www.baidu.com * STATE: INIT => CONNECT handle 0x20048360; line 1418 (connection #-5000) * Rebuilt URL to: www.baidu.com/ * Added connection 0. The cache now contains 1 members * Trying 119.75.217.109... * TCP_NODELAY set * STATE: CONNECT => WAITCONNECT handle 0x20048360; line 1471 (connection #0) * Connected to www.baidu.com (119.75.217.109) port 80 (#0) * STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x20048360; line 1588 (connection #0) * Marked for [keep alive]: HTTP default * STATE: SENDPROTOCONNECT => DO handle 0x20048360; line 1606 (connection #0) > GET / HTTP/1.1 > Host: www.baidu.com > User-Agent: curl/7.53.1 > Accept: */*
我们可以将User-Agent置为空,再请求一次: curl --user-agent "" www.baidu.com ,这一次得到了一致的内容。
另外,wget查看请求头和响应头: wget --debug --spider www.baidu.com ,加入user-agent信息: wget -U www.baidu.com 。
未完,待续。。。