前言
作為一名網絡運維人員,熟悉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)獲取了三條報文數據,我們來詳細分析一下。
有了概念的了解,我們開始處理問題,首先要確定我和服務器之間的通信是否存在問題,最簡單的方式是使用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的概念和他的重要性,學習的道路是漫長的,我們才剛剛上路。