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è)字段的長(zhǎng)度都是2個(gè)字節(jié)研侣。意義如下:
- 源端口:需要對(duì)方回信時(shí)選用,不需要時(shí)可用全0.
- 目的端口:交付報(bào)文時(shí)需要炮捧。
- 長(zhǎng)度:用戶數(shù)據(jù)報(bào)的長(zhǎng)度庶诡,最小值為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ā)送任何信息右蹦≌锔耍可靠傳輸協(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í)間更長(zhǎng)一些朦佩。
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首部最小長(zhǎng)度是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)程一次把多長(zhǎng)的報(bào)文發(fā)送到TCP的緩存中苟弛,而是根據(jù)對(duì)方給出的窗口值和當(dāng)前網(wǎng)絡(luò)擁塞程度決定一個(gè)報(bào)文段包含多少字節(jié)喝滞,而UDP發(fā)送報(bào)文長(zhǎng)度是應(yīng)用進(jìn)程給出的。如果應(yīng)用進(jìn)程傳送到TCP緩存的數(shù)據(jù)塊太長(zhǎng)膏秫,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ì)議等)劝篷。