你有想過嗎,在計算機網絡當中,數據是怎么樣保證準確的從客戶端發送到服務器端的?中間涉及到了哪些理論?
01 客戶端各層對數據的封裝
java實現客戶端的代碼如下:
應用層會指定發送的服務器的域名(或者IP)和端口號、以及要發送數據的內容,傳遞給下一層傳輸層。
傳輸層會在把應用層的報文當成自己的數據,然后在前面拼接源端口號,和目標端口號。
其中源端口號就是客戶端進程監聽的端口號,這個端口號一般不是固定的,由操作系統在49152~65535范圍內動態分配,而目標端口號就是服務器接收數據的端口號,一般是固定的,在java代碼中會指明。
網絡層會在傳輸層報文的基礎上增加源IP和目標IP,其中源IP就是本地網卡的IP地址,目標IP是服務器的IP,如果java代碼中指定的是服務器的域名。
那么,首先需要通過DNS服務器將域名解析為IP,域名解析的流程:
先查瀏覽器緩存->操作系統緩存->hosts文件->DNS服務器。
數據鏈路層會在網絡層的基礎上增加源MAC地址和目標MAC地址,其中源MAC地址就是本機網卡的MAC地址,目標MAC地址是下一跳網絡設備(一般是交換機或路由器)的MAC地址。
注意,目標MAC地址一般不是服務器的MAC地址(如果客戶端和服務器端在同一個網段,那么目標MAC地址就是服務器的MAC地址),因為客戶端根本就無法得知服務器的MAC地址,所以數據鏈路層采用下一跳的機制轉遞數據。
那么怎么知道我的下一跳是誰呢?
下面就要請出ARP協議了,ARP會發出一個廣播,告訴全世界:“大家好,我的IP地址是192.168.1.6,我的MAC地址是00-50-56-C0-88-01”
當同一個網段上的主機接收到ARP報文時,會將這些信息添加自己的ARP緩沖區中的ARP列表,同時將自己的IP地址和MAC地址回應給發送者,這樣每個位于同一個網段的主機都有整個網段內各個主機的IP與MAC地址的對應關系了。
ARP列表的具體內容如下:
現在我的目標IP是192.168.3.6,又不在這個ARP列表中,那我怎么知道目標MAC地址要填啥呢?填下一跳的MAC地址,那么下一跳是又是誰呢?這里就要請出路由表了。
這個路由表是計算機的路由表,而不是路由器的路由表,這個路由表怎么來的呢?根據/etc/sysconfig/network-scripts/ifcfg-eth0這個文件生成的。
那么這個路由表怎么使用呢?將目標IP與每一條記錄的子網掩碼(Genmask)一一按位與運算,匹配度最高的Destination字段的IP就是下一跳的IP192.168.1.100,也就是網關地址GATEWAY,然后根據下一跳的IP去查ARP列表獲得MAC地址00-30-F2-C1-2E-89。
就這樣客戶端完成了對報文的組裝,交給物理層把數據從網卡發送出去,發送到交換機A。
02 交換機的交換
交換機收到客戶端的報文后,會進行解析,只解析到數據鏈路層,從中獲得目標MAC地址,然后查找ARP列表,將報文轉發給對應的網卡端口。
交換機中的ARP列表:
根據目標MAC地址00-30-F2-C1-2E-89找到交換機的端口為Fa2/1,這樣交換機就會把報文從這個端口發送出去,發送到路由器,這里的端口是交換機的物理端口,也就是插入網線的插口。
03 路由器的路由
路由器可以連接兩個不同的網絡。
路由器有一張路由表,路由表可以通過網絡工程師配置或者從其他路由器學習得到。
路由器會解析報文到網絡層,然后發現目的IP是192.168.3.6,從上面的路由表可以可以發現,想要去192.168.3.0網段,只需要將數據從FastEthernet0/1端口發送出去即可。
另外路由器會將目標MAC地址替換成下一跳的MAC地址(在這里是服務器的MAC地址,如果中間還有其他路由器,那么就是下一個路由器的MAC地址),怎么替換呢?還是查ARP表:
查詢IP192.168.3.6的MAC地址為0030.A396.5DE7然后將目標MAC替換成這個,然后將數據從FastEthernet0/1端口發送出去,交給交換機B,交換機B再將數據轉發到服務器端。
04 服務器端各層對數據的解析
服務器端收到數據后會逐層進行解析,最后將真正的數據交應用程序進行處理,至此一個數據從客戶端到服務器端就完成了,服務器端會發送響應報文給客戶端,大體的流程類似,但是數據不一定是原路返回的,因為中間經過的路由可能不同。
05 擴展
查看域名對應的IP:
查看本機到服務器中間經過了多少個路由節點:
原文標題:數據在網絡中是如何傳輸的
文章出處:【微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
-
數據
+關注
關注
8文章
7255瀏覽量
91813 -
計算機網絡
+關注
關注
3文章
342瀏覽量
22760 -
服務器端
+關注
關注
0文章
2瀏覽量
1022
原文標題:數據在網絡中是如何傳輸的
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
使用lwip socket udp功能,開發板為客戶端時不能夠接收服務器端發送過來的數據 ?
MKW45B41Z客戶端無法從服務器獲取服務是為什么?
用隊列實現的1對N的TCP服務器端,自動回復信息總發錯客戶端
TCP:多個客戶端向服務器發送數據
Tcp/ip客戶端示例:將數據發送到服務器的最佳方法是什么?
為什么LWIP的TCP客戶端服務器端斷開后繼續發送數據就無法檢測到連接狀態?
DHCP客戶端如何將主機名發送到服務器?
請問如何處理從客戶端到服務器的寫操作?
網絡調試和串口調試集合UDP TCP客戶端和TCP服務器端應用程序免費下載

評論