前言
作为一名网络运维人员,熟悉TCP和UDP两兄弟是必要的。TCP与UDP是隶属于TCP/IP协议族的两员大将,从TCP/IP诞生以来经历了几十年的发展,可以这么说不管世界如何变迁、无论沧海已变几多桑田,管它传统互联网还是移动互联网,都离不开他们,现在,今后很长一段时间都离不开。
即然取名123,就不想用过多的术语来解释他们,我想通过我实际的案例来和大家一起探索门道。我们先谈谈TCP
TCP
TCP,全称Transmission Control Protocol,中文译作传输控制协议。大家每天浏览的网页,不管是用手机还是电脑打开的,均会使用TCP协议来传输数据,TCP是面向连接的协议(稍后解释)。
我们通过一个小案例来理解TCP。笔者租用过一台云服务器,用来提供web(网页)服务。在所有配置完成后,发现从我的主机无法打开服务器上的网页,打开其它网页则是正常的。
在讲案例解决之前,我们先明确几个关于TCP的概念:端口、三次握手。
端口:我们访问网页,说白了,其实是访问运行在服务器上的一个应用程序,而我们与应用程序通信,就要用到端口。比如打开网页用的http协议,它默认使用的80端口,https(http加密版本)默认使用的443端口。
三次握手:TCP是面向连接的协议,比如打开一个网页,你需要先和网页服务器建立一个连接,而建立这个连接的过程,我们称为三次握手。
三次握手
三次握手
我通过抓包软件(windows下使用wireshark,linux下使用tcpdump)获取了三条报文数据,我们来详细分析一下。
- ***条报文:192.168.253.4(主机)向目标ip为140开头的服务器的80端口发送标志位(Flag)为SYN(Synchronize Sequence Numbers,同步序列号)的报文。翻译成白话,主机告诉服务器,我要准备和你的80端口通信了,把我要访问的网页数据发给我。(***次握手)
- 第二条报文:服务器发送标志位为SYN,ACK(Acknowledge,确认位)的报文返回给主机。意思是,服务器收到主机发过来的连接请求了,你再发过确认报文过来,我就把数据给你。(第二次握手)
- 第三条报文:主机发送标志位为ACK的报文给服务器。说白了,就是主机告诉服务器,收到你要我发确认信息的报文,现将确认标志发你。(第三次握手)
- 当服务器收到第三条报文后,主机和服务器的连接就算建立了(Established),再然后服务器就可以将网页的数据传送给主机并在主机的浏览器上展示内容。
有了概念的了解,我们开始处理问题,首先要确定我和服务器之间的通信是否存在问题,最简单的方式是使用ping 服务器ip命令测试,发现和服务器之间的通信是ok的。
然后在服务器上(centos 7)通过netstat -na命令查看80端口(网页服务标准端口)是否开启,发现也没有问题。
网络是通的,应用服务也正常,却打不开服务器网页。还是使用wireshark查看通信的过程,确认到底是哪一步出现了问题。
问题报文
不要被图中的英文吓到,我们只需要关注几个地方,就能定位这个故障的问题。我们一步一步来。
前文提过,http使用tcp协议传输数据,tcp协议要求任何一方要和另一方通信需要先建立连接,也就是三次握手。
而在上图中,仔细看,只有主机(192.168.88.127)发给140服务器的标志位为SYN的报文,但没收到服务器返回的报文。因为主机没有收到服务器的返回报文,自动启用了重传机制,连续又发了好几次标志位为SYN的报文给主机,其实就是请求建立连接,但都是肉包子打狗--有去无回。一种可能是服务器应用程序出现了问题,没有响应。另一种可能是服务器压根儿没收到主机发送的建立连接报文。
因为事先我们确认了服务器应用程序状态是正常的,将排查重点放在服务器侧接收报文这一块。在服务器侧和主机侧同时抓包,查看是否能抓到来自主机的报文。
- //服务器使用linux系统,抓包使用tcpdump软件,-port 80表示抓取端口为80的报文,src host表示抓源地址是192.168.88.127的报文,and表示要求同时满足以上2个条件。
- $ tcpdump -port 80 and src host 192.168.88.127 -nn
通过抓包发现,主机在发送建立连接请求时,服务器没有抓到任何来自于主机192.168.88.127访问服务器80端口的报文,也就是说三次握手根本无法完成,更不要谈数据传输了。因为之前ping命令又能从主机ping通服务器,表示网络是通畅的。
这种情况下,很可能是防火墙策略阻档了报文,立即检查主机防火墙策略 。
- //centos 7环境下
- $ systemctl status firewalld
防火墙状态
检测防火墙状态
发现防火墙的Active状态为inactive(未激活),表示防火墙是未启用的。那是什么阻止了报文呢,最终结果还是出在了防火墙策略上,是云服务器提供商提供的防火墙安全策略默认阻止了外部访问80端口的请求,将策略修改为允许访问80端口后,终于顺利和服务器建立了连接(三次握手)网页正常打开了。
TCP协议是TCP/IP协议族最重要的协议之一,搞清楚他的运行机制,对于提高运维工作的效率是有巨大帮助的。这篇短文,只是让大家清楚TCP的概念和他的重要性,学习的道路是漫长的,我们才刚刚上路。