1 運(yùn)輸層協(xié)議概述
1.1 進(jìn)程之間的通信
- 網(wǎng)絡(luò)層是為主機(jī)之間提供邏輯通信岗喉,而運(yùn)輸層為應(yīng)用進(jìn)程之間提供端到端的邏輯通信秋度。
- 運(yùn)輸層要對收到的報(bào)文進(jìn)行差錯(cuò)檢測。在網(wǎng)絡(luò)層钱床,IP數(shù)據(jù)報(bào)首部中的檢驗(yàn)和字段只檢驗(yàn)首部是否出現(xiàn)差錯(cuò)而不檢查數(shù)據(jù)部分荚斯。
- 根據(jù)應(yīng)用程序的不同需求,運(yùn)輸層需要有兩種不同的運(yùn)輸協(xié)議查牌,即面向連接的TCP和無連接的UDP:用戶數(shù)據(jù)報(bào)協(xié)議UDP事期,傳輸控制協(xié)議TCP
- 運(yùn)輸層向高層用戶屏蔽了下面網(wǎng)絡(luò)核心的細(xì)節(jié)(如網(wǎng)絡(luò)拓?fù)洹⑺捎玫穆酚蛇x擇協(xié)議等)纸颜,它使應(yīng)用進(jìn)程看見的就是好像在兩個(gè)運(yùn)輸層實(shí)體之間有一條端到端的邏輯通信信道刑赶。當(dāng)運(yùn)輸層采用面向連接的TCP協(xié)議時(shí),盡管下面的網(wǎng)絡(luò)是不可靠的懂衩,但這種邏輯通信信道就像但與一條全雙工的可靠信道。但當(dāng)運(yùn)輸層采用無連接的UDP協(xié)議時(shí),這種邏輯信道仍然是一條不可靠信道浊洞。
1.2 運(yùn)輸層的兩個(gè)主要協(xié)議
UDP在傳送數(shù)據(jù)之前不需要先建立連接牵敷。遠(yuǎn)地主機(jī)的運(yùn)輸層在收到UDP豹紋后,不需要給出任何確認(rèn)法希,雖然UDP不提供可靠交付枷餐,但在某些情況下UDP確實(shí)一種最有效的工作方式。
TCP則是提供面向連接的服務(wù)苫亦。在傳送數(shù)據(jù)之前必須先建立連接毛肋,數(shù)據(jù)傳送結(jié)束后要釋放連接。由于TCP要提供可靠的屋剑、面向連接的運(yùn)輸服務(wù)润匙,因此不可避免地增加了許多開銷,如確認(rèn)唉匾、流量控制孕讳、計(jì)時(shí)器以及連接管理等。這不僅使協(xié)議數(shù)據(jù)單元的首部增大很多巍膘,還要占用許多的處理器資源厂财。
1.3 運(yùn)輸層的端口
應(yīng)用層所有進(jìn)程都可以通過運(yùn)輸層傳送到IP層,這就是復(fù)用峡懈。運(yùn)輸層從IP層收到數(shù)據(jù)后必須交付給指明的應(yīng)用程序璃饱,這就是分用。顯然肪康,給應(yīng)用層的每個(gè)應(yīng)用進(jìn)程賦予一個(gè)非常明確的標(biāo)志是至關(guān)重要的荚恶。
這個(gè)可以通過在運(yùn)輸層使用端口來實(shí)現(xiàn)。這就是說梅鹦,雖然通信的終點(diǎn)是應(yīng)用進(jìn)程裆甩,但我們只需要把要傳送的報(bào)文叫到目的主機(jī)的某一個(gè)合適的目的端口,剩下的工作(即交付給目的進(jìn)程)就有TCP來完成齐唆。這里的端口是應(yīng)用層的各種協(xié)議進(jìn)程與運(yùn)輸實(shí)體進(jìn)行層間交互的一種地址嗤栓。
TCP/IP的運(yùn)輸層用一個(gè)16位端口號來標(biāo)志一個(gè)端口。但是箍邮,端口號只具有本地意義茉帅,它只是為了標(biāo)志本計(jì)算機(jī)應(yīng)用層中的各個(gè)進(jìn)程在運(yùn)輸層交互時(shí)的層間接口。在因特網(wǎng)不同計(jì)算機(jī)中锭弊,相同的端口號是沒有關(guān)聯(lián)的堪澎。由此可見,兩個(gè)計(jì)算機(jī)中的進(jìn)程要通信味滞,不僅要知道對方的IP地址(為了找到對方的計(jì)算機(jī))樱蛤,還要知道對方的端口號(為了找到對方計(jì)算機(jī)中的應(yīng)用進(jìn)程)钮呀。
因特網(wǎng)上的計(jì)算機(jī)通信是采用客戶-服務(wù)器方式∽蚍玻客戶在發(fā)起通信請求式爽醋,必須先知道對方的IP地址和端口號。因此運(yùn)輸層的端口號分為服務(wù)器端使用的端口號和客戶端使用的端口號便脊。
2 用戶數(shù)據(jù)報(bào)協(xié)議UDP
UDP協(xié)議只在IP的數(shù)據(jù)報(bào)服務(wù)之上增加了很少的功能蚂四,就是復(fù)用和分用的功能以及差錯(cuò)檢測的功能。UDP的主要特點(diǎn)是:
- UDP是無連接的哪痰,即發(fā)送數(shù)據(jù)之間不需要建立連接遂赠,因此減少了開銷和發(fā)送數(shù)據(jù)之前的時(shí)延。
- UDO使用盡最大努力交付晌杰,即不保證可靠交付跷睦,因此主機(jī)不需要維持復(fù)雜的連接狀態(tài)。
- UDP是面向報(bào)文乎莉。發(fā)送方的UDP對應(yīng)用程序交下來的報(bào)文在添加首部后就向下交付給IP層送讲,對交下來的報(bào)文既不合并也不拆分。因此惋啃,應(yīng)用進(jìn)程必須選擇合適大小的報(bào)文哼鬓,若報(bào)文太長,UDP把它交付給IP層后边灭,IP層在傳送時(shí)可能要進(jìn)行分片异希,這會降低IP層的效率;反之绒瘦,若報(bào)文太短称簿,UDO把它交給IP層后,會使IP數(shù)據(jù)報(bào)的首部的相對長度太大惰帽,也降低了IP層的效率憨降。
- UDP沒有擁塞控制,保證了應(yīng)用的實(shí)時(shí)性该酗。
- 支持一對一授药、一對多、多對一和多對多的交互通信呜魄。
- UDP的首部開銷小悔叽,只有8個(gè)字節(jié),比TCP的20個(gè)字節(jié)的首部要短爵嗅。
2.1 UDP首部的格式
UDP有數(shù)據(jù)字段和首部字段兩個(gè)字段娇澎。首部字段只有8個(gè)字節(jié),分別為源端口睹晒、目的端口趟庄、長度和檢驗(yàn)和括细。檢驗(yàn)和用于檢測UDP用戶數(shù)據(jù)報(bào)在傳輸中是否有錯(cuò),有錯(cuò)就丟棄戚啥。
當(dāng)運(yùn)輸層從IP層收到UDP數(shù)據(jù)報(bào)時(shí)勒极,就根據(jù)首部中的目的端口,把UDP數(shù)據(jù)報(bào)通過相應(yīng)的端口上交給進(jìn)程虑鼎。如果接方UDP發(fā)現(xiàn)收到的報(bào)文中的目的端口不正確就丟棄報(bào)文,并由ICMP發(fā)送“端口不可達(dá)”差錯(cuò)報(bào)文交給發(fā)送方键痛。
在計(jì)算檢驗(yàn)和時(shí)炫彩,要在UDP用戶數(shù)據(jù)報(bào)之前增加12個(gè)字節(jié)的偽首部⌒醵蹋“偽首部”并不是用戶數(shù)據(jù)報(bào)真正的首部江兢,只是在計(jì)算檢驗(yàn)和時(shí),臨時(shí)添加在UDP數(shù)據(jù)報(bào)前面丁频,得到一個(gè)臨時(shí)UDP數(shù)據(jù)報(bào)杉允。偽首部既不向下傳送也不向上遞交,僅僅是為了計(jì)算檢驗(yàn)和席里。
2.2 UDP的典型應(yīng)用
- UDP適合于這樣的進(jìn)程:需要簡單的請求-響應(yīng)通信叔磷,而較少考慮流量控制和差錯(cuò)控制。對于需要傳送成塊數(shù)據(jù)的進(jìn)程(如FTP)則不適合使用UDP奖磁。
- UDP適合于具有內(nèi)部流量控制和差錯(cuò)控制機(jī)制的進(jìn)程改基,如簡單文件傳輸協(xié)議TFTP。
- 對多播來說咖为,UDP是一個(gè)合適的傳輸協(xié)議秕狰。
- UDP常用于交互實(shí)時(shí)應(yīng)用,以避免接收報(bào)文之間的不一致延時(shí)躁染。
- UDP可用于管理進(jìn)程鸣哀,如SNMP。
3 傳輸控制協(xié)議TCP
3.1 TCP最主要的特點(diǎn)
- TCP是面向連接的運(yùn)輸層協(xié)議吞彤。應(yīng)用程序在使用TCP協(xié)議之前我衬,必須先簡歷TCP連接。在傳送數(shù)據(jù)完畢后备畦,必須釋放已經(jīng)簡歷的TCP連接低飒。
- 每一條TCP連接只能有兩個(gè)端點(diǎn),只能是點(diǎn)對點(diǎn)的懂盐。
- TCP提供可靠交付的服務(wù)褥赊。TCP連接傳送的數(shù)據(jù)保證無差錯(cuò)、不丟失莉恼、不重復(fù)拌喉、并按序到達(dá)速那。
- TCP提供全雙工通信。TCP允許通信雙方的應(yīng)用進(jìn)程在任何時(shí)候都能發(fā)送數(shù)據(jù)尿背。TCP連接的兩端都設(shè)有發(fā)送緩存和接收緩存端仰,用來臨時(shí)存放雙向通信的數(shù)據(jù)。
- 面向字節(jié)流田藐。雖然應(yīng)用程序和TCP的交互是一次一個(gè)數(shù)據(jù)塊荔烧,但TCP把應(yīng)用程序交下來的數(shù)據(jù)看成是一連串的務(wù)結(jié)構(gòu)的字節(jié)流。TCP不保證接收方應(yīng)用程序所收到的數(shù)據(jù)塊和發(fā)送方應(yīng)用程序所發(fā)出的數(shù)據(jù)塊具有對應(yīng)大小的關(guān)系(例如汽久,發(fā)送方應(yīng)用程序交給發(fā)送方TCP共有10個(gè)數(shù)據(jù)塊鹤竭,但接收方TCP可能只用了4個(gè)數(shù)據(jù)塊就把收到的字節(jié)流交付給了上層應(yīng)用程序)。但接收方應(yīng)用程序收到的字節(jié)流必須和發(fā)送方應(yīng)用程序發(fā)出的字節(jié)流完全一樣景醇。
3.2 TCP的連接
每一條TCP連接有兩個(gè)端點(diǎn)臀稚,而TCP的端點(diǎn)叫做套接字(由端口號拼接到IP地址形成的),套接字的表示方法是在點(diǎn)分十進(jìn)制的IP地址后面寫上端口號三痰,中間用冒號或都好隔開吧寺。
套接字Socket = (IP地址: 端口號)
每一條TCP連接唯一的被通信兩端的兩個(gè)套接字所確定:
TCP連接::={socket1, socket2} = {(IP1:port1), (IP2:port2)}
3.3 TCP報(bào)文的首部格式
TCP雖然是面向字節(jié)流的,但TCP傳送的數(shù)據(jù)單元卻是報(bào)文段散劫。一個(gè)TCP報(bào)文段分為首部和數(shù)據(jù)兩部分稚机,而TCP的全部功能都體現(xiàn)在它首部中各字段的作用。因此舷丹,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理抒钱。TCP報(bào)文首部固定部分各字段的意義如下:
源端口和目的端口
各占兩字節(jié),分別寫入源端口號和目的端口號颜凯。TCP的分用也是通過端口實(shí)現(xiàn)的谋币。報(bào)文段序號
占4字節(jié)。在一個(gè)TCP連接中傳送的字節(jié)流中的每一個(gè)字節(jié)都按順序編號症概。整個(gè)要傳送的字節(jié)流的起始序號必須在連接建立時(shí)設(shè)置蕾额,首部中的序號字段值則是指本報(bào)文所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號。確認(rèn)號
期望收到對方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號彼城。若確認(rèn)號為N诅蝶,則表明到序號N-1為止的所有數(shù)據(jù)都已正確收到。數(shù)據(jù)偏移
指出TCP報(bào)文段的數(shù)據(jù)起始處距離TCP報(bào)文段的起始處有多遠(yuǎn)募壕,實(shí)際上指出了TCP報(bào)文段的首部長度调炬。保留
保留為今后使用,目前應(yīng)置為0.6個(gè)控制位
緊急URG:當(dāng)URG為1時(shí)舱馅,表明緊急指針字段有效缰泡,告訴系統(tǒng)有緊急數(shù)據(jù),應(yīng)盡快優(yōu)先傳送代嗤。
確認(rèn)ACK:TCP規(guī)定棘钞,在連接建立后所有傳送的報(bào)文段都必須把ACK置1缠借。
推送PSH,很少使用宜猜。
復(fù)位RST:當(dāng)RST=1時(shí)泼返,表明TCP連接中出現(xiàn)嚴(yán)重錯(cuò)誤,必須釋放連接姨拥,然后再重新建立運(yùn)輸連接绅喉。
同步SYN:在連接建立時(shí)用來同步序號。當(dāng)SYN=1而ACK=0時(shí)叫乌,表明這是一個(gè)連接請求報(bào)文段霹疫。對方若同意建立連接,則應(yīng)在響應(yīng)的報(bào)文段中使用SYN=1和ACK=1.
終止FIN:用來釋放一個(gè)連接综芥。當(dāng)FIN=1時(shí),表明此報(bào)文段的發(fā)送方的數(shù)據(jù)已發(fā)送完畢猎拨,并要求釋放運(yùn)輸連接膀藐。窗口
窗口字段明確指出了現(xiàn)在允許對方發(fā)送的數(shù)據(jù)量,該值經(jīng)常在動(dòng)態(tài)變化著红省。例如额各,設(shè)確認(rèn)號是701,窗口字段是1000吧恃。這就表明從701算起虾啦,發(fā)送此報(bào)文段的一方還有接收1000個(gè)字節(jié)數(shù)據(jù)的接收緩存空間。檢驗(yàn)和
檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩部分痕寓。和UDP一樣傲醉,在計(jì)算檢驗(yàn)和時(shí)要在TCP報(bào)文段的前面加上12字節(jié)的偽首部。緊急指針
緊急指針僅在URG=1時(shí)才有意義呻率,它指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)硬毕。**即使窗口為零時(shí)也可發(fā)送緊急數(shù)據(jù)。選項(xiàng)
可選選項(xiàng)有最大報(bào)文長度MSS礼仗、窗口擴(kuò)大選項(xiàng)吐咳、時(shí)間戳選項(xiàng)、選擇確認(rèn)選項(xiàng)等
3.4 TCP可靠傳輸?shù)膶?shí)現(xiàn)
為方便描述可靠傳輸原理元践,假定數(shù)據(jù)傳輸只在一個(gè)方向上進(jìn)行韭脊,即A發(fā)送數(shù)據(jù),B給出確認(rèn)单旁。TCP的滑動(dòng)窗口是以字節(jié)為單位的沪羔。假定A收到B發(fā)來的確認(rèn)報(bào)文字段,其中窗口是20字節(jié)慎恒,而確認(rèn)號是31字節(jié)任内。(表明B期望接收到的下一個(gè)序號是31撵渡,序號30之前的數(shù)據(jù)已經(jīng)收到了)。A的發(fā)送窗口的位置由B發(fā)來的確認(rèn)報(bào)文中的確認(rèn)號和窗口大小確定死嗦。
現(xiàn)在假定A發(fā)送了序號為31-41的數(shù)據(jù)趋距,從下圖圖中可以看出要描述一個(gè)發(fā)送窗口的狀態(tài)需要三個(gè)指針P1, P2越除, P3节腐。小于P1的是已發(fā)送并收到確認(rèn)的部分,大于P3的是不允許發(fā)送部分摘盆。
B的接收窗口大小為20翼雀。在接收窗口外面,到30號為止的數(shù)據(jù)均發(fā)送過確認(rèn)并交付主機(jī)使用孩擂,因此B不再保留(之前的數(shù)據(jù))狼渊。假設(shè)B收到了32和33的數(shù)據(jù),卻沒收到31的數(shù)據(jù)(并不保證按序到達(dá))类垦。因此B的發(fā)送的確認(rèn)號仍然是31狈邑,而不能是32或33。
現(xiàn)假定B收到序號為31的數(shù)據(jù)并把序號為31-33的數(shù)據(jù)交付給主機(jī)蚤认,并刪除這些數(shù)據(jù)米苹。接著把接收窗口向前移動(dòng)3個(gè)序號,同時(shí)給A發(fā)出確認(rèn)砰琢。其窗口值仍為20蘸嘶,但確認(rèn)號為34,表明B已經(jīng)接收到序號33為止的數(shù)據(jù)。而B收到的37陪汽、38和40的數(shù)據(jù)训唱,但沒按序到達(dá),只能先暫存在接收窗口中挚冤。A收到B的確認(rèn)后雪情,將發(fā)送窗口向前滑動(dòng)3個(gè)序號,但指針P2不動(dòng)你辣。A繼續(xù)發(fā)送完序號42-53的數(shù)據(jù)后巡通,指針P2向前與P3重合,發(fā)送窗內(nèi)的數(shù)據(jù)以發(fā)送完舍哄,但還沒收到確認(rèn)宴凉,因此必須停止發(fā)送。
緩存機(jī)制
在3.1節(jié)的圖中提到表悬,發(fā)送方的應(yīng)用進(jìn)程把字節(jié)流寫入TCP的發(fā)送緩存弥锄,接收方的應(yīng)用進(jìn)程從TCP的接受緩存中讀取字節(jié)流。下面進(jìn)一步談?wù)摯翱谂c緩存的關(guān)系。
發(fā)送緩存用來暫時(shí)存放:發(fā)送應(yīng)用程序傳送給發(fā)送方TCP準(zhǔn)備的數(shù)據(jù)籽暇,TCP已發(fā)送但尚未收到確認(rèn)的數(shù)據(jù)温治。發(fā)送窗口通常只是發(fā)送緩存的一部分,已被確認(rèn)的數(shù)據(jù)應(yīng)當(dāng)從發(fā)送緩存中刪除戒悠,因此發(fā)送緩存與發(fā)送窗口的后沿是重合的熬荆。發(fā)送應(yīng)用程序必須控制寫入緩存的速率,不能太快绸狐,否則發(fā)送緩存就會沒有存放數(shù)據(jù)的空間卤恳。
接收緩存用來暫時(shí)存放:按序到達(dá)的,但尚未被接收應(yīng)用程序讀取的數(shù)據(jù)寒矿;未按序到達(dá)的數(shù)據(jù)突琳。如果收到的分組檢測出有差錯(cuò),則要丟棄符相。如果接收應(yīng)用程序來不及讀取收到的數(shù)據(jù)拆融,接收緩存最終就會被填滿,使接收窗口減小到0啊终。反之冠息,接收應(yīng)用程序能夠及時(shí)從接收緩存中讀取收到數(shù)據(jù),接收窗口就會變大孕索,但最大也不能超過接收緩存的大小。
超時(shí)重傳機(jī)制
TCP每發(fā)送一個(gè)報(bào)文段躏碳,就對這個(gè)報(bào)文段設(shè)置一次計(jì)時(shí)器搞旭。只要達(dá)到計(jì)時(shí)器設(shè)置的重傳時(shí)間還沒有收到確認(rèn),就要重傳這個(gè)報(bào)文段菇绵。由于數(shù)據(jù)鏈路層和運(yùn)輸層的往返實(shí)驗(yàn)概率分布存在很大差異肄渗,因此有必要選擇合適的超時(shí)重傳時(shí)間。
TCP采用了一中自適應(yīng)算法來確定超時(shí)重傳時(shí)間咬最,它記錄一個(gè)報(bào)文段發(fā)出的時(shí)間翎嫡,以及收到相應(yīng)的確認(rèn)的時(shí)間。這兩個(gè)時(shí)間差就是報(bào)文段的往返時(shí)間RTT永乌。TCP保留了RTT的一個(gè)加權(quán)平均往返時(shí)間RTTs惑申,RTTs的計(jì)算方法如下,推薦的阿爾法值為1/8翅雏。
顯然超時(shí)重傳時(shí)間RTO應(yīng)略大于RTTs:
其中RTTd是TTT的偏差的加權(quán)平均值圈驼。
選擇確認(rèn)SACK
若收到的報(bào)文段無差錯(cuò),只是未按序號望几,中間還缺少一些序號的數(shù)據(jù)绩脆,采用選擇確認(rèn)的方法來傳送缺少的數(shù)據(jù),而不重傳已經(jīng)正確接收到的數(shù)據(jù)。
用一個(gè)例子來說明(Selctive ACK)工作原理靴迫。如圖所示惕味,接收放收到了前面的字節(jié)流不連續(xù)的兩個(gè)字節(jié)塊。如果這些字節(jié)的序號都在接收窗口內(nèi)玉锌,那么接收方就先收下這些數(shù)據(jù)名挥,但要把這些信息準(zhǔn)確的告訴發(fā)送放,使發(fā)送方不要在重復(fù)發(fā)送這些已經(jīng)收到的數(shù)據(jù)芬沉。
TCP首部沒有哪個(gè)字段能夠提供上述這些字節(jié)快的邊界信息躺同。如果要使用選擇確認(rèn),那么在建立TCP連接時(shí)丸逸,就要在TCP首部的選項(xiàng)上加上“允許SACK”的選項(xiàng)蹋艺。
3.5 TCP的流量控制與擁塞控制
流量控制
所謂的流量控制就是讓發(fā)送方的發(fā)送速率不要太快,讓接收方來得及接受黄刚。利用滑動(dòng)窗口機(jī)制可以很方便的在TCP連接上實(shí)現(xiàn)對發(fā)送方的流量控制捎谨。
擁塞控制
在某段時(shí)間,若對網(wǎng)絡(luò)中的某一資源的需求超過了該資源所能提供的可用部分憔维,網(wǎng)絡(luò)的性能就要變化涛救,這種情況叫做擁塞。網(wǎng)絡(luò)擁塞往往是由許多因素引起的业扒,簡單的提高節(jié)點(diǎn)處理機(jī)的速度或者擴(kuò)大結(jié)點(diǎn)緩存的存儲空間并不能解決擁塞問題检吆。問題的是指往往是整個(gè)系統(tǒng)的各個(gè)部分不匹配,只有各個(gè)部分平衡了程储,問題才會得到解決蹭沛。
擁塞控制和流量控制的差別
- 所謂擁塞控制就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載章鲤。擁塞控制所要做的都有一個(gè)前提摊灭,就是網(wǎng)絡(luò)能承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。
- 流量控制往往指的是點(diǎn)對點(diǎn)通信量的控制败徊,是個(gè)端到端的問題帚呼。流量控制所要做的就是控制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接受皱蹦。
擁塞控制是很難設(shè)計(jì)的煤杀,因?yàn)樗且粋€(gè)動(dòng)態(tài)的問題,許多情況下沪哺,甚至正式擁塞控制機(jī)制本身成為引起網(wǎng)絡(luò)性能惡化甚至死鎖的原因怜珍。RFC定義了進(jìn)行擁塞控制的四種算法:慢開始、擁塞避免凤粗、快重傳和快恢復(fù)酥泛。
3.6 TCP連接的建立與終止
TCP連接的建立可以簡單的稱為三次握手今豆,而連接的中止則可以叫做四次握手。
TCP的建立
- 首先柔袁,客戶端向服務(wù)器申請打開某一個(gè)端口(用SYN段等于1的TCP報(bào)文)呆躲;
- 然后,服務(wù)器端發(fā)回一個(gè)ACK報(bào)文通知客戶端請求報(bào)文收到捶索;
- 客戶端收到確認(rèn)報(bào)文以后再次發(fā)出確認(rèn)報(bào)文插掂,確認(rèn)剛才服務(wù)器端發(fā)出的確認(rèn)報(bào)文。
至此腥例,連接的建立完成辅甥。這就叫做三次握手。如果打算讓雙方都做好準(zhǔn)備的話燎竖,一定要發(fā)送三次報(bào)文璃弄,而且只需要三次報(bào)文就可以了。如果再加上TCP的超時(shí)重傳機(jī)制构回,那么TCP就完全可以保證一個(gè)數(shù)據(jù)包被送到目的地夏块。
TCP的終止
建立一個(gè)連接需要三次握手,而終止一個(gè)連接要經(jīng)過4次握手纤掸,這是由TCP的半關(guān)閉(half close)造成的脐供。既然一個(gè) TCP連接是全雙工(即數(shù)據(jù)在兩個(gè)方向上能同時(shí)傳遞),因此每個(gè)方向必須單獨(dú)地進(jìn)行關(guān)閉借跪。這原則就是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè) FIN來終止這個(gè)方向連接政己。當(dāng)一端收到一個(gè) FIN,它必須通知應(yīng)用層另一端幾經(jīng)終止了那個(gè)方向的數(shù)據(jù)傳送掏愁。
客戶機(jī)給服務(wù)器一個(gè)FIN為1的TCP報(bào)文歇由,然后服務(wù)器返回給客戶端一個(gè)確認(rèn)ACK報(bào)文,并且發(fā)送一個(gè)FIN報(bào)文托猩,當(dāng)客戶機(jī)回復(fù)ACK報(bào)文后(四次握手),連接就結(jié)束了辽慕。
TCP的狀態(tài)變遷圖
TCP常見狀態(tài)
TCP/IP詳解學(xué)習(xí)筆記(10)-TCP連接的建立與中止
3.7 TCP計(jì)時(shí)器
為更平穩(wěn)地執(zhí)行操作京腥,TCP使用至少四種計(jì)時(shí)器:重傳、堅(jiān)持溅蛉、惫耍活和時(shí)間等待計(jì)時(shí)器