国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例

這篇具有很好參考價值的文章主要介紹了實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

大家好,我是Martin

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

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

環(huán)境工具

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

服務(wù)端:Ubuntu 16.04 ,IP:192.168.78.130,簡稱為服務(wù)端B

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

GCC:5.4.0

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

大白鯊

三次握手與四次揮手

這里簡單介紹下 TCP 最經(jīng)典的三次握手與四次揮手

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

三次握手四次揮手

三次握手
  1. 第一次握手:建立連接。客戶端發(fā)送連接請求報文段,將 SYN 位置為1,seq(Sequence Number) 為 x;然后,客戶端進(jìn)入 SYN_SEND 狀態(tài),等待服務(wù)端的確認(rèn);

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

  3. 第三次握手:客戶端收到服務(wù)端的 SYN+ACK 報文段。然后將ack設(shè)置為y+1,向服務(wù)端發(fā)送ACK報文段,這個報文段發(fā)送完畢以后,客戶端和服務(wù)端端都進(jìn)入 ESTABLISHED 狀態(tài),完成TCP三次握手。

數(shù)據(jù)交互

成功建立連接后,客戶端與服務(wù)端就開始進(jìn)行數(shù)據(jù)交互。客戶端發(fā)送數(shù)據(jù),服務(wù)端回復(fù)收到該數(shù)據(jù),然后交替進(jìn)行下去。

四次揮手

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

  1. 第一次揮手:客戶端設(shè)置 seq和ack,向服務(wù)端發(fā)送一個FIN報文段;此時,客戶端進(jìn)入 FIN_WAIT_1 狀態(tài);這表示客戶端沒有數(shù)據(jù)要發(fā)送給服務(wù)端了;

  2. 第二次揮手:服務(wù)端收到了客戶端發(fā)送的FIN報文段,向客戶端回一個 ACK 報文段,ack 為 seq+1;客戶端進(jìn)入 FIN_WAIT_2 狀態(tài);服務(wù)端告訴客戶端,我“同意”你的關(guān)閉請求;

  3. 第三次揮手:服務(wù)端向客戶端發(fā)送 FIN 報文段,請求關(guān)閉連接,同時服務(wù)端進(jìn)入 LAST_ACK 狀態(tài);

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

思路整理

這里主要使用的是尹圣雨[韓]的著作《TCP/IP網(wǎng)絡(luò)編程》第 4 章中的簡易版回聲服務(wù)器來進(jìn)行實驗。

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

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

2、在客戶端 A 中開啟一個命令行窗口,使用 tcpdump 命令監(jiān)控 A、B 之間的網(wǎng)絡(luò)通信,并將消息保存為 pacp 文件,方便后續(xù)進(jìn)行抓包分析

3、在服務(wù)端 B 中編譯程序 echo_server.c,開啟服務(wù)端程序 echo_server,監(jiān)聽指定端口 2333

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

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

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

6、通信完畢,將 2 中保存的文件轉(zhuǎn)存到 Windows 環(huán)境下,使用大白鯊 Wireshark 進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包分析。

7、分析抓到的數(shù)據(jù)包文件

開干

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

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

客戶端A

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

服務(wù)端B

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

1、由于tcpdump命令需要管理員權(quán)限,所以需要加上sudo命令進(jìn)而獲取管理員權(quán)限。

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

tcpd數(shù)據(jù)包保存命令

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

3、接下來,我們進(jìn)入含有 echo_server.c的文件夾,將服務(wù)端B的程序進(jìn)行編譯,編譯命令為 gcc echo_server.c -o echo_server,可以看到當(dāng)前文件夾下出現(xiàn)了 echo_server 程序

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

編譯服務(wù)器程序

接下來,開始監(jiān)聽我們預(yù)先設(shè)置好的端口號 2333,命令為:./echo_server 2333,服務(wù)端開始正式監(jiān)聽。

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

運(yùn)行服務(wù)器程序

4、服務(wù)端 B 設(shè)置完畢,我們開始轉(zhuǎn)戰(zhàn)客戶端 A ,在 2 中使用 tcpdump 命令監(jiān)聽的那個端口號不要關(guān)閉,千萬不要關(guān)閉,我們在客戶端 A 中另外新開一個命令行。

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

編譯客戶端程序

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

命令為./echo_client 192.168.78.130 2333

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

運(yùn)行客戶端程序

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

客戶端 A 與服務(wù)端 B 終于成功連接了,這個時候我們再轉(zhuǎn)去看一下服務(wù)端 B 的狀態(tài)。

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

服務(wù)器程序狀態(tài)

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

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

在客戶端A發(fā)送消息

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

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

退出客戶端A

至此,本次通話結(jié)束。

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

保存抓包文件

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

抓包分析

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

抓到的10個數(shù)據(jù)包

問題1:4-7 為什么是兩次數(shù)據(jù)交換呢?

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

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

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

三次握手過程

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

三次揮手過程

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

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

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

兩次數(shù)據(jù)交互過程

第一次數(shù)據(jù)交互:

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

第一次數(shù)據(jù)交互

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

可能有些小伙伴問“hello不是一共5個字符嗎?長度應(yīng)該為5啊?!眑en = 6是因為“hello“長度為5,再加上結(jié)尾的‘\0’,加起來一共就是6了

序號為5,服務(wù)端B:192.168.78.130 向客戶端A:192.168.78.128 發(fā)送 ACK 確認(rèn)包,表示已經(jīng)收到該消息。

第二次數(shù)據(jù)交互:

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

第二次數(shù)據(jù)交互

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

序號為7,客戶端A:192.168.78.128 向服務(wù)端B:192.168.78.130 ?發(fā)送ACK確認(rèn)包,表示已經(jīng)收到該消息。

三次揮手過程

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

標(biāo)準(zhǔn)的四次揮手

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

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

我們抓包抓到的三次揮手

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

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

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

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

結(jié)語

學(xué)會將自己所學(xué)的知識串聯(lián)起來是你邁向大佬的必經(jīng)之路

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

。

授人以魚不如授人以漁,本次實戰(zhàn)的全部文件已經(jīng)打包分享出來了,加我的QQ群在群文件查找就可以獲取,你也可以自己動手實踐一下。畢竟“紙上得來終覺淺,絕知此事要躬行“。 QQ群:876392689

如果大家覺得這種實戰(zhàn)類型的文章還可以的話,還請留言告訴我,以后我多為大家?guī)磉@種實戰(zhàn)類型的文章。

實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例,網(wǎng)絡(luò),服務(wù)器

巨人的肩膀

https://my.oschina.net/u/658658/blog/417739

《TCP/IP網(wǎng)絡(luò)編程》- 尹圣雨[韓]

《Wireshark網(wǎng)絡(luò)分析就這么簡單》- 林沛滿

《Wireshark網(wǎng)絡(luò)分析的藝術(shù)》- 林沛滿

《計算機(jī)網(wǎng)絡(luò)-自頂向下方法》- ames F. Kurose、Keith W. Ross

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

????????????????????????????????????????????????????????????????—?END?—文章來源地址http://www.zghlxwxcb.cn/news/detail-718616.html

到了這里,關(guān)于實戰(zhàn) | 服務(wù)端開發(fā)與計算機(jī)網(wǎng)絡(luò)結(jié)合的完美案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包