0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端

馬哥Linux運(yùn)維 ? 來源:杰哥的IT之旅 ? 作者:杰哥的IT之旅 ? 2022-07-01 10:09 ? 次閱讀

你有想過嗎,在計(jì)算機(jī)網(wǎng)絡(luò)當(dāng)中,數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端的?中間涉及到了哪些理論?

01 客戶端各層對(duì)數(shù)據(jù)的封裝

java實(shí)現(xiàn)客戶端的代碼如下:

356decc0-f3c3-11ec-ba43-dac502259ad0.png

應(yīng)用層會(huì)指定發(fā)送的服務(wù)器的域名(或者IP)和端口號(hào)、以及要發(fā)送數(shù)據(jù)的內(nèi)容,傳遞給下一層傳輸層。

傳輸層會(huì)在把應(yīng)用層的報(bào)文當(dāng)成自己的數(shù)據(jù),然后在前面拼接源端口號(hào),和目標(biāo)端口號(hào)。

其中源端口號(hào)就是客戶端進(jìn)程監(jiān)聽的端口號(hào),這個(gè)端口號(hào)一般不是固定的,由操作系統(tǒng)在49152~65535范圍內(nèi)動(dòng)態(tài)分配,而目標(biāo)端口號(hào)就是服務(wù)器接收數(shù)據(jù)的端口號(hào),一般是固定的,在java代碼中會(huì)指明。

網(wǎng)絡(luò)層會(huì)在傳輸層報(bào)文的基礎(chǔ)上增加源IP和目標(biāo)IP,其中源IP就是本地網(wǎng)卡的IP地址,目標(biāo)IP是服務(wù)器的IP,如果java代碼中指定的是服務(wù)器的域名。

那么,首先需要通過DNS服務(wù)器將域名解析為IP,域名解析的流程:

先查瀏覽器緩存->操作系統(tǒng)緩存->hosts文件->DNS服務(wù)器。

數(shù)據(jù)鏈路層會(huì)在網(wǎng)絡(luò)層的基礎(chǔ)上增加源MAC地址和目標(biāo)MAC地址,其中源MAC地址就是本機(jī)網(wǎng)卡的MAC地址,目標(biāo)MAC地址是下一跳網(wǎng)絡(luò)設(shè)備(一般是交換機(jī)或路由器)的MAC地址。

注意,目標(biāo)MAC地址一般不是服務(wù)器的MAC地址(如果客戶端和服務(wù)器端在同一個(gè)網(wǎng)段,那么目標(biāo)MAC地址就是服務(wù)器的MAC地址),因?yàn)榭蛻舳烁揪蜔o法得知服務(wù)器的MAC地址,所以數(shù)據(jù)鏈路層采用下一跳的機(jī)制轉(zhuǎn)遞數(shù)據(jù)。

那么怎么知道我的下一跳是誰呢?

下面就要請(qǐng)出ARP協(xié)議了,ARP會(huì)發(fā)出一個(gè)廣播,告訴全世界:“大家好,我的IP地址是192.168.1.6,我的MAC地址是00-50-56-C0-88-01”

當(dāng)同一個(gè)網(wǎng)段上的主機(jī)接收到ARP報(bào)文時(shí),會(huì)將這些信息添加自己的ARP緩沖區(qū)中的ARP列表,同時(shí)將自己的IP地址和MAC地址回應(yīng)給發(fā)送者,這樣每個(gè)位于同一個(gè)網(wǎng)段的主機(jī)都有整個(gè)網(wǎng)段內(nèi)各個(gè)主機(jī)的IP與MAC地址的對(duì)應(yīng)關(guān)系了。

357b3fce-f3c3-11ec-ba43-dac502259ad0.png

ARP列表的具體內(nèi)容如下:

3588eb74-f3c3-11ec-ba43-dac502259ad0.png

現(xiàn)在我的目標(biāo)IP是192.168.3.6,又不在這個(gè)ARP列表中,那我怎么知道目標(biāo)MAC地址要填啥呢?填下一跳的MAC地址,那么下一跳是又是誰呢?這里就要請(qǐng)出路由表了。

35941292-f3c3-11ec-ba43-dac502259ad0.png

這個(gè)路由表是計(jì)算機(jī)的路由表,而不是路由器的路由表,這個(gè)路由表怎么來的呢?根據(jù)/etc/sysconfig/network-scripts/ifcfg-eth0這個(gè)文件生成的。

359eaa40-f3c3-11ec-ba43-dac502259ad0.png

那么這個(gè)路由表怎么使用呢?將目標(biāo)IP與每一條記錄的子網(wǎng)掩碼(Genmask)一一按位與運(yùn)算,匹配度最高的Destination字段的IP就是下一跳的IP192.168.1.100,也就是網(wǎng)關(guān)地址GATEWAY,然后根據(jù)下一跳的IP去查ARP列表獲得MAC地址00-30-F2-C1-2E-89。

就這樣客戶端完成了對(duì)報(bào)文的組裝,交給物理層把數(shù)據(jù)從網(wǎng)卡發(fā)送出去,發(fā)送到交換機(jī)A。

02 交換機(jī)的交換

交換機(jī)收到客戶端的報(bào)文后,會(huì)進(jìn)行解析,只解析到數(shù)據(jù)鏈路層,從中獲得目標(biāo)MAC地址,然后查找ARP列表,將報(bào)文轉(zhuǎn)發(fā)給對(duì)應(yīng)的網(wǎng)卡端口。

交換機(jī)中的ARP列表:

35aee52c-f3c3-11ec-ba43-dac502259ad0.png

根據(jù)目標(biāo)MAC地址00-30-F2-C1-2E-89找到交換機(jī)的端口為Fa2/1,這樣交換機(jī)就會(huì)把報(bào)文從這個(gè)端口發(fā)送出去,發(fā)送到路由器,這里的端口是交換機(jī)的物理端口,也就是插入網(wǎng)線的插口。

35d323ce-f3c3-11ec-ba43-dac502259ad0.png

03 路由器的路由

路由器可以連接兩個(gè)不同的網(wǎng)絡(luò)。

路由器有一張路由表,路由表可以通過網(wǎng)絡(luò)工程師配置或者從其他路由器學(xué)習(xí)得到。

35e424e4-f3c3-11ec-ba43-dac502259ad0.png

路由器會(huì)解析報(bào)文到網(wǎng)絡(luò)層,然后發(fā)現(xiàn)目的IP是192.168.3.6,從上面的路由表可以可以發(fā)現(xiàn),想要去192.168.3.0網(wǎng)段,只需要將數(shù)據(jù)從FastEthernet0/1端口發(fā)送出去即可。

另外路由器會(huì)將目標(biāo)MAC地址替換成下一跳的MAC地址(在這里是服務(wù)器的MAC地址,如果中間還有其他路由器,那么就是下一個(gè)路由器的MAC地址),怎么替換呢?還是查ARP表:

35fc3052-f3c3-11ec-ba43-dac502259ad0.png

查詢IP192.168.3.6的MAC地址為0030.A396.5DE7然后將目標(biāo)MAC替換成這個(gè),然后將數(shù)據(jù)從FastEthernet0/1端口發(fā)送出去,交給交換機(jī)B,交換機(jī)B再將數(shù)據(jù)轉(zhuǎn)發(fā)到服務(wù)器端。

360cd920-f3c3-11ec-ba43-dac502259ad0.png

04 服務(wù)器端各層對(duì)數(shù)據(jù)的解析

361c32ee-f3c3-11ec-ba43-dac502259ad0.png

服務(wù)器端收到數(shù)據(jù)后會(huì)逐層進(jìn)行解析,最后將真正的數(shù)據(jù)交應(yīng)用程序進(jìn)行處理,至此一個(gè)數(shù)據(jù)從客戶端到服務(wù)器端就完成了,服務(wù)器端會(huì)發(fā)送響應(yīng)報(bào)文給客戶端,大體的流程類似,但是數(shù)據(jù)不一定是原路返回的,因?yàn)橹虚g經(jīng)過的路由可能不同。

05 擴(kuò)展

查看域名對(duì)應(yīng)的IP:

362d52c2-f3c3-11ec-ba43-dac502259ad0.png

查看本機(jī)到服務(wù)器中間經(jīng)過了多少個(gè)路由節(jié)點(diǎn):

364afb2e-f3c3-11ec-ba43-dac502259ad0.png

原文標(biāo)題:數(shù)據(jù)在網(wǎng)絡(luò)中是如何傳輸?shù)?/p>

