揭秘网络通信的运作机制

发表时间: 2020-08-13 06:47

大家好,我们今日讲解"网络通信过程的解读",这节内容是"VBA信息获取与处理"教程中第七个专题"VBA与HTTP网络通讯"的第二节。由于涉及到文章的审核相关问题(设计到一些网址的话审核通过十分困难),关于网抓的内容在平台上发表的不全,平台发表的代码有些运行不了,这是因为缺少某些自定义函数的过程,在其他的章节中。如果有需要学习网抓的朋友可以联络我分享这套教程。其中的程序文件是非常值得拥有的代码源码。

第二节 网络通信过程的解读

大家好,在一讲中,我讲解了网络通信的一些概念及网络通信的实现的步骤,在这一讲我们来解读网络通信的具体过程,了解一下网络通信的请求和响应是如何实现的。

1 网络通信中客户端请求阶段

为了更好的给大家讲解网络通信的过程,我在360浏览器中要直接进行网址的搜索

为了更好的给大家讲解,我利用了一个抓包的软件得到了我们客户端对服务器的请求如下:

GET HTTP/1.1

Host:

Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

Cookie: __guid=208989332.4442495301675265000.1591451028570.9978; monitor_count=1; home4399=yes;UM_distinctid=17289df92b6561-0048d5baa4a47b-4e4c0d20-100200-17289df92b71d;CNZZDATA30039538=cnzz_eid%3D1989079887-1591447571-null%26ntime%3D1591447571; Hm_lvt_334aca66d28b3b338a76075366b2b9e8=1591451030

If-None-Match: W/"5edaf3e5-29b9a"

If-Modified-Since: Sat, 06 Jun 2020 01:39:49 GMT

上述截图:


内容的讲解:


1)首行的HTTP方法,就是请求的方法。常用的就GET和POST。

GET是索取数据的请求,要求服务器返回URL指定的文档内容,或返回URL指定的数据处理过程的结果所指向的文档,是最常见的。

POST是向服务器提交数据的请求,要求服务器接收并利用随附的消息主体的数据,来执行某个程序或获取文档,通常用于浏览器向服务器发送表单数据,例如提交注册信息,或者进行数据查询等。

所以,如果采用GET方式,一般消息主体为空,采用POST方式的话,一般就有相应的消息主体。

请注意,并不意味着采用GET方式就不能携带数据了,URL是可以携带我们需要传递给服务器的参数的。可有多个参数,用"&"符号隔开,每个参数的名和值用"="符号隔开。

那既然GET方式也可以携带参数,那两者区别又是什么呢?一是安全性,GET方式参数就在URL,提交的是密码等私密资料就不合适用GET;二是,GET方式提交的数据最多只能有1024字节,而POST则没有此限制。三是,GET一般不能改变服务器的数据,而POST可以改变服务器的数据,例如注册了个用户,服务器就多了数据条目。

2)Host字段:该字段指定请求资源的Intenet主机和端口号,即URL的域名部分,HTTP/1.1请求必须包含该字段。

3)User-Agent字段:该字段的内容包含发出请求的用户信息(浏览器和系统等消息)。

4)Cookie字段:这是比较重要的请求头信息之一

5)If-Modified-Since字段:所请求的页面在客户端的缓存中的最近更新时间;

6)If-None-Match字段:后面储存的是客户端读取的缓存中页面的缓存检验值


特别提示,发包的整个过程,例如消息主体,都不支持英文和数字以外的字符,如果要写入中文或特殊字符,就需要URLENCODE的函数进行转码了。

urlencode是一个函数,可将字符串以URL编码,用于编码处理,URL编码(URL encoding),也称作百分号编码(Percent-encoding), 是特定上下文的统一资源定位符 (URL)的编码机制。将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

2 网络通信的服务器响应阶段

当我们发送请求后,服务器处理完我们的请求,就会向我们的浏览器,发送响应消息了。我们看看上面请求的响应:


HTTP/1.1 304 Not Modified

Date: Sat, 06 Jun 2020 13:44:06 GMT

Content-Type: text/html

Connection: keep-alive

Expires: Sat, 06 Jun 2020 10:20:10 GMT

Last-Modified: Sat, 06 Jun 2020 01:39:49 GMT

ETag: "5edaf3e5-29b9a"

Cache-Control: max-age=1800

Age: 14028

X-Via: 1.1 CSP-129514:10 (Cdn Cache Server V2.0)

X-Ws-Request-Id: 5edb9da6_CSP-129514_16864-31796



下面我们来解读一下上面的数据:

1) 状态行 = HTTP协议 [空格] 状态码 [空格] 状态解释 [回车换行],状态码常见的就是,200成功、400错误请求(一般我们是发送的请求有问题)、500服务器错误。上面的值是304,我在下面有讲解。

2)Content-Type:表示后面的文档属于什么类型;

3) Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它。

