當(dāng)在Windows XP中同時(shí)運(yùn)行多個(gè)網(wǎng)絡(luò)應(yīng)用程序時(shí),每個(gè)應(yīng)用程序都會(huì)產(chǎn)生自己的
數(shù)據(jù)流,傳輸層是用什么方法區(qū)分不同應(yīng)用程序的數(shù)據(jù)流呢?
在數(shù)據(jù)流被分段(分組)以后,傳輸層依靠什么來重新組裝這些數(shù)據(jù)流呢?
如果某個(gè)數(shù)據(jù)段在傳輸過沖中丟失了或重復(fù)了,可靠的傳輸協(xié)議依據(jù)什么去要求
重傳這些數(shù)據(jù)或丟棄多余的數(shù)據(jù)呢?
帶著這些問題,下面來談?wù)搨鬏攲铀峁┑姆⻊?wù)。
傳輸層的主要功能是分割并重新組裝上層提供的數(shù)據(jù)流,為數(shù)據(jù)流提供端對端的
傳輸服務(wù)。
在TCP/IP協(xié)議中,有兩個(gè)傳輸層協(xié)議:傳輸控制協(xié)議(TCP)和用戶數(shù)據(jù)包協(xié)議(UDP)
TCP是一個(gè)可靠的面向連接的協(xié)議,UDP是不可靠的或非連接的協(xié)議。這種面向連接和
非連接的通信方式的區(qū)別,就像打電話和寄明信片一樣。打電話的雙方在正式通話之
前都會(huì)說“喂”,確定對方在線以后才開始通話,會(huì)話結(jié)束時(shí)都要說“再見”,然后
才掛下電話。而寄明信片卻沒有這種機(jī)制,寄出去了但不管對方是否收到。
端口號
每個(gè)應(yīng)用程序都會(huì)產(chǎn)生自己的數(shù)據(jù)流,這些數(shù)據(jù)流可以把目標(biāo)主機(jī)上相應(yīng)的服務(wù)程序
看作自己的目的地,對于傳輸層來說,它只需要知道目標(biāo)主機(jī)上的哪個(gè)服務(wù)程序來響
應(yīng)這應(yīng)用程序,而不需要知道這個(gè)服務(wù)程序具體是干什么的。因此,傳輸層使用一個(gè)
抽象的端口號來標(biāo)識這些應(yīng)用程序和服務(wù)程序。
端口號的功能及應(yīng)用特點(diǎn)
端口號用來跟蹤網(wǎng)絡(luò)間同時(shí)發(fā)生的不同會(huì)話。TCP和UDP可以同時(shí)接收多個(gè)應(yīng)用程序送
來的數(shù)據(jù)流,用端口號來區(qū)分他們,然后送給適當(dāng)?shù)膽?yīng)用程序處理。這時(shí)多路分解技
術(shù)的體現(xiàn),它可以確保正確的用戶程序收到正確的數(shù)據(jù)。因此,每個(gè)應(yīng)用程序發(fā)送數(shù)
據(jù)前都會(huì)與操作系統(tǒng)進(jìn)行協(xié)商,獲得響應(yīng)的源端口號和目標(biāo)端口號。
在主機(jī)發(fā)送應(yīng)用程序的數(shù)據(jù)之前,都必須確認(rèn)端口號,如何分配這些端口號呢?一般
有兩種情況,使用中央管理機(jī)構(gòu)統(tǒng)一分配的端口號和使用動(dòng)態(tài)綁定。
使用中央管理機(jī)構(gòu)統(tǒng)一分貝的端口號。應(yīng)用程序的開發(fā)者們都默認(rèn)在RFC1700中定義的
特殊端口號,在進(jìn)行軟件設(shè)計(jì)時(shí),都要遵從RFC1700中定義的規(guī)則,不能隨便使用已經(jīng)
定義的端口號,那么系統(tǒng)將在一個(gè)特定的取值范圍隨機(jī)地為應(yīng)用程序分配一個(gè)端口號。
例如,任何Telnet應(yīng)用中的會(huì)話都應(yīng)用標(biāo)準(zhǔn)端口號23。
使用動(dòng)態(tài)綁定。如果一個(gè)應(yīng)用程序的會(huì)話沒有涉及到特殊的端口號,那么系統(tǒng)將在一個(gè)
特定的取值方位內(nèi)隨機(jī)地為應(yīng)用程序分配一個(gè)端口號。在應(yīng)用程序進(jìn)行通信以前,如果
不知道對方的端口號,就必須發(fā)送請求以獲得對方的端口號。
RFC(Request for Comments,征求意見資料)是一個(gè)資料系列,始創(chuàng)于1969年,其中描述
了關(guān)于Internet的協(xié)議實(shí)驗(yàn),并不是所有RFC資料都是描述Internet標(biāo)準(zhǔn)的,但所有
Internet標(biāo)準(zhǔn)都是作為RFC資料編寫的。RFC資料中提交的協(xié)議都是Internet研究人員和
開發(fā)人員根據(jù)自己的情況建立、修改和擴(kuò)充的,因此不同于CCITT(國際電報(bào)電話咨詢委
員會(huì)) 和ANSI(美國國家標(biāo)準(zhǔn)協(xié)會(huì))等組織所倡導(dǎo)的并經(jīng)過正式評審和標(biāo)準(zhǔn)化處理的協(xié)議
Internet RFC有3種狀態(tài):Proposed(提案)、Draft(草案)和Full(標(biāo)準(zhǔn))。
TCP/IP的設(shè)計(jì)者們采用一種混合方式實(shí)現(xiàn)端口號地址的管理,終端系統(tǒng)利用源系統(tǒng)端口
號來選擇合適的應(yīng)用程序,但是源系統(tǒng)的源端口號由源系統(tǒng)動(dòng)態(tài)分配。
常用的端口號介紹
目前的端口號的分配情況大致如下:
小于255的端口號用于公共應(yīng)用
255~1023是特定供應(yīng)商應(yīng)用程序的注冊端口號
高于1023的端口號未作規(guī)定。
常用應(yīng)用層協(xié)議或應(yīng)用程序 | 端口號 |
|
UPP
|
TCP
|
FTP
|
-
|
21
|
Telnet
|
-
|
23
|
SMTP
|
-
|
25
|
DNS
|
53
|
-
|
TFTP
|
69
|
-
|
SNMP
|
161
|
-
|
HTTP
|
-
|
80
|
DHCP
|
-
|
67
|
RPC(遠(yuǎn)程調(diào)用)
|
-
|
135
|
下面舉例說明端口號的使用過程。
主機(jī)A要Telnet到主機(jī)B。主機(jī)A首先向TCP請求一個(gè)可用端口,假如TCP分配一個(gè)為1088
的端口,主機(jī)A將目標(biāo)端口號置為23。A和B通信以后,B看到A過來的端口號為23,就知
道這時(shí)Telnet應(yīng)用,它就會(huì)為此創(chuàng)建一個(gè)Telnet會(huì)話。
假如同一系統(tǒng)中有多個(gè)Telnet用戶,會(huì)發(fā)生什么情況呢?當(dāng)主機(jī)A上第二個(gè)用戶要Telne到
主機(jī)B時(shí)(其實(shí)是在主機(jī)A與主機(jī)B之間建立第二個(gè)Telnet進(jìn)程),主機(jī)A的第二個(gè)用戶向TCP
TCP會(huì)選出另外一個(gè)可使用的端口號,假如為10099,給第二個(gè)用戶。主機(jī)B上便會(huì)創(chuàng)建
第二個(gè)Telnet會(huì)話。
所以在統(tǒng)一IP地址上具有不同端口號的兩個(gè)連接是不同的。IP地址和端口號被用來唯一地
確定數(shù)據(jù)連接的途徑。
UDP
UDP是TCP/IP的另一個(gè)非常重要的協(xié)議。
UDP數(shù)據(jù)域的頭部共占用了8個(gè)字節(jié)
UDP數(shù)據(jù)域的頭格式描述
名稱
|
描述
|
源端口
|
調(diào)用的端口號
|
目的端口
|
被調(diào)用的端口號
|
報(bào)文長度
|
記錄UDP數(shù)據(jù)包中的8位組數(shù)目包括UDP數(shù)據(jù)的長度
最小值為8(數(shù)據(jù)部分為0時(shí))
|
校驗(yàn)和
|
頭標(biāo)和數(shù)據(jù)域計(jì)算的校驗(yàn)和,這一項(xiàng)是可選的,為的
是在高可靠性的網(wǎng)路上盡量減少開銷
|
數(shù)據(jù)
|
上層協(xié)議的數(shù)據(jù)
|
UDP為應(yīng)用程序提供的是一種不可靠的、非連接的分組交付服務(wù),UDP報(bào)文可能出現(xiàn)
丟失、重復(fù)、時(shí)延、亂序、連接失效的問題。但是正式由于它不提供這種可靠性,所
以它的開銷很小。換句話說,UDP提供了一種在高效可靠的網(wǎng)絡(luò)上傳輸數(shù)據(jù)而不用消
耗不必要的網(wǎng)絡(luò)資源和處理時(shí)間的通信方式。使用UDP的協(xié)議包括TFTP、SNMP、DNS
DHCP。UDP很適合這種客戶機(jī)像服務(wù)器發(fā)送簡單服務(wù)請求的環(huán)境,因?yàn)檫@種服務(wù)的開
銷本來就很小,如果在喀什或者結(jié)束時(shí)加入類似TCP三次握手的過程,網(wǎng)絡(luò)的實(shí)際利用
將會(huì)變得很低。
UDP還可以用于操作信息的登錄。例如,像日志服務(wù)器 syslog發(fā)送日志信息,采用UDP
不會(huì)導(dǎo)致多臺(tái)設(shè)備向一臺(tái)服務(wù)器發(fā)送日志信息而引起過載。
UDP依靠上層協(xié)議提供可靠性,包括處理報(bào)文的丟失、重復(fù)、時(shí)延、亂序、連接失效
等問題。如Real流格式媒體就是使用應(yīng)用程序協(xié)議來保證數(shù)據(jù)的正確傳輸。
TCP
在上文中已經(jīng)提到UDP為應(yīng)用程序提供的是一種不可靠的、非連接的分組的交付服務(wù)。當(dāng)網(wǎng)絡(luò)硬件失效
或者負(fù)擔(dān)太重時(shí),數(shù)據(jù)段可能會(huì)產(chǎn)生丟失、重復(fù)、時(shí)延、亂序等現(xiàn)象,這些都會(huì)導(dǎo)致通信不正常。如果
讓應(yīng)用程序來負(fù)擔(dān)差錯(cuò)檢測和恢復(fù)的工作,將給程序員帶來很多復(fù)雜的工作,所以使用獨(dú)立的通信協(xié)議
來保證通信的可靠性是非常必要的。
傳輸控制協(xié)議TCP是在RFC793中定義的,它是一個(gè)面向連接的可靠的通信協(xié)議?偟膩碚f,TCP主要提
供主要提供一下服務(wù)。
面向連接的虛電路:這有些和打電話相似,在開始傳輸之前,通信雙方要進(jìn)行三次握手來建立連接,以保
證連接的可靠性。在傳輸過程中,通信雙方的協(xié)議模塊繼續(xù)進(jìn)行通信,以確保正確到達(dá)(例如,接收會(huì)用
ACK應(yīng)答發(fā)送方的報(bào)文段,發(fā)送方對未被應(yīng)答的報(bào)文段提供重傳)。如果在傳輸過程中通信失敗了(例如傳
輸路徑上的某個(gè)網(wǎng)絡(luò)接口失效),通信雙方都會(huì)收到錯(cuò)誤報(bào)告。在通信結(jié)束時(shí),通信雙方會(huì)使用改進(jìn)的三次
握手來關(guān)閉連接。
面向流:當(dāng)通信雙方傳輸大量數(shù)據(jù)時(shí),TCP將數(shù)據(jù)流看作可分為字節(jié)的流,進(jìn)行分段(分組),接收方將收到
的報(bào)文段按原有順序復(fù)原。
流量控制,避免擁塞;為了提高傳輸效率和減少網(wǎng)絡(luò)通信量(協(xié)議之間的通信),TCP會(huì)盡量一次傳輸足夠多
的數(shù)據(jù)。
多路分解技術(shù)(多路復(fù)用技術(shù)):用端口號來實(shí)現(xiàn)。
全雙工連接:TCP提供全雙工連接,可以在一條連接上同時(shí)傳輸兩個(gè)獨(dú)立的、流向相反的數(shù)據(jù)流。
TCP頭共占用了20個(gè)字節(jié)
名稱
|
描述
|
源端口
|
調(diào)用的端口號
|
目的端口
|
被調(diào)用的端口號
|
序號
|
確保數(shù)據(jù)到達(dá)的序列正確的編號
|
應(yīng)答號
|
期望下一個(gè)TCP數(shù)據(jù)段
|
數(shù)據(jù)偏移(頭長度)
|
以32位為單位的報(bào)頭長度
|
保留
|
置為0
|
編碼號
|
開始、終止會(huì)話之類的控制功能
|
窗口
|
用來控制流量
|
校驗(yàn)和
|
頭標(biāo)和數(shù)據(jù)域計(jì)算的校驗(yàn)和
|
緊急
|
指示緊急數(shù)據(jù)的末端
|
可選項(xiàng)
|
當(dāng)前定義項(xiàng):TCP端的最大值
|
數(shù)據(jù)
|
上層協(xié)議的數(shù)據(jù)
|
建立TCP連接:三次握手
TCP是面向連接的,在面向連接的環(huán)境中,開始傳輸數(shù)據(jù)之前,在兩個(gè)終端之間必須先建立一個(gè)連接。建立
連接的過程可以卻確保通信雙方在發(fā)送應(yīng)用數(shù)據(jù)包之前靜靜準(zhǔn)備好了傳送和接收數(shù)據(jù)。對于一個(gè)要建立的連
連接的過程可以卻確保通信雙方在發(fā)送應(yīng)用數(shù)據(jù)包之前靜靜準(zhǔn)備好了傳送和接收數(shù)據(jù)。對于一個(gè)要建立的連
接,通信雙方必須用彼此的初始化序列號seq和來自對方成功傳輸確認(rèn)的應(yīng)答號ack來同步。(ack號致命希望收
到的下一個(gè)八位組的編號)習(xí)慣上將同步信號寫為SYN,應(yīng)答信號為ACK。整個(gè)同步的過程稱為三次握手。
1)主機(jī)A發(fā)送SYN給主機(jī)B:我的序列號seq是X。
2)主機(jī)B發(fā)送SYN、ACK給主機(jī)A:我的序列號seq是X+1,應(yīng)答號是X+1(等待接收第X+1號八位組)。
3)主機(jī)B發(fā)送SYN、ACK給主機(jī)B:我的序列號seq是X+1,應(yīng)答號是Y+1.
通過以上3個(gè)步驟(三次握手),TCP連接連接建立,開始傳輸數(shù)據(jù)。任何機(jī)器上的TCP都能被動(dòng)地
等待握手或主動(dòng)地發(fā)起握手。一旦連接建立,數(shù)據(jù)可以對等地雙向流動(dòng)。
如果TCP使用1作為每次建立連接的初始化序列號,當(dāng)本地系統(tǒng)重啟后,遠(yuǎn)程系統(tǒng)會(huì)認(rèn)為以前的連接依然存
在。所以每次連接時(shí),主機(jī)都會(huì)隨機(jī)選擇一個(gè)初始化序列號,用它來辨別所傳輸?shù)陌宋唤M在數(shù)據(jù)流中的位
置。然后雙方要對各自的序列號進(jìn)行協(xié)商,因?yàn)榻邮帐盏降谝粋(gè)SYN時(shí),他并不知道這是否一個(gè)被延遲的
舊信號。所以它必須要求發(fā)送驗(yàn)證這個(gè)SYN。
一般情況下,TCP使用最少信息的報(bào)文段來實(shí)現(xiàn)三次握手,這對減少網(wǎng)絡(luò)通信流量是有效的?傊,三次握
手使通信雙方做好了傳輸數(shù)據(jù)的準(zhǔn)備,并且使通信通信雙方統(tǒng)一了初始化序列號。
關(guān)閉TCP連接:改進(jìn)的三次握手
對于一個(gè)已經(jīng)建立的連接,TCP使用改進(jìn)的三次握手來結(jié)束通話(使用一個(gè)帶有FIN附加標(biāo)記的報(bào)文段)。
1)當(dāng)主機(jī)A的應(yīng)用程序通知TCP數(shù)據(jù)已經(jīng)完畢時(shí),TCP向主機(jī)B發(fā)送一個(gè)帶有FIN附加標(biāo)記的報(bào)文段(FIN理解為
finish)。
2)主機(jī)B收到這個(gè)FIN報(bào)文段之后,并不立即用FIN報(bào)文段回復(fù)主機(jī)A,而是向主機(jī)A發(fā)送一個(gè)確認(rèn)ACK,同時(shí)
同時(shí)通知自己相應(yīng)的應(yīng)用程序:對方要求關(guān)閉連接(先發(fā)送ACK為了防止在這段時(shí)間內(nèi),對方重傳FIN報(bào)文段)。
3)主機(jī)B的應(yīng)用程序告訴TCP:我要徹底的關(guān)閉的關(guān)閉連接,TCP向主機(jī)A送第二個(gè)FIN報(bào)文段。
4)主機(jī)A收到第二個(gè)FIN報(bào)文段后,向主機(jī)B發(fā)送一個(gè)ACK表示連接徹底關(guān)閉。
TCP的可靠性
TCP是面向流的,即數(shù)據(jù)段被當(dāng)作字節(jié)的序列化進(jìn)行傳輸。
在通過三次握手建立連接時(shí),序列號被初始化。在傳輸過程中,TCP繼續(xù)使用這個(gè)序列號來標(biāo)記每一個(gè)發(fā)送的數(shù)據(jù)段
沒發(fā)送一個(gè)數(shù)據(jù)段,序列號加1.接收站點(diǎn)一句序列號重新組裝縮所收到數(shù)據(jù)段。為什么要依靠序列號來重組數(shù)據(jù)段呢?
例如,在一個(gè)告訴高速鏈路與低速鏈路并存的網(wǎng)絡(luò)上,可能會(huì)出現(xiàn)高速鏈路比低速鏈路上的數(shù)據(jù)段提前到達(dá)的情況,
此時(shí)就必須依靠序列號來重組數(shù)據(jù)段,這就是序列號的作用之一。
在傳輸過程中,確認(rèn)號ACK的作用是告訴發(fā)送端那些數(shù)據(jù)包已經(jīng)成功接收,并且確認(rèn)號會(huì)向發(fā)送端指出了接收端希望
收到的下一個(gè)數(shù)據(jù)段的序列號,這種機(jī)制稱為預(yù)期確認(rèn),即確認(rèn)號等于下一個(gè)預(yù)期的位元組。
在TCP/IP網(wǎng)絡(luò)中,存在超時(shí)與重傳兩種現(xiàn)象。如果在傳輸過程中丟失了某個(gè)序列號的數(shù)據(jù)段,導(dǎo)致發(fā)送端在給定時(shí)間
間隔內(nèi)得不到那個(gè)數(shù)據(jù)段的應(yīng)答,那么那個(gè)丟失數(shù)據(jù)段就會(huì)被要求重發(fā)。數(shù)據(jù)段會(huì)被保存在發(fā)送端的緩沖區(qū)中,直
到發(fā)送端接收到應(yīng)答號,它才會(huì)釋放這個(gè)緩沖區(qū)。這種機(jī)制被稱為肯定確認(rèn)與重新傳輸(Positive Acknowledgement and
Retransimission,PAR),他是虛脫通信協(xié)議用來確?尚哦鹊囊环N技術(shù)。
序列號的第二個(gè)作用就是消除網(wǎng)絡(luò)中的重復(fù)包(同步復(fù)制)。例如在網(wǎng)絡(luò)擁塞時(shí),發(fā)送端遲遲沒有收到接收端某個(gè)數(shù)據(jù)段
的ACK包,它可能會(huì)認(rèn)為這個(gè)序列號的數(shù)據(jù)段丟失了,于是它會(huì)重新發(fā)送,這種情況可能會(huì)導(dǎo)致接收端在網(wǎng)絡(luò)恢復(fù)正
常后收到兩個(gè)同樣序列號的數(shù)據(jù)段,此時(shí)接收端會(huì)自動(dòng)丟棄第二個(gè)一樣數(shù)據(jù)段。
序列號和應(yīng)答號為TCP提供了一種糾錯(cuò)機(jī)制,提高了TCP的可靠性。