作为一名网络运维人员, 熟悉 TCP 和 UDP 两兄弟是必要的. TCP 与 UDP 是隶属于 TCP/IP 协议族的两员大将, 从 TCP/IP 诞生以来经历了几十年的发展, 可以这么说不管世界如何变迁, 无论沧海已变几多桑田, 管它传统互联网还是移动互联网, 都离不开他们, 现在, 今后很长一段时间都离不开.
前言
作为一名网络运维人员, 熟悉 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 的概念和他的重要性, 学习的道路是漫长的, 我们才刚刚上路.
来源: http://network.51cto.com/art/201809/582870.htm