計算機網絡拓跋結構,實戰 | 服務端開發與計算機網絡結合的完美案例

前言

大家好,我是阿秀

后端,可以說是僅次于算法崗之外競爭最為激烈的崗位,而其中的服務端開發也是很多人會選擇在秋招中投遞的一個崗位,我想對于很多人來說,走上服務端開發之路的起點就是一個回聲服務器了。

今天帶大家實戰一把,真實體驗服務端底層數據交換的點點滴滴,在這過程中可以讓你看見?TCP 三次握手四次揮手的具體過程,全程干貨,不開玩笑。

5da25a1b498224691976fcb74b469aaa.png

環境工具

客戶端:Ubuntu 16.04 ,IP:192.168.78.128 ,簡稱為客戶端A

服務端:Ubuntu 16.04 ,IP:192.168.78.130,簡稱為服務端B

抓包利器-大白鯊??Wireshark ?以及 Linux 下的抓包命令 tcpdump

GCC:5.4.0

因為 Wireshark 的圖標就很像一條大鯊魚的魚鰭,所以又叫大白鯊,不信你看看

69e2b9b4ec83dc10859f11063e948f14.png大白鯊

三次握手與四次揮手

這里簡單介紹下 TCP 最經典的三次握手與四次揮手

8f03be086e069f4054298ac6305264f4.png三次握手四次揮手

三次握手

第一次握手:建立連接。客戶端發送連接請求報文段,將 SYN 位置為1,seq(Sequence Number) 為 x;然后,客戶端進入 SYN_SEND 狀態,等待服務端的確認;

第二次握手:服務端收到 SYN 報文段。服務端收到客戶端的 SYN 報文段,需要對這個SYN 報文段進行確認,設置 ack(Acknowledgment Number) 為 x+1 (也就是 seq+1);同時,自己還要發送 SYN 請求信息,將 SYN 位置為1,seq 為 y;服務端將上述所有信息放到一個報文段(即 SYN+ACK 報文段)中,一并發送給客戶端,此時服務端進入 SYN_RECV 的狀態;

第三次握手:客戶端收到服務端的 SYN+ACK 報文段。然后將ack設置為y+1,向服務端發送ACK報文段,這個報文段發送完畢以后,客戶端和服務端端都進入 ESTABLISHED 狀態,完成TCP三次握手。

數據交互

成功建立連接后,客戶端與服務端就開始進行數據交互。客戶端發送數據,服務端回復收到該數據,然后交替進行下去。

四次揮手

當客戶端和服務端通過三次握手建立 TCP 連接進行可靠數據傳輸后,當數據傳送完畢,肯定是要斷開TCP連接,這里就有了神秘的“四次揮手”。

第一次揮手:客戶端設置 seq和ack,向服務端發送一個FIN報文段;此時,客戶端進入 FIN_WAIT_1 狀態;這表示客戶端沒有數據要發送給服務端了;

第二次揮手:服務端收到了客戶端發送的FIN報文段,向客戶端回一個 ACK 報文段,ack 為 seq+1;客戶端進入 FIN_WAIT_2 狀態;服務端告訴客戶端,我“同意”你的關閉請求;

第三次揮手:服務端向客戶端發送 FIN 報文段,請求關閉連接,同時服務端進入 LAST_ACK 狀態;

第四次揮手:客戶端收到服務端發送的 FIN 報文段,向服務端發送 ACK 報文段,然后客戶端進入 TIME_WAIT狀態;服務端收到客戶端的 ACK 報文段以后,就關閉連接;此時,客戶端等待 2MSL 后依然沒有收到回復,則證明服務端已正常關閉,那好,客戶端也可以關閉連接了。

思路整理

這里主要使用的是尹圣雨[韓]的著作《TCP/IP網絡編程》第 4 章中的簡易版回聲服務器來進行實驗。

所謂回聲服務端,就像小時候在回聲山谷中玩的游戲一樣,你朝山谷中大吼一聲“啊”,然后山谷也會給你一個“啊”。回聲服務端就是你向服務端發送一個“hello world”,回聲服務端也向你回復一個“hello world”。

1、將客戶端程序 echo_client.c 放在客戶端 A 中,將服務端程序 echo_server.c 放在服務端 B 中

