600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 一个优秀架构师必须掌握的底层技术之网络协议与分析工具

一个优秀架构师必须掌握的底层技术之网络协议与分析工具

时间:2019-05-28 16:39:18

相关推荐

一个优秀架构师必须掌握的底层技术之网络协议与分析工具

前文我们介绍了计算和存储相关的底层技术(《优秀架构师必须掌握的底层技术之计算性能优化》),接下来我们介绍网络相关的技术。这两部分内容非常多,如果想短时间内全部掌握是不可能的事情,我们需要有策略的学习,先掌握最常使用和最有价值的,然后逐步扩大范围。

随着互联网的发展,网络就像水和电一样无处不在。现在普通用户到一个地方之后先不管其它事情,首先找有没有免费的WiFi,这样说明了网络的普及情况。自然,网络技术也成为软件开发人员必须熟悉的内容之一。无论你是做前端开发,还是做后端开发,都离不开网络技术。

网络技术相关的内容非常多,多到我们都数不清。从网页制作到服务端开发,从网络协议到系统API,从网络设备到工程组网,范围实在太广,内容实在太多。但是,分析问题要抓住根本,我们作为开发人员,其实最主要的是TCP/IP协议,进而是HTTP协议(如果涉及Web开发)。

我们还是回到上一篇文章中提到的那个网络问题上来。现在将问题内容摘抄在下面:

一个Web服务在崩溃重启时无法绑定网络地址,API报错(socket_bind(): unable to bind address [98]: Address already in use),进而导致服务重启失败。

TCP/IP协议快速掌握

在解答这个问题之前我们先复习一下关于TCP/IP协议的知识。TCP/IP协议是网络协议的一种,也是最为成熟和应用最为广泛的网络协议。所谓网络协议其实就是计算机与计算机之间交流的语言,这个与人之间交流的语言(例如汉语或者英语)是一致的。人与人之间如果没有语言就无法交流,计算机也是如此,因此人们发明了计算机之间交流的语言,也就是网络协议。TCP/IP协议是众多网络协议中的一种。

TCP/IP协议是一个协议族,它包含了从物理设备的尺寸规格到网络数据包格式等方方面面的规定。为了便于协议的设计和实现,协议在指定的时候实行了分层模型,也就是我们常说的四层网络协议(这部分参考《TCP/IP详解 卷1》),也有认为是五层的(将链路层分为数据链路层和物理层,这部分参考《计算机网络-自顶向下方法与Internet特殊》一书)。关于网络协议的分层及具体协议实现参考下图。其中,最左侧的是OSI定义的七层模型,中间是四层TCP/IP模型,而最右侧的则是每层的协议实现实例。

图1 网络协议栈

TCP协议用途比较广的原因是它是面向连接的协议,它可以保证数据有序,正确的到达交互方。TCP的连接并不是一个实实在在的物理连接,而是一个虚拟的逻辑连接。简单的理解就是在协议软件里面标记了我当前在跟某某通信,当前我们的状态是什么样的等等。这样,通过这些状态和信息就能保证数据的有序性和完整性。

图2 TCP状态转换图

如上图就是TCP连接的状态转换情况,我们这里并不进行详细介绍,后续会专门介绍。在这里大家能理解当有不同的触发条件的时候,连接的状态就会发生变化即可。比如建立连接的时候会发生各种变化,断开连接的时候也会发生各种变化。

废话之后,我们回到最开始的问题上来。Web服务是基于HTTP协议的,而HTTP协议则是基于TCP协议的应用层协议。我们可以通过一个简单的TCP程序进行模拟。TCP通信是一个CS(客户端-服务器)模型,需要客户端发起请求与服务器建立连接。

图3 TCP通信模型

我们开发一个简单的服务端和客户端代码(避免文章内容太乱,具体代码这里就不贴了,需要的同学请私信: socket)。通过ssh连接运行代码的计算机(可以使用虚拟机),用多个终端分别运行服务端和客户端程序。连接建立成功后,通过Ctrl+C中断服务端,然后重新运行就会发现程序报错如图4所示。

图4 服务端程序错误

可以看出,这个问题就是我们在文章一开始描述的问题。奇怪啊,我们的程序已经退出了啊,为什么还会占用这个地址呢?这是因为套接字文件描述符在操作系统内核中就是一个分配的数据结构内存实例,当我们中断服务的时候,在协议层面并不会马上结束这个连接,这个内存实例也就不会马上释放。所以,当我们启动服务的时候,内核中发现相同IP地址和端口的实例已经存在,从而给用户层报地址已经使用的错误。

图5 服务端中断前后连接状态

为了更加清楚的了解这些细节,我们用netstat工具看一下连接的状态,图5中红色方框的连接是服务端程序退出前连接的状态,绿色是程序退出后连接的状态。其中大写字母的字符串(ESTABLISHED和FIN_WAIT2)是连接的状态,通过对比可以看到状态发生了变化,但并没有消失。因此,也就出现了所谓的地址被占用的报错。

网络相关的工具

网络协议软件通常是在操作系统内核当中,如果不借助工具,对于我们来说就是一个黑盒。前文我们已经提到了netstat工具,本小节将给大家介绍一下常用的网络相关的工具。网络相关的工具很多,大致分为3类,分别如下:

系统监测类:系统监测类用于查看操作系统中网络套接字状态、设备和配置信息等。

性能类:进行网络链路的性能测试或者性能监测。比如测试网络链路最大带宽等。

协议分析类:捕获网络传输的数据包,分析协议流程或者异常数据包等

由于工具比较多,且本文篇幅有限,本文选择性的结合实例介绍几个常用的工具(如果想了解其它工具,请在下面留言,本号根据留言情况专门介绍)。

netstat工具

前面我们已经使用过这个工具,这个工具的功能非常强大,也是网络最常用的工具之一。netstat的原理是从内核中获取数据,并直观的呈现给用户。其实我们还有另外一种获取内核网络信息的渠道,就是通过proc文件系统,只不过这种方式不够友好。

比如我们通过netstat获取当前系统中监听套接字的列表及进程名称,可以通过如下命令获取。

netstat -tlpn

该命令中用到的选项的含义分别如下:

-t 针对TCP协议

-l 表示显示监听状态(listening)的套接字

-p 表示显示应用程序(PID/Program)的信息

-n 表示不进行地址转换,也就是直接显示IP地址

执行该命令后的显示结构如图6所示。

图6 当前服务器监听信息

前面我们也说了,这部分信息也可以通过proc文件系统获取。具体方法是通过cat /proc/net/tcp 即可获取到。大家可以自己试一下,本文就不贴图了。

netstat还可以查看网络接口(网卡)的数据包情况,比如一共传输了多少数据包、多少错误数据包和丢弃数量等等内容。可以通过执行如下命令获得上述信息:

netstat -i

下面这张图是执行该命令后的结果。

图7 物理接口数据统计

该命令的功能还有很多,本文就不再啰嗦了,更多更能大家可以自行探索一下,应该会有很多收获。

tcpdump和Wireshark工具

这两个工具的作用是一样的,都是用于实现网络抓包。在某些没有GUI界面的情况用tcpdump更多一些。而Wireshark则通常在有用户界面的情况下使用,而且该工具是跨平台的,在Windows和Linux都可以使用。比较有意思的地方是,tcpdump抓获的数据可以通过Wireshark打开查看。

用我们上面的那个测试程序举一个简单的例子,比如TCP的三次握手的数据包。启动服务端程序,然后在该节点启动tcpdump进行监控,具体命令如下:

tcpdump 'tcp port 12345' -w test.log

这句命令的具体含义是监听tcp的12345端口,并将抓获的数据写入test.log文件当中。

完成这些准备后,我们就可以启动客户端的程序了。当完成建立连接的过程后,我们把tcpdump停掉。用Wireshark打开刚才tcpdump记录数据的文件。

图8 Wireshark截图

上面的图用手机看可能比较费力,我们看一下它的局部图。从这个局部图中可以看出一共有三条消息(三次握手),其中类似[SYN]的字符则表示消息的类型。

192.168.142.128 服务端地址,端口号为12345

192.168.142.1 客户端地址

图8 Wireshark数据局部截图

通过上面数据可以非常清晰的看到TCP三次握手的过程。当然,在这个软件界面中的其它地方还能看到完整的二进制数据,也就是数据包的全部内容。

网络相关技术需要学习的很多,但总结起来无非两点:一个是需要根据自己的情况学透网络协议;另外一个就是熟练使用相关的工具,毕竟“工欲善其事,必先利其器”嘛。有了这个神奇工具,再加上我们对TCP/IP协议的理解,相信什么网络问题都可以搞定了。大家应该很开心吧,哈哈。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。