1. 本地環境介紹
1.1網絡連接信息
本地使用Vmware搭建了多台虛擬機,對於PC而言,相當於多了一塊網卡,這塊網卡只能和內部通信(虛擬機)
每塊網卡都有自己的ip地址。
1.2 windows下ip地址
C:\WINDOWS\system32>ipconfig /all
Windows IP 配置
主機名 . . . . . . . . . . . . . : gc
主 DNS 后綴 . . . . . . . . . . . :
節點類型 . . . . . . . . . . . . : 混合
IP 路由已啟用 . . . . . . . . . . : 否
WINS 代理已啟用 . . . . . . . . . : 否
以太網適配器 以太網:
連接特定的 DNS 后綴 . . . . . . . :
物理地址. . . . . . . . . . . . . : 00-E0-70-03-41-F4
DHCP 已啟用 . . . . . . . . . . . : 是
自動配置已啟用. . . . . . . . . . : 是
IPv4 地址 . . . . . . . . . . . . : 192.168.0.109(首選)
子網掩碼 . . . . . . . . . . . . : 255.255.255.0
默認網關. . . . . . . . . . . . . : 192.168.0.1
DHCP 服務器 . . . . . . . . . . . : 192.168.0.1
DNS 服務器 . . . . . . . . . . . : 202.101.172.48,202.101.172.47
以太網適配器 VMware Network Adapter VMnet8:
描述. . . . . . . . . . . . . . . : VMware Virtual Ethernet Adapter for VMnet8
物理地址. . . . . . . . . . . . . : 00-50-56-C0-00-08
DHCP 已啟用 . . . . . . . . . . . : 是
自動配置已啟用. . . . . . . . . . : 是
IPv4 地址 . . . . . . . . . . . . : 192.168.134.1(首選)
子網掩碼 . . . . . . . . . . . . : 255.255.255.0
默認網關. . . . . . . . . . . . . :
DHCP 服務器 . . . . . . . . . . . : 192.168.134.254
主 WINS 服務器 . . . . . . . . . : 192.168.134.2
TCPIP 上的 NetBIOS . . . . . . . : 已啟用
1.3linux下ip地址
IP地址:192.168.134.128
mac: 00:0c:29:a1:11:93
默認網關: 192.168.134.2
1.4 WINS服務器和DNS服務器的區別
WINS服務器使用的是IP地址和計算機名稱的映射,DNS實現的是IP地址和域名的映射
WINS服務器的作用范圍是某個內部網絡,DNS服務器的作用范圍是整個互聯網
如上圖,虛擬機linux 192.168.134.128的默認網關為wins虛擬機網卡上配置的WINS服務器ip地址 192.168.134.2.
2. HTTP請求過程
2.1. ARP尋址
操作:先清除之前學到的arp信息,然后發起http請求(linux上安裝了httpd服務器,所以可以直接訪問80端口)
查看本地學到新的arp信息,mac同上(即為linux服務器192.168.134.128的mac地址)。
抓包分析如下:(看前兩行即可)
· 1.pc發送廣播請求,請求192.168.134.128的mac地址,報文信息:物理層的mac地址為 ff:ff:ff:ff:ff:ff(表示廣播), 網絡層的ip地址為192.168.134.128,mac為0(此時不知道目的mac)
2.192.168.134.128那台linux服務器收到arp請求后判斷請求的是自己的arp信息,於是發送單播應答給pc(192.168.134.1). 於是pc學到了mac地址,開始進行tcp請求。
備注:如果其它的linux開啟了arp代答功能,則可能會發送arp應答(如果它直到192.168.134.128這台服務器的mac地址的話)
2.2. TCP三次握手
http請求底層使用的是tcp連接,所以需要先發起tcp請求,下面抓包為tcp三次握手過程
1.客戶端192.168.134.1向服務端192.168.134.128發送SYN請求,序列化Seq為0
2.服務端向客戶端發送SYN請求,ACK為對SYN請求的應答,Seq=0,Ack=1 (Seq為本端發送數據的序列號,根據發送數據長度遞增,起始為0,Ack為應答序列號,值為對端Seq+1)
3.客戶端向服務端發送ACK,三次握手成功。
后面可以基於這條tcp連接發送數據了
理論圖片如下:
2.3 HTTP通信
通過google開發者工具(F12)可以看到請求內容和應答內容:
抓包內容如下(對應的data就是上圖中的http請求頭信息和應答信息):
2.4 TCP4次揮手
http通信之后,過一段時間(連接超時,如上圖為httpkeep-alive time為5秒)后tcp連接關閉,需要進行四次揮手。下面是抓包數據:
1.客戶端向服務端發送FIN請求
2.服務端恢復了ACK,作為對FIN的應答(表示收到關閉連接的請求,應答之后對端處於終止等待狀態,可以接受數據不能發送數據)
3.服務端發送FIN請求,表示服務端也關閉連接(服務端收到對端關閉請求之后可能上層需要做一些處理,在本端也關閉之前,仍然可以向客戶端發送數據)
4.客戶端收到服務端關閉連接請求FIN, 發送應答給服務端,四次揮手結束。(實際上這時還有個TIME_WAIT等待狀態,linux是等待一分鍾,可配置,這時的端口是可復用的)
備注:上述2,3兩步是用一個tcp包傳輸過來的,因為服務端連接也處於空閑狀態,所以收到關閉請求后自己也就隨之關閉了。
理論圖片如下: