OSI七層參考模型:
報文封裝過程
物理層、數據鏈路層、網絡層代表設備
物理層:網卡,網線,集線器,中繼器,調制解調器
數據鏈路層:網橋,交換機
網絡層:路由器
網關工作在第四層傳輸層及其以上
集線器是物理層設備,采用廣播的形式來傳輸信息。
交換機就是用來進行報文交換的機器。多為鏈路層設備(二層交換機),能夠進行地址學習,采用存儲轉發的形式來交換報文.。
路由器的一個作用是連通不同的網絡,另一個作用是選擇信息傳送的線路。選擇通暢快捷的近路,能大大提高通信速度,減輕網絡系統通信負荷,節約網絡系統資源,提高網絡系統暢通率。
交換機和路由器的區別
交換機擁有一條很高帶寬的背部總線和內部交換矩陣。交換機的所有的端口都掛接在這條總線上,控制電路收到數據包以后,處理端口會查找內存中的地址對照表以確定目的MAC(網卡的硬件地址)的NIC(網卡)掛接在哪個端口上,通過內部交換矩陣迅速將數據包傳送到目的端口,目的MAC若不存在則廣播到所有的端口,接收端口回應后交換機會“學習”新的地址,並把它添加入內部MAC地址表中。
使用交換機也可以把網絡“分段”,通過對照MAC地址表,交換機只允許必要的網絡流量通過交換機。通過交換機的過濾和轉發,可以有效的隔離廣播風暴,減少誤包和錯包的出現,避免共享沖突。
交換機在同一時刻可進行多個端口對之間的數據傳輸。每一端口都可視為獨立的網段,連接在其上的網絡設備獨自享有全部的帶寬,無須同其他設備競爭使用。當節點A向節點D發送數據時,節點B可同時向節點C發送數據,而且這兩個傳輸都享有網絡的全部帶寬,都有着自己的虛擬連接。假使這里使用的是10Mbps的以太網交換機,那么該交換機這時的總流通量就等於2×10Mbps=20Mbps,而使用10Mbps的共享式HUB時,一個HUB的總流通量也不會超出10Mbps。
總之,交換機是一種基於MAC地址識別,能完成封裝轉發數據包功能的網絡設備。交換機可以“學習”MAC地址,並把其存放在內部地址表中,通過在數據幀的始發者和目標接收者之間建立臨時的交換路徑,使數據幀直接由源地址到達目的地址。
路由器的作用與交換機和網橋非常相似。但是與工作在網絡物理層,從物理上划分網段的交換機不同,路由器使用專門的軟件協議從邏輯上對整個網絡進行划分。例如,一台支持IP協議的路由器可以把網絡划分成多個子網段,只有指向特殊IP地址的網絡流量才可以通過路由器。對於每一個接收到的數據包,路由器都會重新計算其校驗值,並寫入新的物理地址。因此,使用路由器轉發和過濾數據的速度往往要比只查看數據包物理地址的交換機慢。但是,對於那些結構復雜的網絡,使用路由器可以提高網絡的整體效率。路由器的另外一個明顯優勢就是可以自動過濾網絡廣播。
集線器與路由器在功能上有什么不同?
首先說HUB,也就是集線器。它的作用可以簡單的理解為將一些機器連接起來組成一個局域網。而交換機(又名交換式集線器)作用與集線器大體相同。但是兩者在性能上有區別:集線器采用的式共享帶寬的工作方式,而交換機是獨享帶寬。這樣在機器很多或數據量很大時,兩者將會有比較明顯的。而路由器與以上兩者有明顯區別,它的作用在於連接不同的網段並且找到網絡中數據傳輸最合適的路徑。路由器是產生於交換機之后,就像交換機產生於集線器之后,所以路由器與交換機也有一定聯系,不是完全獨立的兩種設備。路由器主要克服了交換機不能路由轉發數據包的不足。
IP
IP數據報格式
IP數據報分為兩個部分,首部和數據部分(TCP、UDP),首部分為固定部分和可變部分。
IPv4
IPv4分類地址
特殊IP地址
IPv6
IPv6數據報格式
IPv4與 IPv6區別
TCP
UDP
UDP首部格式
UDP實現可靠傳輸
三種使用UDP進行可靠數據傳輸的協議
RUDP、RTP、UDT
RUDP(Reliable User Datagram Protocol)
可靠用戶數據報協議(RUDP)是一種基於可靠數據協議(RDP: RFC908 和 1151 (第二版))的簡單分組傳輸協議。作為一個可靠傳輸協議,RUDP 用於傳輸 IP 網絡間的電話信號。它允許獨立配置每個連接屬性,這樣在不同的平台可以同時實施不同傳輸需求下的協議。
RUDP 提供一組數據服務質量增強機制,如擁塞控制的改進、重發機制及淡化服務器算法等,從而在包丟失和網絡擁塞的情況下, RTP 客戶機(實時位置)面前呈現的就是一個高質量的 RTP 流。在不干擾協議的實時特性的同時,可靠 UDP 的擁塞控制機制允許 TCP 方式下的流控制行為。
為了與網絡 TCP 通信量同時工作, RUDP 使用類似於 TCP 的重發機制和擁塞控制算法。在最大化利用可用帶寬上,這些算法都得到了很好的證明。
RUDP特性
客戶機確認響應服務器發送給客戶機的包;
視窗和擁塞控制,服務器不能超出當前允許帶寬;
一旦發生包丟失,服務器重發給客戶機;
比實時流更快速,稱為“緩存溢出”。
用戶數據報協議(UDP)
RTP(Real Time Protocol)
RTP,實時協議被用來為應用程序如音頻,視頻等的實時數據的傳輸提供端到端(end to end)的網絡傳輸功能。傳輸的模型可以是單點傳送或是多點傳送。數據傳輸被一個姐妹協議——實時控制協議(RTCP)來監控,后者允許在一個大的多點傳送網絡上監視數據傳送,並且提供最小限度的控制和識別功能。
RTP是被IETF在RFC1889中提出來的。順帶提及,RTP已經被接受為實時多媒體傳送的通用標准。ITU-T跟IETF都在各自的系統中將這一協議標准化。
1.1 為何需要RTP?
TCP不能支持像交互視頻,會議等的實時服務,這一原因是由於TCP只是一個“慢”協議,需要三次握手。就此在IP層上UDP是一個比TCP更好的選擇。但是UDP是本質上是一個不可靠協議,不支持在包丟情況下的重傳機制。誠然,UDP有一些特性,比如多路復用跟校驗和服務,這些都是對實時服務很有利的。為了消除UDP的缺點,RTP是作為應用層而被提出來的。
RTP提供的各種服務包括有效負載識別,序列編號,時間戳和投遞監聽。RTP能夠序列化包,當這些包在收端不是按順序到達的時。序列號也能被用來識別包丟失。時間戳被用於媒體有效的播放。到達的數據一直被RTCP監聽,以通知RTP層來校正其編碼和傳輸的參數。例如,如果RTCP層檢測到包丟失,它會通知RTP層減緩發送速率。
盡管RTP有助於實時媒體的有效的播放 ,但是要注意的是RTP自身並不提供任何機制來確保及時傳遞或提供其他服務質量(QoS)的保證,而是依靠低層服務來完成這些。同樣,RTP也不保證投遞或防止無序投遞。RTP被設計出來主要是為了滿足有多個參加者的多媒體會議的需要。RTP也同樣適合於象持續數據的儲存,分布式交互仿真,主動標記以及應用程序的控制和測量。
1.2 RTP特性一覽
RTP提供有效負荷類型識別,亂序重排和利用時間戳的媒體有效播放。
RTCP監控服務質量,也提供在一個當前進行的會話中傳送關於參加者的信息作用。
RTP對於下層協議是獨立的,它能夠工作在像TCP/IP,ATM,幀時延等類型的網絡上。
如果被下層網絡支持,RTP支持利用多路技術的對於多點的數據傳輸。
RTP序列號也能被用來確定包的合適位置。例如在視頻解碼,包無需按序解碼。
UDT(UDP-based Data Transfer Protocol)
基於UDP的數據傳輸協議(UDP-based Data Transfer Protocol,簡稱UDT)是一種互聯網數據傳輸協議。UDT的主要目的是支持高速廣域網上的海量數據傳輸,而互聯網上的標准數據傳輸協議TCP在高帶寬長距離網絡上性能很差。 顧名思義,UDT建於UDP之上,並引入新的擁塞控制和數據可靠性控制機制。UDT是面向連接的雙向的應用層協議。它同時支持可靠的數據流傳輸和部分可靠的數據報傳輸。 由於UDT完全在UDP上實現,它也可以應用在除了高速數據傳輸之外的其它應用領域,例如點到點技術(P2P),防火牆穿透,多媒體數據傳輸等等。
UDT是雙工的,每個UDT實體有兩個部分:發送和接收。發送者根據流量控制和速率控制來發送(和重傳)應用程式數據。接收者接收數據包和控制包,並根據接收到的包發送控制包。發送和接收程式共享同一個UDP端口來發送和接收。
接收者也負責觸發和處理任何的控制事件,包括擁塞控制和可靠性控制和他們的相對機制,例如RTT估計、帶寬估計、應答和重傳。
UDT總是試着將應用層數據打包成固定的大小,除非數據不夠這么大。和TCP相似的是,這個固定的包大小叫做MSS(最大包大小)。由於期望UDT用來傳輸大塊數據流,我們假定只有很小的一部分不規則的大小的包在UDT session中。MSS能夠通過應用程式來安裝,MTU是其最優值(包括任何包頭)。
UDT擁塞控制算法將速率控制和窗口(流量控制)合並起來,前者調整包的發送周期,后者限制最大的位被應答的包。在速率控制中使用的參數通過帶寬估計技術來更新,他繼承來自基於接收的包方法。同時,速率控制周期是估計RTT的常量,流控制參數依賴於對方的數據到達速度,另外接收端釋放的緩沖區的大小。
UDP構建可靠數據傳輸
簡單來講,要使用UDP來構建可靠的面向連接的數據傳輸,就要實現類似於TCP協議的超時重傳,有序接受,應答確認,滑動窗口流量控制等機制,等於說要在傳輸層的上一層(或者直接在應用層)實現TCP協議的可靠數據傳輸機制,比如使用UDP數據包+序列號,UDP數據包+時間戳等方法,在服務器端進行應答確認機制,這樣就會保證不可靠的UDP協議進行可靠的數據傳輸。
HTTP
瀏覽器輸入一個URL后的過程
當我們在瀏覽器中輸入一個網址,比如www.google.cn,瀏覽器就會加載出百度的主頁。那么瀏覽器背后完成的具體是怎么樣的呢?
總結起來大概的流程是這樣的:
(1)瀏覽器本身是一個客戶端,當你輸入URL的時候,首先瀏覽器會去請求DNS服務器,通過DNS獲取相應的域名對應的IP
(2)然后通過IP地址找到IP對應的服務器后,要求建立TCP連接
(3)瀏覽器發送完HTTP Request(請求)包后,服務器接收到請求包之后才開始處理請求包
(4)在服務器收到請求之后,服務器調用自身服務,返回HTTP Response(響應)包
(5)客戶端收到來自服務器的響應后開始渲染這個Response包里的主體(body),等收到全部的內容隨后斷開與該服務器之間的TCP
瀏覽器輸入url訪問的過程
前言
當我們在瀏覽器中輸入一個網址,比如www.google.cn,瀏覽器就會加載出百度的主頁。那么瀏覽器背后完成的具體是怎么樣的呢?
總結起來大概的流程是這樣的:
(1)瀏覽器本身是一個客戶端,當你輸入URL的時候,首先瀏覽器會去請求DNS服務器,通過DNS獲取相應的域名對應的IP
(2)然后通過IP地址找到IP對應的服務器后,要求建立TCP連接
(3)瀏覽器發送完HTTP Request(請求)包后,服務器接收到請求包之后才開始處理請求包
(4)在服務器收到請求之后,服務器調用自身服務,返回HTTP Response(響應)包
(5)客戶端收到來自服務器的響應后開始渲染這個Response包里的主體(body),等收到全部的內容隨后斷開與該服務器之間的TCP連接。
就可以用下面的這幅圖來進行解釋
1. DNS解析
在瀏覽器中輸入的是一個網址,是不能直接用來進行連接的,因而就要使用DNS地址解析將輸入的URL網址轉換為IP地址。查找的流程圖是這樣的
具體的查找過程和策略可以分為下面這幾步:
(1)在瀏覽器中輸入www.google.cn域名,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關系,如果有,就先調用這個IP地址映射,完成域名解析。
(2)如果hosts里沒有這個域名的映射,則查找本地DNS解析器緩存,是否有這個網址映射關系,如果有,直接返回,完成域名解析。
(3)如果hosts與本地DNS解析器緩存都沒有相應的網址映射關系,首先會找TCP/IP參數中設置的首選DNS服務器,在此我們叫它本地DNS服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。
(4)如果要查詢的域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關系,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。
(5)如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13台根DNS,根DNS服務器收到請求后會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息后,將會聯系負責.com域的這台服務器。這台負責.com域的服務器收到請求后,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(google.com)給本地DNS服務器。當本地DNS服務器收到這個地址后,就會找google.com域服務器,重復上面的動作,進行查詢,直至找到www.google.com主機。
(6)如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根DNS或把轉請求轉至上上級,以此循環。不管是本地DNS服務器用是是轉發,還是根提示,最后都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。
2. Socket建立連接
當我們輸入這樣一個請求時,首先要建立一個socket連接,因為socket是通過ip和端口建立的,所以之前還有一個DNS解析過程,把www.google.com變成ip,如果url里不包含端口號,則會使用該協議的默認端口號。
3. 發送HTTP請求
連接成功建立后,開始向web服務器發送請求,當瀏覽器向Web服務器發出請求時,它向服務器傳遞了一個數據塊,也就是請求信息,HTTP請求信息由3部分組成:
(1)請求方法URI協議/版本
(2)請求頭(Request Header)
(3)請求正文
下面是一個HTTP請求的例子:
-
GET /sample.jsp HTTP/1.1
-
Accept:image/gif.image/jpeg,*/*
-
Accept-Language:zh-cn
-
Connection:Keep-Alive
-
Host:localhost
-
User-Agent:Mozila/ 4.0(compatible;MSIE5.01;Window NT5.0)
-
Accept-Encoding:gzip,deflate
-
username=jinqiao&password= 1234
3.1 請求方法URI協議/版本
請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1``
/sample.jsp
以上代碼中“GET”代表請求方法,表示URI,
HTTP/1.1“`代表協議和協議的版本。
根據HTTP標准,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。
URL完整地指定了要訪問的網絡資源,通常只要給出相對於服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最后,協議版本聲明了通信過程中使用HTTP的版本。
3.2 請求頭(Request Header)
請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
-
Accept:image/gif.image/jpeg.*/*
-
Accept-Language:zh-cn
-
Connection:Keep-Alive
-
Host:localhost
-
User-Agent:Mozila/ 4.0(compatible:MSIE5.01:Windows NT5.0)
-
Accept-Encoding:gzip,deflate.
3.3 請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
username=jinqiao&password=1234
在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。
3.4 HTTP請求方法:GET方法與POST方法
3.4.1 GET方法
GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作為URL的一部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在着安全隱患上。例如Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之后的內容)另外由於GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大
3.4.2 POST方法
POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。POST方法克服了GET方法的一些缺點。通過POST方法提交表單數據時,數據不是作為URL請求的一部分而是作為標准數據傳送給Web服務器,這就克服了GET方法中的信息無法保密和數據量太小的缺點。因此,出於安全的考慮以及對用戶隱私的尊重,通常表單提交時采用POST方法。
3.5 各種HTTP請求的含義
GET
通過請求URI得到資源
POST
用於添加新的內容
PUT
用於修改某個內容
DELETE
刪除某個內容
CONNECT
用於代理進行傳輸,如使用SSL
OPTIONS
詢問可以執行哪些方法
PATCH
部分文檔更改
PROPFIND
查看屬性
PROPPATCH
設置屬性
MKCOL
創建集合(文件夾)
COPY
拷貝
MOVE
移動
LOCK
加鎖
UNLOCK
解鎖
TRACE
用於遠程診斷服務器
HEAD
類似於GET, 但是不返回body信息,用於檢查對象是否存在,以及得到對象的元數據
4. 服務器響應
應答 web服務器收到這個請求,進行處理。從它的文檔空間中搜索子目錄mydir的文件index.html。如果找到該文件,Web服務器把該文件內容傳送給相應的Web瀏覽器。為了告知瀏覽器,Web服務器首先傳送一些HTTP頭信息,然后傳送具體內容(即HTTP體信息),HTTP頭信息和HTTP體信息之間用一個空行分開。
4.1 HTTP響應報文頭
HTTP應答與HTTP請求相似,HTTP響應也由3個部分構成,分別是:
(1)協議狀態版本代碼描述
(2)響應頭(Response Header)
(3)響應正文
下面是一個HTTP響應的例子:
-
HTTP/1.1 200 OK
-
Server:Apache Tomcat/5.0.12
-
Date:Mon,6Oct2003 13:23:42 GMT
-
Content-Length:112
-
-
<html>
-
<head>
-
<title>HTTP響應示例<title>
-
</head>
-
<body>
-
Hello HTTP!
-
</body>
-
</html>
協議狀態代碼描述HTTP響應的第一行類似於HTTP請求的第一行,它表示通信所用的協議是HTTP1.1服務器已經成功的處理了客戶端發出的請求(200表示成功):HTTP/1.1 200 OK
響應頭(Response Header)響應頭也和請求頭一樣包含許多有用的信息,例如服務器類型、日期時間、內容類型和長度等:
-
Server:Apache Tomcat/5.0.12
-
Date:Mon,6Oct2003 13:13:33 GMT
-
Content-Type: text/html
-
Last-Moified:Mon, 6 Oct 2003 13:23:42 GMT
-
Content-Length: 112
響應正文響應正文就是服務器返回的HTML頁面:
-
<html>
-
<head>
-
<title>HTTP響應示例<title>
-
</head>
-
<body>
-
Hello HTTP!
-
</body>
-
</html>
響應頭和正文之間也必須用空行分隔。
4.2 HTTP應答碼
HTTP應答碼也稱為狀態碼,它反映了Web服務器處理HTTP請求狀態。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的類型:
1XX-信息類(Information),表示收到Web瀏覽器請求,正在進一步的處理中
2XX-成功類(Successful),表示用戶請求被正確接收,理解和處理例如:200 OK
3XX - 重定向類(Redirection),表示請求沒有成功,客戶必須采取進一步的動作。
4XX - 客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOT Found,意味着請求中所引用的文檔不存在。
5XX - 服務器錯誤(Server Error)表示服務器不能完成對請求的處理:如 500
對於我們Web開發人員來說掌握HTTP應答碼有助於提高Web應用程序調試的效率和准確性。
5. 關閉連接
當應答結束后,Web瀏覽器與Web服務器必須斷開,以保證其它Web瀏覽器能夠與Web服務器建立連接。
[計算機網絡]TCP三次握手、四次揮手
TCP三次握手可以形象的用下圖中的例子來說明
三次握手:
四次揮手:
SDP: Session Description Protocol(會話描述協議)
SDP: Session Description Protocol(會話描述協議)