計算機網路——傳輸層(二)
傳輸層位於端系統中,也就是位於‘網路邊緣’。傳輸層也有很多協議,但目前用的比較多的是UDP協議和TCP協議。
在認識UDP協議和TCP協議之前,先介紹兩個概念——多路複用與多路分解。
多路複用與多路分解
先對傳輸層有個基本瞭解,應用層通過套接字介面向傳輸層傳遞資料,傳輸層再通過網路向接收端的套接字介面傳遞資料。多路複用與多路分解是用來管理資料如何流向或流出套接字介面的。
當主機A中各個程序產生網路資料時,並將這些資料流向套接字介面後,傳輸層協議負責收集這些資料,然後將這些資料送上網路,我們稱這個過程為多路複用。
當主機B收到網路資料時,傳輸層協議負責收集這些資料,然後通過資料報文中的資訊,將這些資料分別送到指定埠的程序中去,我們稱這個過程為多路分解
對於UDP協議來說,主機A的埠可以理解能直接與主機B的埠打交道。傳送端A產生報文,報文中指定了接收端B的IP地址和埠號,通過UDP協議,資料能直接由A的傳送埠流向B的接收埠。
對於TCP協議來說,在接收端B會有一個‘歡迎套接字’,這個套接字埠會監聽網路上的各個TCP請求,當某個TCP請求初次到來的時候,這個歡迎套接字埠會為這個請求自動分配一個隱式埠,我們無法知道這個埠的埠號,但確實有這麼個埠被打開了。通過這個過程,傳送端和接收端建立了連線,當傳送端再次傳送請求報文的時候,這個歡迎套接字就會將這個報文傳遞給之前開啟的那個隱式埠。
UDP協議
UDP協議相較於TCP協議來講,是一種快速,限制少,簡單,輕量的協議,但也是有代價的。代價就是無法保證傳輸資料的安全,就是資料在傳輸過程中可能會發生丟包,在一些對資料可靠性要求比較高的場合一般不被使用。
UDP檢驗和
UDP檢驗和是用來檢查資料是否發生錯誤的,但僅僅只是檢查而已,並不能修復錯誤。
UDP協議將整個資料包分割成一個個16位元的二進位制資料,然後對這些二進位制進行求和運算,對最終結果求反碼,這個反碼就是檢驗和。舉個例子來講,16位元太多,這裡簡化為4位元運算,有資料0010 0001 1110。我們首先將這12位的二進位制資料分割為4位的二進位制資料,可以得到3個二進位制資料(如果不夠,可以補0),然後對這3個二進位制資料進行求和:
0010+0001+1110 = 10001
我們取後4位,所有捨去最左邊的1,得到結果0001,然後對其取反碼,得到結果1110。
這個1110就是我們要放進UDP協議中的檢驗和。因為反碼加原碼得到的結果在各個位上都是1,所有如果接收端接收到資料並同樣對資料進行拆分求和運算,然後將結果與檢驗和相加,如果結果出現0位,則表明資料發生了錯誤。
反碼 + 原碼 = 111…111
原碼 = 碼1 + 碼2 + 碼3 + … + 碼N
=>反碼 + 碼1 + 碼2 + 碼3 + … + 碼N = 111…111
TCP協議
1.三次握手
第一次握手:傳送端首先發送一個不包含資料的報文,將SYN位設定為1,隨機選擇一個初始序號 i,這個序號指的是位元組號。
第二次握手:接收端收到報文,為該請求分配埠和快取,然後返回一個響應報文,這個響應報文的SYN位也被設定為1,確認號被設定為 i + 1, 並隨機選擇一個自己的初始序號 m。
第三次握手:傳送端在收到響應報文後再次返回一個SYN為0,確認號為 m + 1, 序列號為 i + 1的報文。傳送端和接收端之間的連線就建立了。需要注意的是,在之後的每個報文中SYN位都被設定為0。
2.流量控制
流量控制是為了不使接收端快取傳送溢位,應用程式從快取中取出資料,而TCP會不斷向快取中加入資料,當取出比較少,而加入比較多的時候就會發送快取溢位的情況。TCP能夠檢測接收端快取空閒區的大小,從而改變傳送端傳入網路資料的量。
3.擁塞控制
如果說流量控制是為了控制傳入資料的量的話,那麼擁塞控制就是為了控制傳入資料的速率。如果速率太快,就會在路由器快取中發生溢位,TCP通過檢測丟包來觀察速率是否達到上限,如果發生了丟包,就表示資料可能在路由器快取佇列中被丟棄,這時候就要降低傳送速率。反之,如果一直沒有檢測到丟包,TCP會逐步加大發送端的傳送速率直到發生丟包為止。