2、在客戶端 A 中開啟一個命令行窗口,使用 tcpdump 命令監控 A、B 之間的網絡通信,并將消息保存為 pacp 文件,方便后續進行抓包分析

3、在服務端 B 中編譯程序 echo_server.c,開啟服務端程序 echo_server,監聽指定端口 2333

這里的端口號可以自己指定,在 1025-65535 之間都可以,主要是因為0-1024已經被系統占用了,比如http的80端口,ssh的22端口。而 Linux 下默認端口數在65535個,所以自己可以指定的端口號就在1025-65535之間。

4、在客戶端 A 中編譯程序 echo_client.c,并且開啟客戶端程序 echo_client,指定通話 IP 以及端口號,我在這里就是服務端 B 的IP:192.168.78.130以及 2333 端口號了

5、在客戶端 A 中發送消息“hello”,然后按 Q 退出即可

6、通信完畢,將 2 中保存的文件轉存到 Windows 環境下,使用大白鯊 Wireshark 進行網絡數據包分析。

7、分析抓到的數據包文件

開干

說了那么多,終于可以開始開干了!

1、將echo_client.c 、echo_server.c分別放在客戶端A:192.168.78.128 以及服務端B:192.168.78.130 中。

2330e8ae8ca8098f846a9619fd6d2379.png客戶端A

c318d5454205d6ba31a194ce2ce3804c.png服務端B

2、 ?在客戶端A中新開一個命令行窗口,輸入命令:sudo tcpdump -i any tcp and host 192.168.78.130 and port 2333 -w message.pcap

1、由于tcpdump命令需要管理員權限,所以需要加上sudo命令進而獲取管理員權限。

2、這段命令的大概含義就是監控客戶端 A:192.168.78.128,和服務端?B:192.168.78.130 之間在端口號2333 上的基于TCP的數據交換,并且保存為 message.pcap 文件

1cee5467dd17287584502ee0f42f2a3b.pngtcpd數據包保存命令

可以看到,我們在輸入該條命令后,需要首先輸入 Linux 下的密碼獲取管理員權限,然后就開始監聽客戶端 A:192.168.78.128,與服務端 B:192.168.78.130之間在端口號2333上的TCP通信了。

3、接下來,我們進入含有 echo_server.c的文件夾,將服務端B的程序進行編譯,編譯命令為 gcc echo_server.c -o echo_server,可以看到當前文件夾下出現了 echo_server 程序

30d1fe547dbcaf8983af530608b20700.png編譯服務器程序

接下來,開始監聽我們預先設置好的端口號 2333,命令為:./echo_server 2333,服務端開始正式監聽。

17df664ecef9d4935b08ba1288fa0a7b.png運行服務器程序

4、服務端 B 設置完畢,我們開始轉戰客戶端 A ,在 2 中使用 tcpdump 命令監聽的那個端口號不要關閉,千萬不要關閉,我們在客戶端 A 中另外新開一個命令行。

跟服務端 B 中類似,首先將客戶端 A 中的程序echo_client.c進行編譯,編譯命令:gcc echo_client.c -o echo_client

f17571529eca686cdbc6c5aba26373fd.png編譯客戶端程序

跟服務端 B 中類似,我們在客戶端 A 中開啟客戶端程序echo_client,指定通話IP :192.168.78.130及端口號 2333

命令為./echo_client 192.168.78.130 2333

90168c5a36ff71bddf4f89281c6eb2c0.png運行客戶端程序

可以看到出現 “Connected…..”字樣,說明我們已經走完長征兩萬五千公里,成功會師啦!

客戶端 A 與服務端 B 終于成功連接了,這個時候我們再轉去看一下服務端 B 的狀態。

88baf439f01af44b011ff8d23f94b34b.png服務器程序狀態

在服務端 B 的監聽窗口也出現了“Connect client 1”字樣,換句話說,在服務端看來,有一個客戶端與它成功建立連接了。

5、下一步就可以開始通信了,我們在客戶端 A 中發送“hello”字樣。

09e7c0c5efabc314dad46a14b76192a6.png在客戶端A發送消息

可以看到,我們在客戶端 A 中發送了一條消息“hello”, 服務端 B 也給了我們一個消息“hello”,這也就是我們上文中提到的回聲服務端了。

接下來,我們按照提示,輸入“Q”結束本次通話。

5b1e2f7c762bef068e3d35d482eec50f.png退出客戶端A

