1700509050
1700509051
(3)当连接建立以后,Client通常会直接把要传递的数据通过这个五元组描述的连接传输给Server,传输完成后关闭连接。
1700509052
1700509053
关闭的过程叫作“四次挥手”,过程如下。
1700509054
1700509055
(1)Client对服务器发送FIN包,表示Client不再有任何数据要传递给Server。
1700509056
1700509057
(2)Server对Client回复ACK包,表示Server已经收到了Client发来的FIN包,但此时Server还可以通过这个连接向Client发送数据。
1700509058
1700509059
(3)Server对Client回复FIN包,表示Server没有数据要传递给Client了。这个时候,作为线上服务器,Server通常可以在没有收到Client最后发来的FIN包的情况下直接关闭连接,回收连接所占用的内存资源。
1700509060
1700509061
(4)Client对Server回答ACK包,表示Client收到了Server最后发来的FIN包,正式关闭连接。
1700509062
1700509063
之所以称为短连接,是因为这样的过程耗时极短。通常在手机、PC终端发起一次HTTP请求,报送数据的量以几百字节(B)到几十千字节(KB)居多,所以,从建立连接,到发送数据,再到连接断开,大概要经历几十毫秒到几秒不等,主要开销是在网络上传输的延迟。这种短连接的报送方式最为普遍,网页上常用的GET方式和POST方式的请求就属于短连接。这种连接适用于高并发的短小访问,例如单条日志的报送。
1700509064
1700509065
2.长连接
1700509066
1700509067
顾名思义,长连接的连接时间较长。它和短连接的区别在于,在三次握手之后,通常要进行不断往复的数据交互,即在连接建立后,Server和Client之间会一直保持着这个连接,并通过这个连接相互发送数据。
1700509068
1700509069
从功能上来说,长连接的好处是连接断开之前Server能在任意时刻向Client发送数据信息,这个功能是短连接不具备的,好处显而易见。而且,再次从Client向Server发送消息也不用进行三次握手。我们平时用的QQ、微信等各种IM工具都要至少拥有一条基于长连接的连接来保持信息往返的畅通。
1700509070
1700509071
当然,长连接也有它的缺点,就是对Server和Client的内存都有一定的占用——因为要维护这条连接是需要内存保存信息的。而对于可以同时容纳数十万长连接的Server来说,内存占用当然就更为明显。从工程经验角度来看,大部分服务器上的轻传输业务的长连接通常只占用1KB到4KB不等的内存,具体占用的大小与内核设置有关,也同时与长连接上传输的内容多寡有关。具体占用的情况可以在实测时用free命令(Linux命令)查阅。
1700509072
1700509074
12.2.6 消息格式
1700509075
1700509076
对于一种已经定制好的日志来说,把日志信息原原本本报送给服务器就可以了,通常不需要进行太多其他处理。但是,如果这种数据收集具有比较大的自主性,甚至在收集数据的生命周期中还需要进行不定时的修改,这个时候就要下点功夫设计整个数据收集的逻辑了。按照我的经验,一般需要注意两点。
1700509077
1700509078
注意点1:报送格式尽量采用Key-VaIue键值对的形式
1700509079
1700509080
这种形式的好处是格式清晰,可扩展性高,Key和Value一一对应,在报送到服务器的时候方便进行切割和对应归档。而且,如果需要进行删减或者增补,只要直接删减或者增加键值对就可以了。
1700509081
1700509082
在处理HTTP Web请求时使用的GET方式就是一种非常典型且非常好用的键值对方式。以“https://www.baidu.com/s?wd=vgg19&rsv_spt=1&rsv_iqid=0xf5ddc0c10008f89b&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=6&rsv_sug1=5&rsv_sug7=100”这个URL为例,“https://www.baidu.com/s”是服务器的地址和虚拟路径,“?”表示其后都是GET方式的键值对。这些键值对之间用“&”分割,键值对内部用“=”分割,内容清晰。Web服务器只要对这个URL进行解析,就可以把所有要报送的值都接收下来。
1700509083
1700509084
wd=vgg19&rsv_spt=1&rsv_iqid=0xf5ddc0c10008f89b&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=6&rsv_sug1=5&rsv_sug7=100
1700509085
1700509086
使用Web服务器接收数据时也可以采用POST方式,其接收方式与GET类似,但发送的数据量更大,在此就不赘述了。只补充一句:在这个环节,不论是GET方式还是POST方式,都有一些传输非ASCII字符的场景。在这些场景中,会考虑使用Base64编码进行传输,然后在接收端进行解码(如图12-7所示)。Base64的编/解码方式是开源的,在Java、Python等语言中都有很成熟的实现类。Base64编码不是用来加密的,而是用来实现二进制到文本的传输。
1700509087
1700509088
1700509089
1700509090
1700509091
图12-7 Base64编码
1700509092
1700509093
注意点2:自举要方便
1700509094
1700509095
所谓“自举要方便”,是指在终端采取的数据收集策略要比较灵活,要允许在几乎任意时刻对收集策略进行修改。这种方式很容易实现,可以从两个地方入手,一个是终端自身的自举程序,另一个是策略文件。
1700509096
1700509097
自举程序像PC硬件的自举一样,有一种约定的标准启动方式。
1700509098
1700509099
PC的自举过程是:在启动时先读BIOS,再按顺序读取BIOS中“1st Boot Device”、“2nd Boot Device”、“3rd Boot Device”这些设备的启动扇区,通过启动扇区里面的程序指针完成一系列自举的程序段跳转,最后引导计算机系统启动(如图12-8所示)。如果没有这样一个“雷打不动”的约定步骤,计算机系统是不可能启动的。
[
上一页 ]
[ :1.70050905e+09 ]
[
下一页 ]