你有想過嗎,在計(jì)算機(jī)網(wǎng)絡(luò)當(dāng)中,數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端的?中間涉及到了哪些理論?
01 客戶端各層對數(shù)據(jù)的封裝
java實(shí)現(xiàn)客戶端的代碼如下:
應(yīng)用層會指定發(fā)送的服務(wù)器的域名(或者IP)和端口號、以及要發(fā)送數(shù)據(jù)的內(nèi)容,傳遞給下一層傳輸層。
傳輸層會在把應(yīng)用層的報(bào)文當(dāng)成自己的數(shù)據(jù),然后在前面拼接源端口號,和目標(biāo)端口號。
其中源端口號就是客戶端進(jìn)程監(jiān)聽的端口號,這個端口號一般不是固定的,由操作系統(tǒng)在49152~65535范圍內(nèi)動態(tài)分配,而目標(biāo)端口號就是服務(wù)器接收數(shù)據(jù)的端口號,一般是固定的,在java代碼中會指明。
網(wǎng)絡(luò)層會在傳輸層報(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ù)鏈路層會在網(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ù)器端在同一個網(wǎng)段,那么目標(biāo)MAC地址就是服務(wù)器的MAC地址),因?yàn)榭蛻舳烁揪蜔o法得知服務(wù)器的MAC地址,所以數(shù)據(jù)鏈路層采用下一跳的機(jī)制轉(zhuǎn)遞數(shù)據(jù)。
那么怎么知道我的下一跳是誰呢?
下面就要請出ARP協(xié)議了,ARP會發(fā)出一個廣播,告訴全世界:“大家好,我的IP地址是192.168.1.6,我的MAC地址是00-50-56-C0-88-01”
當(dāng)同一個網(wǎng)段上的主機(jī)接收到ARP報(bào)文時,會將這些信息添加自己的ARP緩沖區(qū)中的ARP列表,同時將自己的IP地址和MAC地址回應(yīng)給發(fā)送者,這樣每個位于同一個網(wǎng)段的主機(jī)都有整個網(wǎng)段內(nèi)各個主機(jī)的IP與MAC地址的對應(yīng)關(guān)系了。
ARP列表的具體內(nèi)容如下:
現(xiàn)在我的目標(biāo)IP是192.168.3.6,又不在這個ARP列表中,那我怎么知道目標(biāo)MAC地址要填啥呢?填下一跳的MAC地址,那么下一跳是又是誰呢?這里就要請出路由表了。
這個路由表是計(jì)算機(jī)的路由表,而不是路由器的路由表,這個路由表怎么來的呢?根據(jù)/etc/sysconfig/network-scripts/ifcfg-eth0這個文件生成的。
那么這個路由表怎么使用呢?將目標(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。
就這樣客戶端完成了對報(bào)文的組裝,交給物理層把數(shù)據(jù)從網(wǎng)卡發(fā)送出去,發(fā)送到交換機(jī)A。
02 交換機(jī)的交換
交換機(jī)收到客戶端的報(bào)文后,會進(jìn)行解析,只解析到數(shù)據(jù)鏈路層,從中獲得目標(biāo)MAC地址,然后查找ARP列表,將報(bào)文轉(zhuǎn)發(fā)給對應(yīng)的網(wǎng)卡端口。
交換機(jī)中的ARP列表:
根據(jù)目標(biāo)MAC地址00-30-F2-C1-2E-89找到交換機(jī)的端口為Fa2/1,這樣交換機(jī)就會把報(bào)文從這個端口發(fā)送出去,發(fā)送到路由器,這里的端口是交換機(jī)的物理端口,也就是插入網(wǎng)線的插口。
03 路由器的路由
路由器可以連接兩個不同的網(wǎng)絡(luò)。
路由器有一張路由表,路由表可以通過網(wǎng)絡(luò)工程師配置或者從其他路由器學(xué)習(xí)得到。
路由器會解析報(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ā)送出去即可。
另外路由器會將目標(biāo)MAC地址替換成下一跳的MAC地址(在這里是服務(wù)器的MAC地址,如果中間還有其他路由器,那么就是下一個路由器的MAC地址),怎么替換呢?還是查ARP表:
查詢IP192.168.3.6的MAC地址為0030.A396.5DE7然后將目標(biāo)MAC替換成這個,然后將數(shù)據(jù)從FastEthernet0/1端口發(fā)送出去,交給交換機(jī)B,交換機(jī)B再將數(shù)據(jù)轉(zhuǎn)發(fā)到服務(wù)器端。
04 服務(wù)器端各層對數(shù)據(jù)的解析
服務(wù)器端收到數(shù)據(jù)后會逐層進(jìn)行解析,最后將真正的數(shù)據(jù)交應(yīng)用程序進(jìn)行處理,至此一個數(shù)據(jù)從客戶端到服務(wù)器端就完成了,服務(wù)器端會發(fā)送響應(yīng)報(bào)文給客戶端,大體的流程類似,但是數(shù)據(jù)不一定是原路返回的,因?yàn)橹虚g經(jīng)過的路由可能不同。
05 擴(kuò)展
查看域名對應(yīng)的IP:
查看本機(jī)到服務(wù)器中間經(jīng)過了多少個路由節(jié)點(diǎn):
原文標(biāo)題:數(shù)據(jù)在網(wǎng)絡(luò)中是如何傳輸?shù)?/p>
文章出處:【微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7026瀏覽量
89026 -
計(jì)算機(jī)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
3文章
337瀏覽量
22164 -
服務(wù)器端
+關(guān)注
關(guān)注
0文章
2瀏覽量
975
原文標(biāo)題:數(shù)據(jù)在網(wǎng)絡(luò)中是如何傳輸?shù)?/p>
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論