至此,本次通話結束。

6、最后我們在 2 中開啟 tcpdump 命令監控的界面中,按下 ctrl+ c ,結束監聽。

320e224f47caa8046bf324b2da93a115.png保存抓包文件

可以看到,提示我們一共成功捕獲了10 個packets,沒有數據包丟失。接下來,我們將捕獲文件 message.pacp傳輸到 Windows 下開始進行抓包分析。

19fa7adc08ffb58a6428b9c945ec73db.png

抓包分析

可以看出一共 10 個數據包,也對應了上文中我們在 Linux 下通過tcpdump命令抓到的數據包個數。其中序號 1-3 為三次握手的數據包,序號 4-7 為兩次數據交換的數據包,8-10 為三次揮手的數據包。

73477b4de56f8e83564d649095cd06b9.png抓到的10個數據包問題1:4-7 為什么是兩次數據交換呢?

回答1:我們的回聲服務端就是你發送什么數據過去,服務端發送什么數據回來,所以第一次數據交換:客戶端A發送數據”hello“到服務端B,B回復 確認收到。這也對應著4、5數據包;第二次數據交換:服務端B發送數據”hello“到客戶端A,A回復 確認收到。這也對應著6、7數據包。

問題2:說好的四次揮手呢?這里怎么只有三次了?

回答2:?因為服務端收到客戶端的 FIN 后,服務端也可以同時關閉連接,這樣就可以把 ACK 和 FIN 兩個包合并到一起發送,這樣可以節省一個網絡包,“四次揮手”變成了“三次揮手”。這樣可以節省網絡資源,省時又省力。而通常情況下,服務端收到客戶端的 FIN 后,很可能還沒發送完數據,所以就會先回復客戶端一個ACK 包,完成所有數據包的發送后,才會發送 FIN 包,也就是“四次揮手“了。

039064e9fe0add6414fb499abbc0ee6d.png

三次握手過程

2d72c05a4aadfed801fc98b7520608e9.png三次揮手過程

第一次握手,序號為1,客戶端A:192.168.78.128 向服務端B:192.168.78.130 發送SYN請求包,seq為1796975076。

第二次握手,序號為2,服務端 B:192.168.78.130 向客戶端A:192.168.78.128 發送 SYN、ACK 請求回復包,seq為1222412335,ack為1796975077,也就是第一次握手中的 seq+1。

第三次握手,序號為3,客戶端A:192.168.78.128 向服務端B:192.168.78.130 發送 ACK 確認包,seq為1796975077,ack為為1222412336,也就是第二次握手中的 seq+1。

兩次數據交互過程

第一次數據交互:

2dd2c6693ac3d5542d24944d3546896c.png第一次數據交互

序號為4,客戶端A:192.168.78.128 向服務端B:192.168.78.130 發送 push 消息包,可以看到下方的數據解析為“hello”,并且數據長度 len = 6。

可能有些小伙伴問“hello不是一共5個字符嗎?長度應該為5啊。”len = 6是因為“hello“長度為5,再加上結尾的‘\0’,加起來一共就是6了

序號為5,服務端B:192.168.78.130 向客戶端A:192.168.78.128 發送 ACK 確認包,表示已經收到該消息。

第二次數據交互:

a5717bc3331ce8a1670161d117b36411.png第二次數據交互

序號為6,服務端B:192.168.78.130 客戶端A:192.168.78.128發送push消息包,可以看到下方的數據解析為“hello”,并且 len = 6。

序號為7,客戶端A:192.168.78.128 向服務端B:192.168.78.130 ?發送ACK確認包,表示已經收到該消息。

三次揮手過程

正式的四次揮手如下圖所示:

11f2c456bf97ecb3d8f74b12cd3c6a11.png標準的四次揮手

我們所抓到的三次揮手如下所示:

6deb29e18a24da4c1e2f71114b63a068.png我們抓包抓到的三次揮手

第一次揮手,序號為8:客戶端A:192.168.78.128 向服務端B:192.168.78.130 ?發送 FIN 請求斷開連接包,表示主動請求斷開鏈接。

第二三次揮手,序號為9:服務端B:192.168.78.130 向 ?客戶端A:192.168.78.128發送 FIN、ACK 確認并請求斷開消息包,表示收到上次斷開連接的請求,并請求斷開服務端到客戶端的鏈接。

可以看出,我們所抓的包中,將第二次揮手和第三次揮手合并為一個數據包了,也就是192.168.78.130->192.168.78.128的包中既有FIN也有ACK,所以這也是三次揮手而不是四次揮手的原因。

第四次揮手,序號為 10:客戶端A:192.168.78.128 向服務端B:192.168.78.130 ?發送 ACK 確認包,表示收到服務端發送過來的請求斷開連接消息,并給予回復。

結語

學會將自己所學的知識串聯起來是你邁向大佬的必經之路

3da2e4d0173900670101c5c4de549978.png

巨人的肩膀

《TCP/IP網絡編程》- 尹圣雨[韓]

《Wireshark網絡分析就這么簡單》- 林沛滿

《Wireshark網絡分析的藝術》- 林沛滿

《計算機網絡-自頂向下方法》- ames F. Kurose、Keith W. Ross

《TCP/IP詳解 卷1:協議》- kevin R.Fall W.Richard Stevens

—END—

“你只管努力,剩下的交給時間就好,我就是活生生的例子~”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pcu tps_Mac版Microsoft Office 2011重新定義您的TPS報告體驗

pcu tpsOffice 2011 for Mac is going to be released in a couple of days, and we got our hands on the latest version already. Here’s a quick tour of some of the new features in the latest version of Office. Mac版Office 2011將在幾天內發布,我們已經…

【轉載】intellij idea如何將web項目打成war包

1、點擊【File】->【Project Structure】菜單(或使用ShiftCtrlAltS快捷鍵),打開【Project Structure】窗口。如下圖: 2、在【ProjectStructure】中選擇左側的【Artifacts】頁簽。如下圖: 3、點擊中間上面的&#xf…

形容計算機老師風采的句子,關于老師的句子

Tips:點擊圖片進入下一頁或下一篇圖有一種光榮的職業,叫老師;有一種難忘的情結,是老師;有一種最美的祝愿,送老師。以下是關于老師的句子,希望大家能喜歡。1、一只粉筆兩袖清風,三尺講臺四季耕耘&#xff0c…

一個小技巧 禁止瀏覽器彈出Alert

有的時候我們可能不太需要彈出凡人的Alert窗口,這個時候就要想辦法去禁止瀏覽器彈出這個東西.那么如何禁止呢? 其實很簡單的辣,看下面的代碼,一點點代碼輕松搞定. <script LANGUAGE"JavaScript">//這樣做就禁止了alert的彈窗window.alert function(str){retu…

藍牙 喚醒計算機_如何防止計算機意外喚醒

藍牙 喚醒計算機Putting your PC to sleep is a great way to save energy while still making sure you can resume work quickly. But what can you do if your PC keeps waking up on its own? Here’s how to figure out what’s waking it up, and how to prevent it. 使…

EF學習目錄

EF EF性能優化 EF延遲加載LazyLoading EF相關報錯 EF 事務 Entity相互關系 Entity種類&#xff08;動態代理&#xff09; DbContext Entity States Code First Code First 連接已有數據庫 DB First 生成EF后修改最大長度限制等 更新EF&#xff08;更新表 添加表…&#xff09; …

ppt 計算機圖標不見了,我PPT的圖標變成這樣了,為什么

公告&#xff1a; 為響應國家凈網行動&#xff0c;部分內容已經刪除&#xff0c;感謝讀者理解。話題&#xff1a;我PPT的圖標變成這樣了,為什么&#xff1f;怎么變回去&#xff1f;回答&#xff1a;軟件壞了或者被誤刪不支持PPT格式了&#xff0c;重裝一下就能支持了話題&#…

HDFS常用操作命令

創建目錄&#xff0c;示例&#xff1a;bin/hadoop dfs -mkdir /data/root/test;列出目錄清單&#xff0c;示例&#xff1a;bin/hadoop dfs -ls /data/root;刪除文件或目錄&#xff0c;示例&#xff1a;bin/hadoop fs -rmr /data/root/test;上傳文件&#xff0c;示例&#xff1a…

設計模式-系列索引

園子里面有太多優秀的設計模式文章了&#xff0c;但是可能每個人的出發角度和關注點不同&#xff0c;可能會對每個模式理解的角度和切面不同&#xff0c;我想以我自己理解的方式來跟大家共同探討下常用的設計模式&#xff0c;并且我會結合工作中的開發實際場景來說明每個模式的…

