目錄
上網的基本流程(網絡通信原理)
一 普通URL的組成
#### 協議--域名--端口--虛擬目錄--文件名
以如下url為例:
`http://www.aspxfans.com:8080/news/index.asp`
### 1 協議部分
該URL的協議部分為“http:”,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"后面的“//”為分隔符。
### 2 域名部分
該URL的域名部分為“`www.aspxfans.com`”。一個URL中,也可以使用IP地址作為域名使用
### 3 端口部分
跟在域名后面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口80。
### 4 虛擬目錄部分
從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/news/”。
### 5 文件名部分
從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名。
二 網絡通信的實現
1 實現網絡通信,主機需具備的四要素
(1) 本機的IP地址
(2) 子網掩碼
(3) 網關的IP地址
(4) DNS的IP地址
2 獲取四要素的兩種方式
(1) 靜態獲取
即手動配置
(2) 動態獲取
通過dhcp獲取
3 四要素獲取的詳細流程
以太網頭 | ip頭 | udp頭 | dhcp數據包 |
---|---|---|---|
(1) 最前面的”以太網標頭”,設置發出方(本機) 的MAC地址和接收方(DHCP服務器) 的MAC地址。前者就是本機網卡的MAC地址,后者這時不知道,就填入一個廣播地址:FF-FF-FF-FF-FF-FF。
(2) 后面的”IP標頭”,設置發出方的IP地址和接收方的IP地址。這時,對於這兩者,本機都不知道。於是,發出方的IP地址就設為0.0.0.0,接收方的IP地址設為255.255.255.255。
(3) 最后的”UDP標頭”,設置發出方的端口和接收方的端口。這一部分是DHCP協議規定好的,發出方是68端口,接收方是67端口。
這個數據包構造完成后,就可以發出了。以太網是廣播發送,同一個子網絡的每台計算機都收到了這個包。因為接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是發給誰的,所以每台收到這個包的計算機,還必須分析這個包的IP地址,才能確定是不是發給自己的。當看到發出方IP地址是0.0.0.0,接收方是255.255.255.255,於是DHCP服務器知道”這個包是發給我的”,而其他計算機就可以丟棄這個包。
接下來,DHCP服務器讀出這個包的數據內容,分配好IP地址,發送回去一個”DHCP響應”數據包。這個響應包的結構也是類似的,以太網標頭的MAC地址是雙方的網卡地址,IP標頭的IP地址是DHCP服務器的IP地址(發出方) 和255.255.255.255(接收方) ,UDP標頭的端口是67(發出方) 和68(接收方) ,分配給請求端的IP地址和本網絡的具體參數則包含在Data部分。
新加入的計算機收到這個響應包,於是就知道了自己的IP地址、子網掩碼、網關地址、DNS服務器等等參數。
三 網絡通信的流程**
1 從本機獲取四要素
(1) 本機的IP地址:192.168.1.100
(2) 子網掩碼:255.255.255.0
(3) 網關的IP地址:192.168.1.1
(4) DNS的IP地址:8.8.8.8
2 打開瀏覽器,想要訪問Google,在地址欄輸入了網址:www.google.com
。
3 dns協議(基於udp協議)
# 1) 13台根dns:
A.root-servers.net198.41.0.4美國
B.root-servers.net192.228.79.201美國(另支持IPv6)
C.root-servers.net192.33.4.12法國
D.root-servers.net128.8.10.90美國
E.root-servers.net192.203.230.10美國
F.root-servers.net192.5.5.241美國(另支持IPv6)
G.root-servers.net192.112.36.4美國
H.root-servers.net128.63.2.53美國(另支持IPv6)
I.root-servers.net192.36.148.17瑞典
J.root-servers.net192.58.128.30美國
K.root-servers.net193.0.14.129英國(另支持IPv6)
L.root-servers.net198.32.64.12美國
M.root-servers.net202.12.27.33日本(另支持IPv6)
# 2) 域名定義:
`http://jingyan.baidu.com/article/1974b289a649daf4b1f774cb.html`
# 3) 頂級域名:
以.com,.net,.org,.cn等等屬於國際頂級域名,根據目前的國際互聯網域名體系,國際頂級域名分為兩類:類別頂級域名(gTLD)和地理頂級域名(ccTLD)兩種。類別頂級域名是 以"COM"、"NET"、"ORG"、"BIZ"、"INFO"等結尾的域名,均由國外公司負責管理。地理頂級域名是以國家或地區代碼為結尾的域名,如"CN"代表中國,"UK"代表英國。地理頂級域名一般由各個國家或地區負責管理。
# 4) 二級域名:
二級域名是以頂級域名為基礎的地理域名,比喻中國的二級域有,.com.cn,.net.cn,.org.cn,.gd.cn等.子域名是其父域名的子域名,比喻父域名是abc.com,子域名就是`www.abc.com`或者`.abc.com.`
一般來說,二級域名是域名的一條記錄,比如`alidiedie.com`是一個域名,`www.alidiedie.com`是其中比較常用的記錄,一般默認是用這個,但是類似`.alidiedie.com`的域名全部稱作是`alidiedie.com`的二級
4 HTTP部分的內容,類似於下面這樣:
GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1) ……
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Cookie: … …
5 TCP協議
TCP數據包需要設置端口,接收方(Google) 的HTTP端口默認是80,發送方(本機) 的端口是一個隨機生成的1024-65535之間的整數,假定為51775。
TCP數據包的標頭長度為20字節,加上嵌入HTTP的數據包,總長度變為4980字節。
6 IP協議
然后,TCP數據包再嵌入IP數據包。IP數據包需要設置雙方的IP地址,這是已知的,發送方是192.168.1.100(本機) ,接收方是172.194.72.105(Google) 。
IP數據包的標頭長度為20字節,加上嵌入的TCP數據包,總長度變為5000字節。
7 以太網協議
最后,IP數據包嵌入以太網數據包。以太網數據包需要設置雙方的MAC地址,發送方為本機的網卡MAC地址,接收方為網關192.168.1.1的MAC地址(通過ARP協議得到) 。
以太網數據包的數據部分,最大長度為1500字節,而現在的IP數據包長度為5000字節。因此,IP數據包必須分割成四個包。因為每個包都有自己的IP標頭(20字節) ,所以四個包的IP數據包的長度分別為1500、1500、1500、560。
8 服務器端響應
經過多個網關的轉發,Google的服務器172.194.72.105,收到了這四個以太網數據包。
根據IP標頭的序號,Google將四個包拼起來,取出完整的TCP數據包,然后讀出里面的”HTTP請求”,接着做出”HTTP響應”,再用TCP協議發回來。
本機收到HTTP響應以后,就可以將網頁顯示出來,完成一次網絡通信。
四 瀏覽器輸入網址之后做了啥
# 瀏覽器輸入網址之后做了啥
# python django框架+uwsgi服務器版本 MTV
瀏覽器輸入url網址----》瀏覽器緩存解析----》本機host文件dns解析----》網絡dns查詢(先本地再網絡)----》返回url網址對應的ip地址----》瀏覽器和目標服務器建立TCP連接----》發送HTTP-GET請求----》nginx做負載均衡----》Web框架(Django、Flask)的web服務器根據協議【CGI(FastCGI/WSGI/ASGI)】解析HTTP請求信息,存入系統環境變量 environ 、以及request對象中----》根據url控制器解析出的地址進行判斷相應的視圖函數----》在視圖層執行視圖函數----》去模型層查找數據,模型層在數據庫中取數據----》將要展示的數據返回給視圖函數----》模板曾渲染模板----》通過uwsgi服務器return返回 environ start_response ----》通過tcp協議傳輸----》用戶拿到數據,瀏覽器進行解包渲染頁面。