4) Last-Modified:文档在服务器上最后更新时间。同缓存一起保存这个值,当再次访问该页面,在请求的头部字段的If-Modified-Since中再次携带这个时间值发送至服务器,如果服务器此时的文档更新时间晚于该时间,返回新页面数据,否则返回一个304(Not Modified)状态,并加载缓存数据进行显示;

5) Set-Cookie: 服务器向客户端发送的cookie。

6) ETag:一段文本,一般也是用于缓存是否更新的判断的校检值,当首次访问页面时候,获取这个值,同缓存一起保存,当再次访问时候,请求阶段的If-None-Match字段就会再次携带这段校检值发送至服务器,服务器判断ETag校检值是否变化,变化则返回新的页面数据,无变化则返回304,读取缓存数据显示。

3 Cookie、Session与Cache(缓存)

网络通讯是静态的,http协议是无状态的。它对于我们之前的所有通讯都没有记忆能力。那出现的问题是,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,就难以验证用户的权限和登录问题。于是,两种用于解决机制就产生了,就是Cookie和Session。还有就是利用Cache可以减小重复数据的下载。

1)Cookie 是通过客户端记录通讯情况,其是由服务器发给客户端的特殊信息,以文本文件的方式存放在我们的电脑上,然后我们的浏览器每次向服务器发送请求的时候就会带上这些特殊的信息。例如,当我们登录网站时,服务器会发送一段cookie给我们,这就是我们在上面的响应阶段所说的Set-Cookie头部字段的功能,后续的通讯,在请求阶段,就会使用cookie请求字段,发送这段文本,服务器收到了这段文本,就知道我们已经登录了。

2)Session 它是通过服务器来记录通讯情况。Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。当我们的浏览器首次访问或者登录服务器时,服务器就创建一个session,服务器会为该Session生成唯一的Session id,这个session id将从URL或者从cookie返回客户端,以后的HTTP请求,从cookie或者URL附上Session id,服务器接受到请求之后就会依据Session id找到相应的Session,这样,用户的状态也就记忆了。

3) Cache缓存 保存在客户端上的。当我们首次访问某个页面时,浏览器会自动保存这个页面的部分内容,例如html页面,图片等,当下一次再次访问时,缓存直接使用之前保存的数据响应访问请求,而不是向服务器再次发送请求。这样大大的节约了访问的时间。客户端首次访问服务器后,服务器会返回该页面的Last-Modified或ETag字段值,客户端将该页面数据保存在cache中,并记录这两个属性。当客户端再次访问这个页面,请求阶段的消息,会在If-Modified-Since(对应Last-Modified)或If-None-Match(对应ETag)两个字段中携带之前在cache中保存的Last-Modified或ETag的属性值。服务器通过判断这个两个属性,判断页面是否发生变化,如无变化,客户端不需要重新下载,返回304响应。


以上就是整个网络通信过程的基本过程,大家可以慢慢理解。


本节知识点回向:


网络通信的过程是怎么样的?每个阶段有哪些数据的传输?什么是Cookie?什么是Session?什么是Cache?作用是什么?

积木编程的思路内涵:

在我的系列书籍中一直在强调"搭积木"的编程思路,这也是学习利用VBA的主要方法,特别是职场人员,更是要采用这种方案。其主要的内涵:

1 代码不要自己全部的录入。你要做的是把积木放在合适的位置然后去修正代码,一定要拷贝,从你的积木库中去拷贝,然后修正代码,把时间利用到高效的思考上。

2 建立自己的"积木库"。平时在学习过程中,把自己认为有用的代码放在一起,多积累,在用到的时候,可以随时拿来。你的积木库资料越多,你做程序的思路就会越广。

VBA的应用界定

VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!

我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程:

第一套:VBA代码解决方案 是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,初学必备;

第二套:VBA数据库解决方案 数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。

第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。

第四套:VBA代码解决方案之视频 是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程的视频讲解,听元音更易接受。

第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。

第六套教程:《VBA信息获取与处理》是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。

大家可以根据以上资料1→3→2→6→5或者是4→3→2→6→5的顺序逐渐深入的逐渐学习。教程提供讲解的同时提供了大量的积木,如需要可以WeChat: NZ9668


学习VBA是个过程,也需要经历一种枯燥的感觉

如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。这些教程也是为帮助大家起航,助上我自己之力,我的上述教程是我多的经验的传递,

"水善利万物而不争",绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。

每一分收获都是成长的记录,怎无凭,正是这种执着,成就了朝霞的灿烂。最后将一阙词送给致力于VBA学习的朋友,让大家感受一下学习过程的枯燥与执着:


浮云掠过,暗语无声,

唯有清风,惊了梦中啼莺。

望星,疏移北斗,

奈将往事雁同行。

阡陌人,昏灯明暗,

忍顾长亭。

多少VBA人,

暗夜中,悄声寻梦,盼却天明。

怎无凭!


回向学习利用VBA的历历往事,不胜感慨,谨以这些文字给大家,分享我多年工作实际经验的成果,随喜这些有用的东西,给确实需要利用VBA的同路人。


分享成果,随喜正能量