文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:數(shù)據(jù)在網(wǎng)絡(luò)中是如何傳輸?shù)?/p>

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用lwip socket udp功能,開發(fā)板為客戶端時(shí)不能夠接收服務(wù)器端發(fā)送過來的數(shù)據(jù) ?

    調(diào)用,間隔10ms */ void Socket_UDP_ClientTX(void) //開發(fā)板為客戶端,數(shù)據(jù)發(fā)送到服務(wù)器端是成功的 ok { volatile u8 _KeyCod
    發(fā)表于 04-16 06:01

    用隊(duì)列實(shí)現(xiàn)的1對(duì)N的TCP服務(wù)器端,自動(dòng)回復(fù)信息總發(fā)錯(cuò)客戶端

    本帖最后由 kaneiqi1210 于 2014-7-17 12:43 編輯 如題,我仿照教材用隊(duì)列做的TCP一對(duì)多的服務(wù)器端,在1對(duì)1時(shí),沒問題,而在1對(duì)多時(shí),就出現(xiàn),自動(dòng)回復(fù)信息至不正確的客戶端(即非發(fā)送信息的
    發(fā)表于 07-17 09:31

    labview TCP客戶端

    最近在做一個(gè)labview 客戶端測(cè)試小程序,服務(wù)器采用MFC編寫,客戶端采用TCP偵聽函數(shù),通信可以連接,數(shù)據(jù)也正確,但是服務(wù)器端檢測(cè)
    發(fā)表于 06-30 23:15

    qt tcp程序在服務(wù)器端發(fā)送數(shù)據(jù)之前能接收客戶端發(fā)送數(shù)據(jù)嗎?

    寫了一個(gè)tcp的客戶端服務(wù)器端,是服務(wù)器端客戶端發(fā)送文件,但是我想在服務(wù)器端
    發(fā)表于 04-22 20:06

    labview怎么實(shí)現(xiàn)服務(wù)器端一直等待客戶端發(fā)送數(shù)據(jù)

    我現(xiàn)在在做labview的服務(wù)器端,但是當(dāng)客戶端發(fā)送數(shù)據(jù)結(jié)束后,我的服務(wù)器端會(huì)報(bào)錯(cuò)。報(bào)錯(cuò)的意思就是說客戶
    發(fā)表于 08-12 14:34

    怎么用key0,key2控制服務(wù)器端客戶端知道有數(shù)據(jù)發(fā)送請(qǐng)求的?

    原子用key0,key2控制服務(wù)器端客戶端有請(qǐng)求數(shù)據(jù)發(fā)送,是如何知道有數(shù)據(jù)發(fā)送請(qǐng)求的,沒看明白
    發(fā)表于 07-29 04:17

    TCP:多個(gè)客戶端服務(wù)器發(fā)送數(shù)據(jù)

    本帖最后由 埥茬適里瀭叺妏牸 于 2019-8-23 10:27 編輯 就是當(dāng)多個(gè)客戶端第一次連接上服務(wù)器時(shí)發(fā)送數(shù)據(jù)沒問題,但是途中更改客戶
    發(fā)表于 08-22 15:05

    Tcp/ip客戶端示例:將數(shù)據(jù)發(fā)送到服務(wù)器的最佳方法是什么?

    H/WPIC32以太網(wǎng)啟動(dòng)套件2MPLABX3.2,和聲1.6AM,我會(huì)把正確的數(shù)據(jù)發(fā)送到我的服務(wù)器嗎?問題是我對(duì)Microchip給出的泛型Tcp/ip
    發(fā)表于 09-11 12:37

    為什么LWIP的TCP客戶端服務(wù)器端斷開后繼續(xù)發(fā)送數(shù)據(jù)就無法檢測(cè)到連接狀態(tài)?

    發(fā)現(xiàn)LWIP的TCP客戶端有個(gè)BUG,當(dāng)服務(wù)器端開之后,如果還繼續(xù)發(fā)送數(shù)據(jù),那就不能檢測(cè)到連接狀態(tài)。求助求助
    發(fā)表于 10-29 20:26

    DHCP客戶端如何將主機(jī)名發(fā)送到服務(wù)器?

    有沒有人知道,如果DHCP客戶端和諧,可以將設(shè)備的主機(jī)名返回DNS服務(wù)器。我很感激服務(wù)器在許多情況下把主機(jī)名發(fā)送客戶端。應(yīng)用程序是當(dāng)你第一
    發(fā)表于 05-01 06:44

    Labview客戶端狀態(tài)獲取

    連接數(shù)量不是實(shí)時(shí)讀取,如果某個(gè)客戶端斷開連接,需要發(fā)送一次數(shù)據(jù)后才能更新客戶端數(shù)量,而且同一客戶端反復(fù)斷開連接時(shí)
    發(fā)表于 11-15 15:02

    請(qǐng)問如何處理客戶端服務(wù)器的寫操作?

    我的項(xiàng)目涉及一個(gè) Nucleo-64+X-NUCLEO-BNRG2A1 通過藍(lán)牙與 Android 手機(jī)通信。我成功地將數(shù)據(jù)服務(wù)器 (BNRG2A1) 發(fā)送到
    發(fā)表于 01-04 08:22

    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端和TCP服務(wù)器端應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端和TCP服務(wù)器端應(yīng)用程序免費(fèi)下載。
    發(fā)表于 08-30 08:00 ?16次下載
    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP<b class='flag-5'>客戶端</b>和TCP<b class='flag-5'>服務(wù)器端</b>應(yīng)用程序免費(fèi)下載

    服務(wù)器端使用內(nèi)存來存儲(chǔ)客戶端發(fā)送過來的數(shù)據(jù)

    在實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)之前,我們先在客戶端使用Clap庫來解析命令行參數(shù),并封裝成命令發(fā)送服務(wù)器。
    的頭像 發(fā)表于 09-29 10:03 ?1072次閱讀

    MQTT中服務(wù)端客戶端

    (broker),它是 MQTT 信息傳輸?shù)臉屑~,負(fù)責(zé)將 MQTT 客戶端發(fā)送來的信息傳遞給 MQTT 客戶端;MQTT 服務(wù)端還負(fù)責(zé)管理 MQTT
    的頭像 發(fā)表于 07-30 14:55 ?2219次閱讀