TCP/IP運(yùn)輸層的兩個(gè)主要協(xié)議分別是TCP(傳輸控制協(xié)議)與UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。傳送的數(shù)據(jù)單位分別叫“TCP報(bào)文段”或“UDP用戶數(shù)據(jù)報(bào)”。
UDP(用戶數(shù)據(jù)報(bào)協(xié)議)
主要特點(diǎn):
1)無連接的,發(fā)送數(shù)據(jù)之前不需要連接,減少了開銷。
2)盡最大努力交付。即不保證可靠交付。
3)面向報(bào)文。發(fā)送方的UDP對(duì)應(yīng)用程序交下來的報(bào)文,在添加首部后就向下交付IP層。同樣的,IP層交上來的UDP用戶數(shù)據(jù)報(bào),去除首部后就原封不動(dòng)的交付上面的應(yīng)用進(jìn)程。也就是說,一次交付一個(gè)完整的報(bào)文。
4)沒有擁塞控制。因此網(wǎng)絡(luò)擁塞不會(huì)使主機(jī)發(fā)送速率降低。但是可能會(huì)丟失一些數(shù)據(jù)。
5)支持一對(duì)一,一對(duì)多,多對(duì)一和多對(duì)多的交互通信。
6)UDP首部開銷小,只有8個(gè)字節(jié),比TCP的20個(gè)字節(jié)的首部要短。
UDP的首部格式:
用戶數(shù)據(jù)報(bào)UDP有兩個(gè)字段:數(shù)據(jù)字段和首部字段。首部字段很簡(jiǎn)單只有8個(gè)字節(jié),由四個(gè)字段組成,每個(gè)字段的長度都是2個(gè)字節(jié)。意義如下:
- 源端口:需要對(duì)方回信時(shí)選用,不需要時(shí)可用全0.
- 目的端口:交付報(bào)文時(shí)需要。
- 長度:用戶數(shù)據(jù)報(bào)的長度,最小值為8(僅有首部)。
- 檢驗(yàn)和:檢測(cè)UDP用戶數(shù)據(jù)報(bào)在傳輸中是否有錯(cuò)。有錯(cuò)就丟棄。
TCP(傳輸控制協(xié)議)
TCP較復(fù)雜,因此先對(duì)TCP協(xié)議作一般的介紹,再逐步深入討論TCP的可靠傳輸、流量控制和擁塞控制等問題。
TCP最主要的特點(diǎn):
- 面向連接的運(yùn)輸層協(xié)議。這就是說,應(yīng)用程序在使用TCP協(xié)議之前,必須先建立TCP連接。在傳送數(shù)據(jù)完畢后,必須釋放已經(jīng)建立的TCP連接。也就是說,應(yīng)用進(jìn)程之間的通信好像在“打電話”,通話之前要先撥號(hào)建立連接,通話結(jié)束后要掛機(jī)釋放連接。
- 每一條TCP只能有兩個(gè)端點(diǎn)。每一條TCP連接只能是點(diǎn)對(duì)點(diǎn)的(一對(duì)一)。
- TCP提供可靠交付。通過TCP連接傳送的數(shù)據(jù),無差錯(cuò)、不丟失不重復(fù),并且按序到達(dá)。
- TCP提供全雙工通信(全雙工通信:即通信的雙方可以同時(shí)發(fā)送和接收信息的信息交互方式。半雙工通信:即通信的雙方都可以發(fā)送和接受信息,但同一時(shí)刻只能有一個(gè)方向。)。
- 面向字節(jié)流。TCP中的“流”指的是流入到進(jìn)程或從進(jìn)程流出的字節(jié)序列。發(fā)送方要先把數(shù)據(jù)轉(zhuǎn)化為字節(jié)流寫入發(fā)送緩存進(jìn)行發(fā)送,且接收方必須有能力識(shí)別字節(jié)流。
TCP的連接
TCP把連接作為最基本的抽象。TCP的許多特性都與TCP是面向連接的這個(gè)基本特性有關(guān)。
每一條TCP有兩個(gè)端點(diǎn)。我們稱之為套接字或端口(socket)。它并不是端口,也不是主機(jī)的IP地址,也不是應(yīng)用進(jìn)程。根據(jù)定義,端口號(hào)拼接到IP地址構(gòu)成了套接字。因此,套接字的表示方法是在點(diǎn)分十進(jìn)制的IP地址后面加上端口號(hào),中間用冒號(hào)或逗號(hào)隔開。
例:192.3.4.5:80。
每一條TCP連接唯一地被通信兩端的兩個(gè)端點(diǎn)(即兩個(gè)套接字)所確定。
可靠傳輸?shù)墓ぷ髟恚?/h5>
TCP發(fā)送的報(bào)文段是交給IP層傳送的,而IP層只能提供盡最大努力服務(wù),也就是說,TCP下面的網(wǎng)絡(luò)鎖提供的是不可靠的傳輸。因此,TCP必須采用適當(dāng)?shù)拇胧┎拍苁沟脙蓚€(gè)運(yùn)輸層之間的通信變得可靠。
停止等待:每發(fā)送完一個(gè)分組就停止發(fā)送等待對(duì)方的確認(rèn)。在收到確認(rèn)后在發(fā)送下一個(gè)分組。
傳遞過程:
1)無差錯(cuò)情況
停止等待協(xié)議可用下圖說明。(a)代表無差錯(cuò)情況。A發(fā)送分組M1,發(fā)完就暫停發(fā)送,等待B確認(rèn)。B收到M1就向A發(fā)送確認(rèn)。A收到對(duì)M1的確認(rèn)后,再發(fā)送下一個(gè)分組M2。
2) 出現(xiàn)差錯(cuò)
B接受M1時(shí)檢測(cè)出了差錯(cuò),就丟棄M1,其他什么也不做(不通知A有差錯(cuò)的分組)。B不會(huì)發(fā)送任何信息??煽總鬏攨f(xié)議是這樣設(shè)計(jì)的:A只要超過了一段時(shí)間任然沒有收到確認(rèn),就認(rèn)為剛才發(fā)送的分組丟失了,因而重傳前面發(fā)送過的分組。這就叫超時(shí)重傳。要實(shí)現(xiàn)超時(shí)重傳,就要在每發(fā)送完一個(gè)分組時(shí)設(shè)置一個(gè)超時(shí)計(jì)時(shí)器。若收到,取消超時(shí)計(jì)時(shí)器的設(shè)置。
注意以下三點(diǎn):
- 第一,A在發(fā)送完一個(gè)分組后,必須暫時(shí)保留已發(fā)送分組的副本。只有在收到相應(yīng)的確認(rèn)后才能清除暫時(shí)保留的分組副本。
- 第二,分組和確認(rèn)分組都必須進(jìn)行編號(hào)。這樣才能明確是哪一個(gè)發(fā)送出去的分組收到了確認(rèn),而哪一個(gè)分組還沒有收到確認(rèn)。
-
第三,超時(shí)計(jì)時(shí)器設(shè)置的重傳時(shí)間應(yīng)當(dāng)比數(shù)據(jù)在分組傳輸?shù)钠骄禃r(shí)間更長一些。
image.png
3)確認(rèn)丟失和確認(rèn)遲到
下圖(a)說明,B發(fā)送的對(duì)M1的確認(rèn)丟失了。A在設(shè)定的超時(shí)重傳時(shí)間內(nèi)沒有收到確認(rèn),并無法知道自己發(fā)送的分組出錯(cuò),丟失,或者是B發(fā)送的確認(rèn)丟失了。因此A在超時(shí)計(jì)時(shí)器到期后就要重傳M1。假定B又收到了M1,這時(shí)應(yīng)采取兩個(gè)行動(dòng):
1)丟棄這個(gè)重復(fù)的分組M1,不向上層交付。
2)向A發(fā)送確認(rèn)。A收到了B收到的確認(rèn)消息后,將繼續(xù)傳送M2。
圖b也是一種可能出現(xiàn)的情況,傳輸過程中沒有出現(xiàn)差錯(cuò),但B對(duì)分組M1的確認(rèn)遲到了。A會(huì)收到重復(fù)的確認(rèn)。對(duì)重復(fù)的確認(rèn)處理很簡(jiǎn)單:收下后就丟棄。
使用上述方法就可以在不可靠的傳輸網(wǎng)絡(luò)上實(shí)現(xiàn)可靠的通信。