如何使Flash在Internet Explorer的64位版本中工作

You’re using the 64-bit version of IE 9 Beta and attempt to watch flash videos, and realize they won’t play. Here we look at fixing the problem by installing the new 64-bit version of Adobe Flash. 您正在使用IE 9 Beta的64位版本&#xff0c;并嘗試觀看Flash視…

h5c3 part6 flex

1. animation: name duration delay timing-function count forwards keyframes name { 0% from{ } 100% to{ } } 沒有延遲 animation-fill-mode: forwards 0%動畫不會立即執行, 結束時會停留在結束狀態 backwards 0%動畫會立即執行, 結束時不會停留在結束狀態 both 0%動畫會…

筆記本計算機沒反應怎么辦,有辦法 | 耳機插進電腦沒反應怎么辦?

原標題&#xff1a;有辦法 | 耳機插進電腦沒反應怎么辦&#xff1f;大家好&#xff0c;我是你們人見人愛&#xff0c;花見花開的信小工同學。今天&#xff0c;我要化身電腦維修師&#xff0c;為同學們解決電腦中那些讓人“捉急”的小問題。童鞋&#xff1a;小工&#xff01;小工…

clonezilla使用_如何使用Clonezilla備份和恢復已死或即將死去的系統磁盤

clonezilla使用March 31st, 2011 is “World Backup Day”—celebrate it by using free software Clonezilla to clone an exact copy of your OS system disk, regardless if you use Windows, Mac OS, or Linux! 2011年3月31日是“世界備份日”&#xff0c;無論您使用Window…

vue之安裝配置

直接上圖 轉載于:https://www.cnblogs.com/wdxue/p/8079349.html

瀏覽器顯示無法解析服務器的DNS地址,使用搜狗瀏覽器時突然彈出無法解析服務器的DNS地址該如何處理...

導語&#xff1a;小編也是搜狗瀏覽器的忠實粉絲&#xff0c;但是最近在使用瀏覽器的時候頻頻出現“無法解析服務器的DNS地址”的情況。為了修復這個故障小編也耗費了很多的時間&#xff0c;最后發現只要更改一個DNS就能夠輕松的解決這個問題&#xff0c;下面白豆芽就和大家分享…

基于Mint UI和MUI開發VUE項目一之環境搭建和首頁的實現

一&#xff1a;簡介 Mint UI 包含豐富的 CSS 和 JS 組件&#xff0c;能夠滿足日常的移動端開發需要。通過它&#xff0c;可以快速構建出風格統一的頁面&#xff0c;提升開發效率。真正意義上的按需加載組件。可以只加載聲明過的組件及其樣式文件&#xff0c;無需再糾結文件體積…

linux正則表達式替換_在Linux上使用Regexxer簡化正則表達式搜索/替換

linux正則表達式替換If you are tired of hacking together commands at the terminal or having to open a giant bloated IDE just to perform search and replace across a number of files, then Regexxer is the tool for you. 如果您厭倦了在終端上一起打包命令&#xff…

Java設計模式之策略設計模式

1.什么是-策略設計模式 在軟件開發中常常遇到這種情況&#xff0c;實現某一個功能有多種算法或者策略&#xff0c;我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等&#xff0c;一種常用的方法是硬編碼(Hard Coding)在一個類中&#xff0c;如…

電腦卡死,電腦卡屏死機幾個原因與解決辦法必看

電腦卡屏死機幾個原因與解決辦法必看相信很多朋友都遇到了關于電腦卡屏死機的問題,那么該電腦卡屏死機是什么原因呢?該如何解決&#xff1f;那么下面給你們說說電腦卡屏死機的原因和解決方法吧&#xff0c;希望可以幫到你們哦!電腦卡屏死機幾個原因:1 電腦中毒或中惡意軟件&am…

eclipse上搭建mybatis

1..在help中打開 2.搜索mybatipse 3&#xff1a;功能簡介 1&#xff1a;要查找某一個方法 在dao接口中某一個方法中 按住 Ctrl鍵 鼠標指到方法名稱上 選擇open xml 就會自動跳轉 2&#xff1a;自動生成resultMap 安裝鍵盤 alt / 會彈出提示框 3&#xff1a;引用re…