找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1872|回復(fù): 0
收起左側(cè)

TCP 的數(shù)據(jù)流

[復(fù)制鏈接]
ID:107189 發(fā)表于 2016-3-6 00:06 | 顯示全部樓層 |閱讀模式
     TCP的數(shù)據(jù)流大致可以分為兩類,交互數(shù)據(jù)流與成塊的數(shù)據(jù)流。交互數(shù)據(jù)流就是發(fā)送控制命令的數(shù)據(jù)流,比如relogin,telnet,ftp命令等等;成塊數(shù)據(jù)流是用來發(fā)送數(shù)據(jù)的包,網(wǎng)絡(luò)上大部分的TCP包都是這種包。
       很明顯,TCP在傳輸這兩種類型的包時的效率是不一樣的,因此為了提高TCP的傳輸效率,應(yīng)該對這兩種類型的包采用不同的算法。
       總之,TCP的傳輸原則是盡量減少小分組傳輸?shù)臄?shù)量。
TCP的交互式數(shù)據(jù)流
Ø         經(jīng)受時延的確認(rèn)技術(shù)
TCP的交互式數(shù)據(jù)流通常使用“經(jīng)過時延的確認(rèn)”技術(shù)。通常Server在接收到從Client發(fā)送過來的數(shù)據(jù)時,并不馬上發(fā)送ACK,而是等一小段時間,看看本機(jī)是否有數(shù)據(jù)要反饋給Client,如果有,就將數(shù)據(jù)包含在此ACK包中,以前發(fā)送給Client。一般情況下這個時延為200ms。需要注意的時這個200ms的定時器時相對于內(nèi)核的時鐘滴答的,也就是jeffs的。加入一個數(shù)據(jù)分組到達(dá)后,此定時器已經(jīng)pass100ms,那么再過100ms ACK才會被發(fā)送,如果在這100ms內(nèi)有數(shù)據(jù)要反饋,則在100msACK會和數(shù)據(jù)一起發(fā)送。
      
Ø         Nagle算法分析。
Nagle算法主要用來預(yù)防小分組的產(chǎn)生。在廣域網(wǎng)上,大量TCP小分組極有可能造成網(wǎng)絡(luò)的擁塞。
       Nagle時針對每一個TCP連接的。它要求一個TCP連接上最多只能有一個未被確認(rèn)的小分組。在改分組的確認(rèn)到達(dá)之前不能發(fā)送其他小分組。TCP會搜集這些小的分組,然后在之前小分組的確認(rèn)到達(dá)后將剛才搜集的小分組合并發(fā)送出去。
       有時候我們必須要關(guān)閉Nagle算法,特別是在一些對時延要求較高的交互式操作環(huán)境中,所有的小分組必須盡快發(fā)送出去。
       我們可以通過編程取消Nagle算法,利用TCP_NODELAY選項(xiàng)來關(guān)閉Nagle算法。
TCP成塊數(shù)據(jù)流
       TCP成塊數(shù)據(jù)流相關(guān)的東西有很多,比如流量控制,緊急數(shù)據(jù)傳輸,數(shù)據(jù)窗口大小調(diào)整等等。
