你有想過(guò)嗎,在計(jì)算機(jī)網(wǎng)絡(luò)當(dāng)中,數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端的?中間涉及到了哪些理論?
01 客戶端各層對(duì)數(shù)據(jù)的封裝
java實(shí)現(xiàn)客戶端的代碼如下:
應(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ù)器的域名。
那么,首先需要通過(guò)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ú)法得知服務(wù)器的MAC地址,所以數(shù)據(jù)鏈路層采用下一跳的機(jī)制轉(zhuǎn)遞數(shù)據(jù)。
那么怎么知道我的下一跳是誰(shuí)呢?
下面就要請(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)系了。
ARP列表的具體內(nèi)容如下:
現(xiàn)在我的目標(biāo)IP是192.168.3.6,又不在這個(gè)ARP列表中,那我怎么知道目標(biāo)MAC地址要填啥呢?填下一跳的MAC地址,那么下一跳是又是誰(shuí)呢?這里就要請(qǐng)出路由表了。
這個(gè)路由表是計(jì)算機(jī)的路由表,而不是路由器的路由表,這個(gè)路由表怎么來(lái)的呢?根據(jù)/etc/sysconfig/network-scripts/ifcfg-eth0這個(gè)文件生成的。
那么這個(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列表:
根據(jù)目標(biāo)MAC地址00-30-F2-C1-2E-89找到交換機(jī)的端口為Fa2/1,這樣交換機(jī)就會(huì)把報(bào)文從這個(gè)端口發(fā)送出去,發(fā)送到路由器,這里的端口是交換機(jī)的物理端口,也就是插入網(wǎng)線的插口。
03 路由器的路由
路由器可以連接兩個(gè)不同的網(wǎng)絡(luò)。
路由器有一張路由表,路由表可以通過(guò)網(wǎng)絡(luò)工程師配置或者從其他路由器學(xué)習(xí)得到。
路由器會(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表:
查詢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ù)器端。
04 服務(wù)器端各層對(duì)數(shù)據(jù)的解析
服務(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)過(guò)的路由可能不同。
05 擴(kuò)展
查看域名對(duì)應(yīng)的IP:
查看本機(jī)到服務(wù)器中間經(jīng)過(guò)了多少個(gè)路由節(jié)點(diǎn):
原文標(biāo)題:數(shù)據(jù)在網(wǎng)絡(luò)中是如何傳輸?shù)?/p>
文章出處:【微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7229瀏覽量
90421 -
計(jì)算機(jī)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
3文章
342瀏覽量
22410 -
服務(wù)器端
+關(guān)注
關(guān)注
0文章
2瀏覽量
1003
原文標(biāo)題:數(shù)據(jù)在網(wǎng)絡(luò)中是如何傳輸?shù)?/p>
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
使用lwip socket udp功能,開發(fā)板為客戶端時(shí)不能夠接收服務(wù)器端發(fā)送過(guò)來(lái)的數(shù)據(jù) ?
MKW45B41Z客戶端無(wú)法從服務(wù)器獲取服務(wù)是為什么?
用隊(duì)列實(shí)現(xiàn)的1對(duì)N的TCP服務(wù)器端,自動(dòng)回復(fù)信息總發(fā)錯(cuò)客戶端
labview TCP客戶端
qt tcp程序在服務(wù)器端發(fā)送數(shù)據(jù)之前能接收客戶端發(fā)送的數(shù)據(jù)嗎?
labview怎么實(shí)現(xiàn)服務(wù)器端一直等待客戶端發(fā)送數(shù)據(jù)啊
怎么用key0,key2控制服務(wù)器端和客戶端知道有數(shù)據(jù)發(fā)送請(qǐng)求的?
TCP:多個(gè)客戶端向服務(wù)器發(fā)送數(shù)據(jù)
Tcp/ip客戶端示例:將數(shù)據(jù)發(fā)送到服務(wù)器的最佳方法是什么?
為什么LWIP的TCP客戶端服務(wù)器端斷開后繼續(xù)發(fā)送數(shù)據(jù)就無(wú)法檢測(cè)到連接狀態(tài)?
DHCP客戶端如何將主機(jī)名發(fā)送到服務(wù)器?
請(qǐng)問如何處理從客戶端到服務(wù)器的寫操作?
網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端和TCP服務(wù)器端應(yīng)用程序免費(fèi)下載

評(píng)論