Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)
生活随笔
收集整理的這篇文章主要介紹了
Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TCP/IP參考模型是一個非常基礎(chǔ),而且也非常重要的基礎(chǔ)框架,要想入門數(shù)通這是個必須掌握的基本概念,本文檔通過一個簡單的示例,結(jié)合參考模型來分析一下數(shù)通的基本過程。
網(wǎng)絡(luò)環(huán)境非常簡單,如下圖所示,我們現(xiàn)在來分析一下PC去訪問Webserver的WEB服務(wù),整個數(shù)據(jù)通信過程是如何發(fā)生的,為了簡化描述,我們這里暫時忽略DNS、ARP、幀校驗等等機制的工作細(xì)節(jié),只考慮較為宏觀的層面。
1)PC訪問WebServer的WEB服務(wù),實際上是訪問Webserver的HTTP服務(wù)。這個過程對于人來說,就是在PC瀏覽器里輸入了Webserver的IP地址或域名,這個行為在PC的應(yīng)用層面將觸發(fā)本地的HTTP進程產(chǎn)生一些數(shù)據(jù),我們把這些數(shù)據(jù)稱為DATA,它是HTTP的有效荷載:
2)數(shù)通的最終任務(wù)是,要幫助PC把這個HTTP的有效荷載傳遞到Webserver上的HTTP進程中。這是一個看起來簡單的任務(wù),但是實際上,這份數(shù)據(jù)卻要翻山越嶺。PC的應(yīng)用層將這份HTTP的有效荷載交給“傳輸層”(我們這里忽略TCP三次握手等內(nèi)容),傳輸層會為應(yīng)用層下來的這份數(shù)據(jù)封裝上一個報文頭部,由HTTP是基于TCP的應(yīng)用,因此這里壓上的是TCP的頭部,在這個頭部之中,有目的端口號80,這個端口號將在數(shù)據(jù)到達Webserver后告訴對端,我要訪問你啥服務(wù)。當(dāng)然,為了讓這份數(shù)據(jù)能夠可靠的被傳輸,TCP頭部里還有其他重要的內(nèi)容,這里暫不贅述。
3)好了,HTTP的荷載被封裝上了TCP的頭,為了讓這份數(shù)據(jù)能夠在IP網(wǎng)絡(luò)中進行傳輸,我們還需要一個“信封”,于是數(shù)據(jù)到了PC的“因特網(wǎng)層”,在這一層,數(shù)據(jù)被封裝上了一個IP報文頭部,在IP包頭中,寫入了源和目的IP地址,源IP地址為PC的IP:192.168.1.1,而目的IP地址是WebServer的IP:192.168.2.1。IP包頭中的另一個重要的字段是協(xié)議號,這里寫入的值為6,這個值對應(yīng)著IP頭后面封裝的協(xié)議,也就是TCP。好了,有了IP頭這個信封,我們這份數(shù)據(jù),就能夠在IP網(wǎng)絡(luò)中被從源傳遞到目的地:
4)然而光有信封還是不夠的,至少,我們要把這個信件一段鏈路一段鏈路的搬運過去,而不能一下就從源直接穿越到目的地去吧,也不是天朝的穿越劇不是?那咋辦,我們還需要一個數(shù)據(jù)鏈路層的頭部,由于這里是以太網(wǎng)的環(huán)境、以太網(wǎng)的鏈路,因此上層下來的數(shù)據(jù),又被封裝上了一個以太網(wǎng)幀頭,這是為了使得PC能夠?qū)⑦@份數(shù)據(jù)傳遞到同在鏈路上的網(wǎng)關(guān)R1(的F0/0口)。由于PC設(shè)置的網(wǎng)關(guān)地址為192.168.1.254,也就是R1的F0/0口IP地址,因此,當(dāng)訪問Webserver 192.168.2.1這個非本地網(wǎng)絡(luò)的IP時,PC要求助于它的網(wǎng)關(guān),因此再數(shù)據(jù)鏈路層面上,PC要數(shù)據(jù)傳遞到網(wǎng)關(guān),它將封裝上去的以太網(wǎng)頭部中寫入源MAC也就是自己的MAC:00DD.F800.0001,同時寫入目的MAC也就是路由器R1的F0/0口的MAC:000.AAAA.0001,當(dāng)然如果此刻PC沒有網(wǎng)關(guān)IP對應(yīng)的MAC,那么它會發(fā)送ARP消息去請求。 以太網(wǎng)幀頭中還有一個重要的字段,是類型字段,類型字段用于描述我這個以太網(wǎng)的幀頭后面被封裝的是什么報文,這里寫入的值是0x0800,表示后面是一個IP報文:紅茶三杯(http://weibo.com/vinsoney)原創(chuàng)技術(shù)博文,版權(quán)歸作者所有,轉(zhuǎn)載請注明出處。
5)費了好大的勁兒,層層加料,終于,這份數(shù)據(jù)最終做好了傳輸?shù)臏?zhǔn)備,從PC傳輸?shù)搅送阪溌飞系腞1,距離目的地又更近了一點,當(dāng)然,在數(shù)據(jù)在傳輸過程中,是不可能像我們圖畫的這么文藝的,它應(yīng)該是一些電氣化的信息,例如1010101神馬的,不鳥他了,反正是這一坨東西是傳到了R1:
6)R1的F0/0口收到了這份東西,先把它還原成數(shù)據(jù)幀,查看幀頭,發(fā)現(xiàn)目的MAC地址正是自己F0/0口的MAC地址,高興壞了,以為是誰寫給自己的情書呢,于是結(jié)合查看類型字段,發(fā)現(xiàn)是0800,于是知道上層被封裝的是一個IP包,它將以太網(wǎng)幀頭剝?nèi)?#xff0c;將里頭的IP報文交上去給IP協(xié)議棧處理:
7)接下去是R1的因特網(wǎng)層的工作了,他收到下層傳遞夠來的IP包,查看IP包的目的IP地址,發(fā)現(xiàn)目的地是192.168.2.1,我艸,原來不是給我的是給別人的,沒辦法,R1拿著這個地址去自己的地圖--路由表中去查找,發(fā)現(xiàn)有個目的地192.168.2.0/24的網(wǎng)絡(luò),出口是自己的FA1/0口,下一跳地址是192.168.12.2也就是R2:
8)發(fā)現(xiàn)數(shù)據(jù)包目的IP地址不是自己的R1,找到將數(shù)據(jù)送到目的地的路徑,是交給離目的地更近的192.168.12.2,而為了將數(shù)據(jù)交給同在鏈路上的192.168.12.2,又得將數(shù)據(jù)重新封裝上以太網(wǎng)的幀頭,這次幀頭中的源MAC填寫的是R1的FA1/0口的MAC地址,而目的MAC寫的是R2的F0/0口的MAC地址:
9)妥妥兒的,數(shù)據(jù)又被R1傳遞給了R2:
10)R2收到這個數(shù)據(jù)后,同樣的是先還原成數(shù)據(jù)幀,然后查看幀頭,結(jié)果發(fā)現(xiàn)目的MAC是自己的MAC,也挺高興,將數(shù)據(jù)幀丟給上層的IP協(xié)議去處理:紅茶三杯(http://weibo.com/vinsoney)原創(chuàng)技術(shù)博文,版權(quán)歸作者所有,轉(zhuǎn)載請注
11)結(jié)果一樣的,丫一看IP頭中的目的IP地址,擦類又不是給自己的,咦,為什么要說又字?不管了,反正不是給自己的就對了:
12)于是查路由表,發(fā)現(xiàn)目的IP地址192.168.2.1就是在自己FA1/0口直連的網(wǎng)絡(luò)192.168.2.0/24中的一個IP地址,好辦了,緣來是家門口的人啊。于是它將數(shù)據(jù)再封裝上以太網(wǎng)幀頭,源MAC是自己Fa1/0口的MAC地址,目的MAC是Webserver的MAC,如果沒有Webserver的192.168.2.1對應(yīng)的MAC,同樣的,還是發(fā)送ARP消息去請求:
13)數(shù)據(jù)有上路了,傳遞給了Webserver
14)說好的宏觀分析的,說著說著有變成微觀的了。Webserver收到這個數(shù)據(jù)幀后,查看幀頭,目的MAC是自己的網(wǎng)卡MAC,而且類型字段為0800:
15)于是將這個幀頭拆開,將里頭的IP報文交給IP協(xié)議去處理。接著IP協(xié)議分析這個IP包,查看包頭中的目的IP地址,發(fā)現(xiàn)正是自己的網(wǎng)卡IP相同,又發(fā)現(xiàn)IP頭中的協(xié)議號是6,說明這IP頭里包裹著的是一個TCP的報文:
16)知道IP頭后面包裹的是一個TCP報文后,它將IP頭剝?nèi)?#xff0c;將里頭的TCP包拿出來,發(fā)現(xiàn)TCP頭部中目的端口號是80,這是一個well-known眾所周知的端口號:
17)80端口號對應(yīng)的服務(wù)是HTTP。PC發(fā)現(xiàn),自己的80端口正好是打開的,HTTP服務(wù)正在工作,于是將TCP頭部摘掉,露出了里頭的有效荷載,哎,終于……小姑娘終于又出來了,最終被交給了HTTP服務(wù)。這樣,一份數(shù)據(jù)最終就被傳遞到了目的地的目的應(yīng)用中。當(dāng)然,這一過程中我們依然省略了大量的細(xì)節(jié)。值得注意的是數(shù)據(jù)通信的過程是雙向的,因此PC發(fā)送數(shù)據(jù)到了WebServer,為了讓服務(wù)交互能夠正常進行,數(shù)據(jù)還會回程,因此實際上還有一個數(shù)據(jù)返程的過程這里我們就不再分析了,原理大同小異。
頂0 踩
網(wǎng)絡(luò)環(huán)境非常簡單,如下圖所示,我們現(xiàn)在來分析一下PC去訪問Webserver的WEB服務(wù),整個數(shù)據(jù)通信過程是如何發(fā)生的,為了簡化描述,我們這里暫時忽略DNS、ARP、幀校驗等等機制的工作細(xì)節(jié),只考慮較為宏觀的層面。
1)PC訪問WebServer的WEB服務(wù),實際上是訪問Webserver的HTTP服務(wù)。這個過程對于人來說,就是在PC瀏覽器里輸入了Webserver的IP地址或域名,這個行為在PC的應(yīng)用層面將觸發(fā)本地的HTTP進程產(chǎn)生一些數(shù)據(jù),我們把這些數(shù)據(jù)稱為DATA,它是HTTP的有效荷載:
2)數(shù)通的最終任務(wù)是,要幫助PC把這個HTTP的有效荷載傳遞到Webserver上的HTTP進程中。這是一個看起來簡單的任務(wù),但是實際上,這份數(shù)據(jù)卻要翻山越嶺。PC的應(yīng)用層將這份HTTP的有效荷載交給“傳輸層”(我們這里忽略TCP三次握手等內(nèi)容),傳輸層會為應(yīng)用層下來的這份數(shù)據(jù)封裝上一個報文頭部,由HTTP是基于TCP的應(yīng)用,因此這里壓上的是TCP的頭部,在這個頭部之中,有目的端口號80,這個端口號將在數(shù)據(jù)到達Webserver后告訴對端,我要訪問你啥服務(wù)。當(dāng)然,為了讓這份數(shù)據(jù)能夠可靠的被傳輸,TCP頭部里還有其他重要的內(nèi)容,這里暫不贅述。
3)好了,HTTP的荷載被封裝上了TCP的頭,為了讓這份數(shù)據(jù)能夠在IP網(wǎng)絡(luò)中進行傳輸,我們還需要一個“信封”,于是數(shù)據(jù)到了PC的“因特網(wǎng)層”,在這一層,數(shù)據(jù)被封裝上了一個IP報文頭部,在IP包頭中,寫入了源和目的IP地址,源IP地址為PC的IP:192.168.1.1,而目的IP地址是WebServer的IP:192.168.2.1。IP包頭中的另一個重要的字段是協(xié)議號,這里寫入的值為6,這個值對應(yīng)著IP頭后面封裝的協(xié)議,也就是TCP。好了,有了IP頭這個信封,我們這份數(shù)據(jù),就能夠在IP網(wǎng)絡(luò)中被從源傳遞到目的地:
4)然而光有信封還是不夠的,至少,我們要把這個信件一段鏈路一段鏈路的搬運過去,而不能一下就從源直接穿越到目的地去吧,也不是天朝的穿越劇不是?那咋辦,我們還需要一個數(shù)據(jù)鏈路層的頭部,由于這里是以太網(wǎng)的環(huán)境、以太網(wǎng)的鏈路,因此上層下來的數(shù)據(jù),又被封裝上了一個以太網(wǎng)幀頭,這是為了使得PC能夠?qū)⑦@份數(shù)據(jù)傳遞到同在鏈路上的網(wǎng)關(guān)R1(的F0/0口)。由于PC設(shè)置的網(wǎng)關(guān)地址為192.168.1.254,也就是R1的F0/0口IP地址,因此,當(dāng)訪問Webserver 192.168.2.1這個非本地網(wǎng)絡(luò)的IP時,PC要求助于它的網(wǎng)關(guān),因此再數(shù)據(jù)鏈路層面上,PC要數(shù)據(jù)傳遞到網(wǎng)關(guān),它將封裝上去的以太網(wǎng)頭部中寫入源MAC也就是自己的MAC:00DD.F800.0001,同時寫入目的MAC也就是路由器R1的F0/0口的MAC:000.AAAA.0001,當(dāng)然如果此刻PC沒有網(wǎng)關(guān)IP對應(yīng)的MAC,那么它會發(fā)送ARP消息去請求。 以太網(wǎng)幀頭中還有一個重要的字段,是類型字段,類型字段用于描述我這個以太網(wǎng)的幀頭后面被封裝的是什么報文,這里寫入的值是0x0800,表示后面是一個IP報文:紅茶三杯(http://weibo.com/vinsoney)原創(chuàng)技術(shù)博文,版權(quán)歸作者所有,轉(zhuǎn)載請注明出處。
5)費了好大的勁兒,層層加料,終于,這份數(shù)據(jù)最終做好了傳輸?shù)臏?zhǔn)備,從PC傳輸?shù)搅送阪溌飞系腞1,距離目的地又更近了一點,當(dāng)然,在數(shù)據(jù)在傳輸過程中,是不可能像我們圖畫的這么文藝的,它應(yīng)該是一些電氣化的信息,例如1010101神馬的,不鳥他了,反正是這一坨東西是傳到了R1:
6)R1的F0/0口收到了這份東西,先把它還原成數(shù)據(jù)幀,查看幀頭,發(fā)現(xiàn)目的MAC地址正是自己F0/0口的MAC地址,高興壞了,以為是誰寫給自己的情書呢,于是結(jié)合查看類型字段,發(fā)現(xiàn)是0800,于是知道上層被封裝的是一個IP包,它將以太網(wǎng)幀頭剝?nèi)?#xff0c;將里頭的IP報文交上去給IP協(xié)議棧處理:
7)接下去是R1的因特網(wǎng)層的工作了,他收到下層傳遞夠來的IP包,查看IP包的目的IP地址,發(fā)現(xiàn)目的地是192.168.2.1,我艸,原來不是給我的是給別人的,沒辦法,R1拿著這個地址去自己的地圖--路由表中去查找,發(fā)現(xiàn)有個目的地192.168.2.0/24的網(wǎng)絡(luò),出口是自己的FA1/0口,下一跳地址是192.168.12.2也就是R2:
8)發(fā)現(xiàn)數(shù)據(jù)包目的IP地址不是自己的R1,找到將數(shù)據(jù)送到目的地的路徑,是交給離目的地更近的192.168.12.2,而為了將數(shù)據(jù)交給同在鏈路上的192.168.12.2,又得將數(shù)據(jù)重新封裝上以太網(wǎng)的幀頭,這次幀頭中的源MAC填寫的是R1的FA1/0口的MAC地址,而目的MAC寫的是R2的F0/0口的MAC地址:
9)妥妥兒的,數(shù)據(jù)又被R1傳遞給了R2:
10)R2收到這個數(shù)據(jù)后,同樣的是先還原成數(shù)據(jù)幀,然后查看幀頭,結(jié)果發(fā)現(xiàn)目的MAC是自己的MAC,也挺高興,將數(shù)據(jù)幀丟給上層的IP協(xié)議去處理:紅茶三杯(http://weibo.com/vinsoney)原創(chuàng)技術(shù)博文,版權(quán)歸作者所有,轉(zhuǎn)載請注
11)結(jié)果一樣的,丫一看IP頭中的目的IP地址,擦類又不是給自己的,咦,為什么要說又字?不管了,反正不是給自己的就對了:
12)于是查路由表,發(fā)現(xiàn)目的IP地址192.168.2.1就是在自己FA1/0口直連的網(wǎng)絡(luò)192.168.2.0/24中的一個IP地址,好辦了,緣來是家門口的人啊。于是它將數(shù)據(jù)再封裝上以太網(wǎng)幀頭,源MAC是自己Fa1/0口的MAC地址,目的MAC是Webserver的MAC,如果沒有Webserver的192.168.2.1對應(yīng)的MAC,同樣的,還是發(fā)送ARP消息去請求:
13)數(shù)據(jù)有上路了,傳遞給了Webserver
14)說好的宏觀分析的,說著說著有變成微觀的了。Webserver收到這個數(shù)據(jù)幀后,查看幀頭,目的MAC是自己的網(wǎng)卡MAC,而且類型字段為0800:
15)于是將這個幀頭拆開,將里頭的IP報文交給IP協(xié)議去處理。接著IP協(xié)議分析這個IP包,查看包頭中的目的IP地址,發(fā)現(xiàn)正是自己的網(wǎng)卡IP相同,又發(fā)現(xiàn)IP頭中的協(xié)議號是6,說明這IP頭里包裹著的是一個TCP的報文:
16)知道IP頭后面包裹的是一個TCP報文后,它將IP頭剝?nèi)?#xff0c;將里頭的TCP包拿出來,發(fā)現(xiàn)TCP頭部中目的端口號是80,這是一個well-known眾所周知的端口號:
17)80端口號對應(yīng)的服務(wù)是HTTP。PC發(fā)現(xiàn),自己的80端口正好是打開的,HTTP服務(wù)正在工作,于是將TCP頭部摘掉,露出了里頭的有效荷載,哎,終于……小姑娘終于又出來了,最終被交給了HTTP服務(wù)。這樣,一份數(shù)據(jù)最終就被傳遞到了目的地的目的應(yīng)用中。當(dāng)然,這一過程中我們依然省略了大量的細(xì)節(jié)。值得注意的是數(shù)據(jù)通信的過程是雙向的,因此PC發(fā)送數(shù)據(jù)到了WebServer,為了讓服務(wù)交互能夠正常進行,數(shù)據(jù)還會回程,因此實際上還有一個數(shù)據(jù)返程的過程這里我們就不再分析了,原理大同小異。
頂
總結(jié)
以上是生活随笔為你收集整理的Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySql之ALTER命令用法详细解读
- 下一篇: CSHOP后台设置SMTP发邮件提示 E