上篇講了OSI的七層模型,該模型將網絡分爲七個層次每個層次之間各司其職互不干擾是一種非常優秀的設計。OSI七層模型是一種非常理想的模型但在現實中使用的是TCP/IP協議(傳輸控制協議/英特網互聯協議),它只有四層大大簡化了網絡的層次。但TCP/IP協議族並不包括物理層和數據鏈路層,因此它不能獨立的完成計算機網絡系統的功能,它必須與其他的協議協同工作。該協議族中最重要的是處於網絡層的IP協議與運輸層TCP協議!
1、鏈路層(網絡接口層)
該層的功能是負責接收上層的IP數據報並將其封裝成幀通過網絡發送或者從網絡上接收物理幀抽出IP數據報交給網絡層。在傳輸過程中實現透明傳輸(字節填充法)、差錯檢驗等功能。幀作爲該層傳輸的單位。
2、網絡層
負責相鄰計算機之間的通信。其功能包括三方面。
一、處理來自傳輸層的分組發送請求,收到請求後將分組裝入IP數據報,填充報頭選擇去往目標主機的路徑然後數據報發往適當的網絡接口
二、處理接收的數據報:首先檢查其合法性,然後進行尋址,假如該數據報已到達目標主機則去掉報頭,將剩餘部分交往適當的傳輸協議;若該數據報尚未到達目標主機則轉發該數據報。
三、處理路徑 路徑選擇、流量控制、擁塞控制(通過ICMP協議)等問題。網絡層的協議包括:IP(Internet protocol)協議、ICMP(Internet control message protocol)網際控制報文協議、ARP(address resolution protocol)地址解析協議。IP協議是網絡層的核心,通過路由選擇將下一跳IP封裝後交給接口層。IP數據報是無連接服務。ICMP是網絡層的補充,可以回送報文用來檢驗網絡是否通暢。ping命令就是發送ICMP的echo包,通過回送的echo relay進行網絡測試。路由選擇協議分爲:內部網關協議IGP(如RIP、OSPF)與外部網關協議。在這一層的數據單位稱爲數據報。
3、傳輸層
網絡層負責點到點的傳輸(這裏的點指主機或路由器)而傳輸層負責端到端的傳輸(這裏的端指源主機和目標主機)
提供應用程序間的通信,其功能包括:
一、格式化信息流
二、提供可靠傳輸
傳輸的協議主要是:傳輸控制協議TCP與用戶數據報協議。在這一層數據的單位稱爲段。
在該層的倆個重量級協議:傳輸控制協議TCP、用戶數據報協議UDP。
傳輸控制協議TCP
B的TCP服務器進程先創建傳輸控制塊TCB進入LISTEN狀態。
A的TCP客戶進程也是首先創建傳輸控制模塊TCB後,向B發出連接請求報文段,這時同步位SYN=1,初始序號seq=x(TCP規定SYN=1的報文段不能攜帶數據,但要消耗一個序號)此時客戶端進入SYN-SENT(同步已發送)狀態、
B收到連接請求後,如果同意建立連接則向A發送確認,SYN同步位,ACK確認位置1,確認位ack=x+1,同時爲自己選擇一個初始序號seq=y,此時服務器進入SYN-RCVD同步收到狀態,
客戶端收到B的確認後,還要向B確認,ACK=1,ack=y+1,seq=x+1.此時A進入ESTABLISHED(已建立連接)狀態,當B收到確認後也進入建立連接狀態。
爲什麼還需要第三次的握手呢?原因如下:A向B發送連接請求,長時間未收到B的迴應由於超時重傳機制,A再一次發送連接請求後來收到了確認建立了連接,數據傳輸完之後就釋放了連接。但此時前一次發送的請求可能並沒有丟失而是由於在某個網絡節點長時間滯留了,以至到連接釋放後的某個時間纔到達B。此時B誤認爲A又發送了一次連接請求,假如不採用三次握手則B端就進入連接建立狀態,向A發送確認請求而一直等待A發送的數據,而A沒有發送請求因此不會理睬B的確認,這樣B的許多資源就這樣白白浪費了。
連接釋放(四次揮手)
數據傳輸完後雙方都能夠釋放連接,A的應用進程先向TCP發送連接釋放報文段,並停止發送數據主動關閉連接,FIN置1,序號seq=u,它的值爲前面傳送過的數據最後一個字-節序號加1,此時A進入FIN-WAIT-1(終止等待1)狀態,FIN報文段即便不帶數據也將消耗一個序號
B收到接連釋放報文段後立即發送確認,確認號ack=u+1,ACK=1,seq=v爲B前面已傳送過的數據的最後一個字節的序號+1,B進入CLOSE-WAIT關閉等待狀態,注意此時從A到B方向的連接就釋放了,TCP處於半關閉狀態,要完全關閉還需要B向A方向關閉!A收到來自B的確認後就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段
若B已經沒有要向A發送的數據時,發送關閉連接報文段FIN=1,ACK=1,seq=w,ack=u+1重複上次已發送的確認號,此時B進入LASE-ACK最後確認狀態,
A在收到B的連接釋放報文段後必須對此確認,ACK=1 確認號ack=w+1,seq=u+1,然後進入TIME-WAIT(時間等待)狀態。等待倆個MSL(最長報文段壽命)後A才進入CLOSE狀態。
爲什麼最後需要等待倆個最長報文段壽命時間呢?
倆點理由:第一爲了保證A發送的最有一個ACK報文段能夠到達B。這個ACK報文段有可能丟失,因而使處在LAST-ACK狀態的B收不到對已發送的FIN和ACK報文段的確認。B會超時重傳這個FIN和ACK報文段,而A就能在2MSL時間內收到這個重傳的ACK+FIN報文段。接着A重傳一次確認
第二、就是防止上面提到的已失效的連接請求報文段出現在本連接中,A在發送完最有一個ACK報文段後,再經過2MSL,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失。
用戶數據報協議UDP
TCP、UDP比較
- TCP協議是有連接的,有連接的意思是開始傳輸實際數據之前TCP的客戶端和服務器端必須通過三次握手建立連接,會話結束之後也要結束連接。而UDP是無連接的
- TCP協議保證數據按序發送,按序到達,提供超時重傳來保證可靠性,但是UDP不保證按序到達,甚至不保證到達,只是努力交付,即便是按序發送的序列,也不保證按序送到。
- TCP協議所需資源多,TCP首部需20個字節(不算可選項),UDP首部字段只需8個字節。
- TCP有流量控制和擁塞控制,UDP沒有,網絡擁堵不會影響發送端的發送速率
- TCP是一對一的連接,而UDP則可以支持一對一,多對多,一對多的通信。
- TCP面向的是字節流的服務,UDP面向的是報文的服務。
- 多播的信息一定要用udp實現,因爲tcp只支持一對一通信。
- 如果一個應用場景中大多是簡短的信息,適合用udp實現,因爲udp是基於報文段的,它直接對上層應用的數據封裝成報文段,然後丟在網絡中,如果信息量太大,會在鏈路層中被分片,影響傳輸效率。
- 如果一個應用場景重性能甚於重完整性和安全性,那麼適合於udp,比如多媒體應用,缺一兩幀不影響用戶體驗,但是需要流媒體到達的速度快,因此比較適合用udp
- 如果要求快速響應,那麼udp聽起來比較合適
- 如果又要利用udp的快速響應優點,又想可靠傳輸,那麼只能考上層應用自己制定規則了。
- 常見的使用udp的例子:ICQ,QQ的聊天模塊。