Ø         正常數(shù)據(jù)流
TCP通常不會對每個到達(dá)的數(shù)據(jù)分段進(jìn)行確認(rèn)操作,通常一個ACK報(bào)文可以確認(rèn)多個成塊數(shù)據(jù)段報(bào)文,通常情況下是兩個成塊數(shù)據(jù)報(bào)文段需要一個ACK報(bào)文確認(rèn)。通常是由下面的原有造成的 :當(dāng)收到一個報(bào)文后,此TCP連接被標(biāo)識未一個未完成的時延確認(rèn),當(dāng)再次收到一個數(shù)據(jù)報(bào)文后,此連接有兩個未確認(rèn)的報(bào)文段,TCP馬上發(fā)送一個ACK,當(dāng)?shù)谌齻數(shù)據(jù)報(bào)文到達(dá)后,第四個報(bào)文到達(dá)前,通常此TCP連接已經(jīng)經(jīng)過了200ms延時,因此一個ACK被發(fā)送,這樣的循環(huán)周而復(fù)始,從而出現(xiàn)了一個ACK確認(rèn)兩個數(shù)據(jù)報(bào)文的情況。當(dāng)然,ACK的產(chǎn)生很大程度上和其接收數(shù)據(jù)報(bào)文段的時間緊密相關(guān),也就是和Client段發(fā)送數(shù)據(jù)的頻率相關(guān),和網(wǎng)絡(luò)擁塞程度相關(guān),和ClientServer兩端的處理能力相關(guān),總是是一個多因素決定的結(jié)果。
Ø         TCP的滑動窗口協(xié)議
TCP使用滑動窗口協(xié)議來進(jìn)行流量控制。特別需要注意的是,滑動窗口是一個抽象的概念,它是針對每一個TCP連接的,而且是有方向的,一個TCP連接應(yīng)該有兩個滑動窗口,每個數(shù)據(jù)傳輸方向上有一個,而不是針對連接的每一端的。
窗口左邊沿向右邊滑動叫做窗口合攏,表示發(fā)送方發(fā)送了數(shù)據(jù)或者接收到了確認(rèn);窗口右邊沿向右邊滑動叫做窗口的張開,表示數(shù)據(jù)已經(jīng)被用戶空間進(jìn)程接收并且釋放了緩存;窗口左邊沿向左移動則表明此ACK是重復(fù)ACK,應(yīng)該丟棄;窗口右邊沿向左移動叫做窗口收縮,一般不會有人這樣做。
當(dāng)左邊沿和右邊沿重合的時候表明窗口大小是0,此時發(fā)送方不應(yīng)該在發(fā)送數(shù)據(jù)了,因?yàn)榻邮辗降慕邮站彌_區(qū)已滿,用戶進(jìn)程還沒以接收。當(dāng)用戶進(jìn)程接收完成后,接收方應(yīng)該發(fā)送一個ACK,表明此時的接收窗口已經(jīng)恢復(fù),此ACK的序號同前一個win0ACK相同。
同樣,在實(shí)現(xiàn)中,發(fā)送方不必發(fā)送一個全窗口的數(shù)據(jù),但是它當(dāng)然可以這樣做。ACK總是將窗口向右邊滑動,窗口的大小可以減小,接收方在發(fā)送ACK之前不必等待窗口被填滿(即變?yōu)?font face="Times New Roman">0),很多實(shí)現(xiàn)是收到兩個數(shù)據(jù)報(bào)文段后立刻發(fā)送ACK
Ø         TCP窗口大小的調(diào)整
TCP窗口的大小通常由接收端來確認(rèn),也就是在TCP建立連接的第二個SYN+ACK報(bào)文的Win字段來確認(rèn)。
當(dāng)然,程序可以隨時改變這個窗口(緩存)的大小。默認(rèn)的窗口大小是4096字節(jié),但是對于文件傳輸來說這并不是一個理想的數(shù)字,如果程序的主要目的是傳輸文件,那么最好將這個緩存設(shè)置到最大,但是這樣可能會造成發(fā)送端連續(xù)發(fā)送多個數(shù)據(jù)報(bào)文段后,接收方才反饋一個ACK的情況,當(dāng)然,這也沒有什么不可以的,只要不超時,就不算錯。
Ø         TCPPUSH
PUSHTCP報(bào)頭中的一個標(biāo)志位,發(fā)送方在發(fā)送數(shù)據(jù)的時候可以設(shè)置這個標(biāo)志位。該標(biāo)志通知接收方將接收到的數(shù)據(jù)全部提交給接收進(jìn)程。這里所說的數(shù)據(jù)包括與此PUSH包一起傳輸?shù)臄?shù)據(jù)以及之前就為該進(jìn)程傳輸過來的數(shù)據(jù)。
當(dāng)Server端收到這些數(shù)據(jù)后,它需要立刻將這些數(shù)據(jù)提交給應(yīng)用層進(jìn)程,而不再等待是否還有額外的數(shù)據(jù)到達(dá)。
那么應(yīng)該合適設(shè)置PUSH標(biāo)志呢?實(shí)際上現(xiàn)在的TCP協(xié)議棧基本上都可以自行處理這個問題,而不是交給應(yīng)用層處理。如果待發(fā)送的數(shù)據(jù)會清空發(fā)送緩存,那么棧就會自動為此包設(shè)置PUSH標(biāo)志,源于BSD的棧一般都會這么做,而且,BSD TCP STACK也從來不會將收到的數(shù)據(jù)推遲提交給應(yīng)用程序,因此,在BSD TCP STACK中,PUSH位是被忽略的,因?yàn)楦揪蜎]有用。
Ø         TCP的慢啟動(擁塞窗口)
TCP在局域網(wǎng)環(huán)境中的效率是很高的,但是到了廣域網(wǎng)的環(huán)境中情況就不同了,在發(fā)送方和接收方之間可能存在多個Router以及一些速率比較慢的鏈路,而且一些中繼路由器必須緩存分組,還可能分片,所以在廣域網(wǎng)的環(huán)境中,TCP的效率可能出現(xiàn)問題。
為了解決這個問題,現(xiàn)在的TCP棧都支持“慢啟動”算法,即擁塞窗口控制算法。該算法通過觀察到新分組進(jìn)入網(wǎng)絡(luò)的速率與另一端返回ACK的速率相同而工作。其實(shí),擁塞窗口是發(fā)送方使用的一種流量控制算法。
慢啟動為TCP的發(fā)送方增加了一個擁塞窗口,當(dāng)連接建立時,擁塞窗口被初始化為一個報(bào)文段大小,每收到一個ACK,擁塞窗口就會增加一個報(bào)文段,發(fā)送方取擁塞窗口與通過窗口的最小值作為發(fā)送的上限。
Ø         TCP成塊數(shù)據(jù)吞吐量
TCP窗口大小,窗口流量控制,慢啟動對TCP的成塊數(shù)據(jù)傳輸綜合作用,可能對TCP的數(shù)據(jù)傳輸有意想不到的影響。
       RTTRound-Trip Time :往返時間。是指一個報(bào)文段從發(fā)出去到收到此報(bào)文段的ACK所經(jīng)歷的時間。通常一個報(bào)文段的RTT與傳播時延和發(fā)送時延兩個因素相關(guān)。
       在發(fā)送的過程中有可能發(fā)生這樣的情況,即TCP兩端的傳輸“管道”被填滿,即整個管道上都有數(shù)據(jù)在跑,此時不管擁塞窗口和通告窗口是多少,管道上都不能在容納更多的數(shù)據(jù)了。此時每當(dāng)接收方從網(wǎng)絡(luò)上移去一個報(bào)文段,發(fā)送方就發(fā)送一個,但是管道上的ACK總是固定的,這種情況就是連接的理想穩(wěn)定狀態(tài)。
       一般情況下帶寬*時延就是一條線路的容量,因此吧RTT減小可以增加一條線路的容量,注意RTT加大的意思時傳輸時間減!
       當(dāng)數(shù)據(jù)由一個大的管道向一個小的管道傳輸時,就有可能發(fā)生擁塞,例如,當(dāng)若干輸入流到達(dá)一個路由器,而此路由器的輸出帶寬小于這些輸入流的帶寬總和時,就會發(fā)生擁塞。這種情況普遍見于局域網(wǎng)與廣域網(wǎng)的接口處。如果發(fā)送方處于局域網(wǎng),而且不使用慢啟動,使用局域網(wǎng)的帶寬盡快的發(fā)送報(bào)文,那么返回的ACK之間的間隔與最慢的廣域網(wǎng)鏈路一致。而且,由于路由器轉(zhuǎn)發(fā)包速度慢,所以路由器就有可能主動丟失分組包。
Ø         TCP的緊急方式
TCP提供了一種“緊急方式”的數(shù)據(jù)傳輸方式,TCP的一端可以告訴另一端有些具有某種方式的緊急數(shù)據(jù)被放在了普通的數(shù)據(jù)流中,接收方可以自行選擇處理。緊急方式客廳通過設(shè)置TCPURG標(biāo)識位與緊急指針的偏移量來設(shè)置。這個緊急指針指向緊急數(shù)據(jù)的最后一個字節(jié)(也有可能是最后一個字節(jié)的下一個字節(jié))。
現(xiàn)在有許多實(shí)現(xiàn)將緊急方式叫做“帶外數(shù)據(jù)”,其實(shí)這是不正確的。
       目前緊急指針被用來禁止停止FTP的數(shù)據(jù)傳輸。不過總的來說,用的不多。
       對于數(shù)據(jù)傳輸來說,如果用緊急數(shù)據(jù)來傳輸大量數(shù)據(jù),這種方法顯然是不可取的,再建立一個TCP連接不是更簡單有效嗎?

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表