OSI傳輸層功能及協議
一、傳輸層的作用
1、 跟蹤各個會話
因為每臺主機上可能有多個進程進行通信,傳輸層需要將各個數據段發送給相應的進程。這也可以理解,在傳輸層報頭中加入了源和目的進程號(其實就是端口號)。
2、 分段數據并管理每個分段(源)
3、 重組數據(目的)
4、 標識應用程序
這一條和第一條類似,用端口號標識。
5、 流量控制
6、 錯誤恢復
7、 開始會話
二、端口號
類型:
公認端口——端口0到1023(210-1)
公認端口用于服務和應用程序。都是一些常用的應用程序所采用。
例如:FTP(端口20,21);HTTP(端口80);DNS(端口53)
已注冊端口——端口1024到49151
分配給用戶進程或應用程序。這些應用程序是用戶選擇安裝的一些應用程序,不是已經分配了公認端口的常用應用程序。
這些端口在沒有被服務器資源占用時,可由客戶端動態選用為源端口。
例如:MSN Messenger(端口1812);HTTP備用(端口8008,8080)
動態或私有端口——端口49152到65535
也稱為臨時端口。這些端口往往在開始連接時被動態分配給客戶端應用程序。客戶端一般很少使用動態或私有端口服務(只有一些點對點文件共享程序使用)。
三、TCP頭結構
TCP協議頭最少20個字節,包括以下的區域:
TCP源端口(SourcePort):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是標示報文的返回地址。
TCP目的端口(Destinationport):這個端口指明報文接收計算機上的應用程序地址接口。
TCP序列號(序列碼,SequenceNumber):32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當SYN出現,序列碼實際上是初始序列碼(ISN),而第一個數據字節是ISN+1.
確認號(Acknowledgment Number):32位的序列號由接收端計算機使用,重組分段的報文成最初形式。如果設置了ACK控制位,這個值表示一個準備接收的下一個包的序列碼。
注:可以將確認號簡單理解為準備接收地下一個包得序列碼。
數據偏移量(HLEN):4位包括TCP頭大小,指示何處數據開始。
保留(Reserved):6位值域,這些位必須是0.為了將來定義新的用途所保留。
標志(Code Bits):6位標志域。表示為:緊急標志、有意義的應答標志、推、重置連接標志、同步序列號標志、完成發送數據標志。按照順序排列是:URG、ACK、PSH、RST、SYN、FIN.
窗口(Window):16位,用來表示窗口大小。
校驗位(Checksum):16位TCP頭。源機器基于數據內容計算一個數值,收信息機要與源機器數值結果完全一樣,從而證明數據的有效性。
優先指針(緊急,Urgent Pointer):16位,指向后面是優先數據的字節,在URG標志設置了時才有效。如果URG標志沒有被設置,緊急域作為填充。加快處理標示為緊急的數據段。
選項(Option):長度不定,但長度必須以字節。如果沒有選項就表示這個一字節的域等于0.
填充:不定長,填充的內容必須為0,它是為了數學目的而存在。目的是確保空間的可預測性。保證包頭的結合和數據的開始處偏移量能夠被32整除,一般額外的零以保證TCP頭是32位的整數倍。
[NextPage]
四、TCP三次握手
第一次握手(申請):建立連接時,客戶端發送SYN包(SYN=j)到服務器,并進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize SequenceNumbers)。
第二次握手(回復+申請):服務器收到SYN包,必須確認客戶的SYN(ACK=j+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手(回復):客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ACK=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
五、通信中各種狀態
LISTENING:監聽來自遠方TCP端口的連接請求。
SYN-SENT:在發送連接請求后等待匹配的連接請求。
SYN-RECE:在收到和發送一個連接請求后等待對連接請求的確認。
ESTABLISHED:代表一個打開的連接,數據可以傳送給用戶。
FIN-WAIT-1:等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認。
FIN-WAIT-2:從遠程TCP等待連接中斷請求。
CLOSE-WAIT:等待從本地用戶發來的連接中斷請求。
CLOSING:等待遠程TCP對連接中斷的確認。
LAST-ACK:等待原來發向遠程TCP的連接中斷請求的確認。
TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認。
CLOSED :沒有任何連接狀態。
可以用netstat命令查看一下主機現在建立的連接和狀態。
六、TCP會話終止
若要關閉連接,應設置數據報頭重的FIN控制標志,需采用包含FIN數據段和ACK數據段的二次握手,因此要終止一個TCP支持的整個過程,需要實施4次交換,以終止兩個雙向會話。也可以用三次握手來終止(四次握手中的二、三兩次合并為一次)。
[NextPage]
七、TCP重傳
關于確認號的一個小細節:如果接收到序列號為1500到3000以及3400到3500的數據段,那么確認號應當為3001.這是因為未接收到3001到3399之間的數據段,此時準備接收的下一個數據段的序列號為3001.
TCP的標準實施流程是:主機傳輸數據段,并將數據段的副本列入重新發送隊列,然后啟動計時器。當接收到數據確認信息時,主機將從隊列中刪除對應數據段;如果到及時器超時還沒有收到確認信息,將重新傳輸數據段。
現在的主機還有一項備選功能:選擇性確認。如果兩臺主機都支持選擇性確認功能,目的主機便可以確認間斷數據段中得數據,那么源主機就只要傳輸丟失的數據。
八、TCP的擁塞控制
主要要清楚的就是動態窗口大小控制,來使得每個TCP會話有最佳的窗口大小。
九、UDP協議:低開銷通信
UDP是一種簡單協議,提供了基本的傳輸層功能。與TCP相比,UDP開銷極低,因為UDP是無連接的,并且不提供復雜的重新傳輸、排序和流量控制機制。
與TCP的通信機制不同,由于UDP是無連接的協議,因此通信發生之前不建立會話。UDP是基于事務的,換言之,應用程序要發送數據時,它僅是發送數據而已。由于不建立會話,因此一旦數據和端口號準備就緒,UDP就可以生成數據報并遞交給網絡層,并在網絡上尋址和發送。
因為UDP不進行排序,所以數據到達的時候只是按先來后到的順序進行排列。如果數據的順序對應用程序很重要,那么應用程序只能自己標志數據的正確順序,并決定如何處理這些數據。
TCP與UDP的關鍵區別在于可靠性。