TCP報(bào)文段的首部格式
TCP的傳送數(shù)據(jù)單元是報(bào)文段。分為首部和數(shù)據(jù)兩部分,而TCP全部功能都體現(xiàn)在它首部中各字段的作用。因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。
首部格式:
前20個(gè)字節(jié)是固定的,后面有4n字節(jié)是根據(jù)需要而增加的選項(xiàng)(n為int)。因此TCP首部最小長度是20字節(jié)。

TCP的控制位:
1)URG:URG=1時(shí),表示此報(bào)文段有緊急數(shù)據(jù),應(yīng)盡快傳送(優(yōu)先級(jí)高),而非排隊(duì)順序傳送。
2)ACK:ACK=1時(shí)有效,ACK=0時(shí)無效。TCP規(guī)定,連接建立后所有傳送的報(bào)文段都必須把ACK置1。
3)PSH:推送。兩個(gè)應(yīng)用進(jìn)程交互式通信時(shí),有時(shí)在一端的應(yīng)用進(jìn)程希望在鍵入一個(gè)命令后立即就能夠收到對(duì)方的響應(yīng)。在這種情況下,TCP就可以使用推送操作,PSH=1。立即創(chuàng)建一個(gè)報(bào)文段發(fā)送出去。
4)RST:復(fù)位。RST=1時(shí)表示TCP連接中出現(xiàn)嚴(yán)重差錯(cuò),必須釋放連接,然后再重新建立連接。
5)SYN:在連接建立時(shí)用來同步序號(hào)。當(dāng)SYN=1而ACK=0時(shí),表明這是個(gè)連接請(qǐng)求報(bào)文段。對(duì)方若同意建立連接,則應(yīng)在響應(yīng)的報(bào)文段中使SYN和ACK置1。
6)FIN:用來釋放一個(gè)連接。當(dāng)FIN=1時(shí),表明此報(bào)文段的發(fā)送方得數(shù)據(jù)已發(fā)送完畢,并要求釋放運(yùn)輸連接。
UDP與TCP的區(qū)別
- UDP在傳送數(shù)據(jù)之前不需要先建立連接。遠(yuǎn)地主機(jī)運(yùn)輸層在收到UDP報(bào)文后,不需要給出任何確認(rèn)。因此UDP不提供可靠交付,但是效率高。TCP則提供面向連接的服務(wù)。在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。TCP要提供可靠的、面向連接的運(yùn)輸服務(wù),因此不可避免地增加了許多的開銷,如確認(rèn)、流量控制等。
- TCP和UDP在發(fā)送報(bào)文時(shí)所采用的方式完全不同。TCP并不關(guān)心進(jìn)程一次把多長的報(bào)文發(fā)送到TCP的緩存中,而是根據(jù)對(duì)方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞程度決定一個(gè)報(bào)文段包含多少字節(jié),而UDP發(fā)送報(bào)文長度是應(yīng)用進(jìn)程給出的。如果應(yīng)用進(jìn)程傳送到TCP緩存的數(shù)據(jù)塊太長,TCP就劃分短一些再傳送。若過短也可以等待積累足夠多的字節(jié)后再構(gòu)成報(bào)文段發(fā)送出去。
- UDP程序結(jié)構(gòu)比較簡(jiǎn)單。它的首部最少為8字節(jié)而TCP最少為20字節(jié)。
- UDP不保證數(shù)據(jù)的順序結(jié)構(gòu),而TCP必須保證數(shù)據(jù)的順序結(jié)構(gòu)。
- TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報(bào)文的,UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送速率降低(對(duì)實(shí)時(shí)應(yīng)用很有用,如IP電話,實(shí)時(shí)視頻會(huì)議等)。
