1. 程式人生 > >TCP和UDP,你要知道的123 (TCP篇)

TCP和UDP,你要知道的123 (TCP篇)

重傳機制 ets 理解 深入學習 打開網頁 number 需要 無法 sta

前言

作為一名網絡運維人員,熟悉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的概念和他的重要性,學習的道路是漫長的,我們才剛剛上路。
如果有興趣深入學習TCP/IP協議,我給大家推薦一本書:TCP/IP詳解 卷1:協議,這本書從原理的角度出發,詳細講解了TCP/IP各個協議的運行機制,讓你知其然,還知其所以然。
更多我的原創文章,請關註我的公眾號:Ted的技術樂園

TCP和UDP,你要知道的123 (TCP篇)