TCP連接
????????TCP/IP是全球計(jì)算機(jī)及網(wǎng)絡(luò)設(shè)備都在使用的一種常用的分組交換網(wǎng)絡(luò)分層協(xié)議集。客戶端應(yīng)用程序可以打開一條TCP / IP 連接毡证,連接到可能運(yùn)行在世界任何地方的服務(wù)器應(yīng)用程序舞虱。一旦連接建立起來(lái)气嫁,在客戶端和服務(wù)器的的計(jì)算機(jī)之間交互的報(bào)文就永遠(yuǎn)不會(huì)丟失、受損和失序冗疮。
????????一萄唇、TCP的可靠數(shù)據(jù)管道
?????????????????TCP為HTTP提供了一條可靠的比特傳輸管道。從TCP連接一端填入的字節(jié)會(huì)從另一端以原有的順序术幔、正確的傳送過(guò)來(lái)另萤。
? ? ? ? 二、TCP流是分段的,由IP分組傳送? ???
????????????????TCP的數(shù)據(jù)是通過(guò)名為IP分組的小數(shù)據(jù)塊來(lái)發(fā)送的 ?? ??
? ? ? ????????? HTTP要傳送一條報(bào)文時(shí)四敞,會(huì)以流的形式將報(bào)文數(shù)據(jù)的內(nèi)容通過(guò)一條打開的TCP連接按序傳輸泛源。TCP收到數(shù)據(jù)流之后,會(huì)將數(shù)據(jù)流砍成被稱作段的小數(shù)據(jù)塊忿危,并將段封裝在IP分組中达箍,通過(guò)因特網(wǎng)進(jìn)行傳輸。每個(gè)IP分組包括(1癌蚁、IP分組首部【包含了源和目的IP地址幻梯、長(zhǎng)度和其他標(biāo)記】。2努释、TCP段首部【包含了TCP端口號(hào)碘梢、TCP控制標(biāo)記、以及用于數(shù)據(jù)排序和完整性檢查的數(shù)字值】伐蒂。3煞躬、TCP數(shù)據(jù)塊)。
? ? ? ? 三逸邦、保持TCP連接的正確運(yùn)行
????????????????TCP是通過(guò)端口號(hào)來(lái)保持所有這些連接的正確運(yùn)行恩沛。TCP連接是通過(guò)4個(gè)值來(lái)識(shí)別的:?<源IP地址、源端口號(hào)缕减、目的IP地址雷客、目的端口號(hào)>這四個(gè)值一起唯一地定義了一條連接,兩條不同的TCP連接不能擁有4個(gè)完全相同的地址組件值
? ? ? ? 四搅裙、用TCP套接字編程
? ? ? ? ? ? ? ? 套接字API允許用戶創(chuàng)建端點(diǎn)的數(shù)據(jù)結(jié)構(gòu)將這些端點(diǎn)與遠(yuǎn)程服務(wù)器的TCP端點(diǎn)進(jìn)行連接并對(duì)數(shù)據(jù)流進(jìn)行讀寫。
TCP性能的考慮
? ? ? ? HTTP緊挨著TCP裹芝,位于TCP的上層部逮,所以HTTP事務(wù)的性能在很大程度上取決于底層TCP通道的性能。
? ? ? ? 一嫂易、HTTP事務(wù)的時(shí)延
????????HTTP的時(shí)延有一下幾種原因:(1)、客戶端首先需要根據(jù)URI確定Web服務(wù)器的IP地址和端口號(hào)怜械。(2)颅和、接下來(lái),客戶端會(huì)向服務(wù)器發(fā)送一條TCP連接請(qǐng)求缕允,并等待服務(wù)器回送一個(gè)請(qǐng)求接受應(yīng)答融虽。(3)、一旦連接建立起來(lái)了灼芭,客戶端就會(huì)通過(guò)新建立的TCP管道來(lái)發(fā)送HTTP請(qǐng)求有额。數(shù)據(jù)到達(dá)時(shí),Web服務(wù)器會(huì)從TCP連接中讀取請(qǐng)求報(bào)文,并對(duì)請(qǐng)求進(jìn)行處理巍佑。(4)茴迁、然后,Web服務(wù)器會(huì)回應(yīng)HTTP響應(yīng)萤衰。? ??? ??
? ? ? ? 【這些TCP網(wǎng)絡(luò)延時(shí)取決于硬件速度堕义,網(wǎng)絡(luò)或者服務(wù)器的負(fù)載,請(qǐng)求響應(yīng)報(bào)文的尺寸脆栋,客戶端與服務(wù)器距離倦卖,TCP技術(shù)的復(fù)雜性】
? ? ? ? 二、性能聚焦區(qū)域
? ? ? ? ? ? ? ? 最長(zhǎng)見的TCP時(shí)延:(1)TCP連接建立握手椿争;(2)TCP慢啟動(dòng)擁塞控制怕膛;(3)數(shù)據(jù)聚集的Nagle算法;(4)用于捎帶確認(rèn)的TCP延遲確認(rèn)算法秦踪;(5)TIME_WAIT時(shí)延和端口耗盡褐捻。
? ? ? ? 三、TCP連接的握手的時(shí)延
? ? ? ? TCP連接握手的步驟:
? ? ? ? ? ? ? ? (1)請(qǐng)求新的TCP連接時(shí)柠逞,客戶端要向服務(wù)器發(fā)送一個(gè)小的TCP分組(通常40~60字節(jié))。這個(gè)分組中設(shè)置了一個(gè)SYN標(biāo)記景馁,說(shuō)明這是一個(gè)連接請(qǐng)求板壮。
? ? ? ? ? ? ? ? (2)如果服務(wù)器接受了連接,就會(huì)對(duì)一些連接參數(shù)進(jìn)行計(jì)算合住,并向客戶端發(fā)送一個(gè)TCP分組绰精,這個(gè)分組中的SYN和ACK標(biāo)記都被置位,說(shuō)明連接請(qǐng)求已被接受聊疲。? ??? ??? ??
? ? ? ? ? ? ? ? (3)最后茬底,客戶端向服務(wù)器回送一條確認(rèn)消息沪悲,通知它連接已成功建立』裰蓿現(xiàn)代的TCP棧都允許客戶端在這個(gè)確認(rèn)分組中發(fā)送數(shù)據(jù)。
? ? ? ? 四殿如、延遲確認(rèn)
? ? ? ? ? ? ? ? 每個(gè)TCP段都有一個(gè)序列號(hào)和數(shù)據(jù)完整性校驗(yàn)和贡珊。每個(gè)段的接受者收到完好的段時(shí),都會(huì)向發(fā)送者回送小的確認(rèn)分組涉馁。如果發(fā)送者沒(méi)有在指定的窗口時(shí)間內(nèi)收到確認(rèn)信息门岔,發(fā)送者就認(rèn)為分組已經(jīng)被破壞或損毀,并重發(fā)數(shù)據(jù)烤送。由于確認(rèn)報(bào)文很小寒随,所以允許TCP相同方向輸出數(shù)據(jù)分組中對(duì)其進(jìn)行“捎帶”,TCP返回的確認(rèn)信息與輸出的數(shù)據(jù)分組結(jié)合在一起,更有效利用網(wǎng)絡(luò)妻往,為增加確認(rèn)報(bào)文找到同向傳輸數(shù)據(jù)分組的可能性互艾,TCP棧實(shí)現(xiàn)一種延時(shí)確認(rèn)算法。
? ? ? ? 延時(shí)確認(rèn)算法會(huì)在一個(gè)特定的窗口內(nèi)將輸出確認(rèn)放在緩沖區(qū)讯泣,以尋找能夠捎帶它的輸出數(shù)據(jù)分組纫普。如果在哪個(gè)時(shí)間段內(nèi)沒(méi)有輸出數(shù)據(jù)分組,就將確認(rèn)信息放在單獨(dú)的分組中傳送好渠。
? ? ? ? 五昨稼、TCP慢啟動(dòng)
? ? ? ? ? ? ? ? TCP數(shù)據(jù)傳輸?shù)男阅苓€取決于TCP連接的試用期。TCP連接會(huì)隨著時(shí)間進(jìn)行自我“調(diào)諧”拳锚,起初會(huì)限制連接的最大速度假栓,如果數(shù)據(jù)成功傳輸,會(huì)隨著時(shí)間的推移提高傳輸?shù)乃俣壬纬_@種調(diào)諧被稱為TCP慢啟動(dòng)但指,用于防止因特網(wǎng)的突然過(guò)載和擁塞。
? ? ? ? ? ? ? ? TCP慢啟動(dòng)限制了一個(gè)TCP端點(diǎn)在任意時(shí)刻可以傳輸?shù)姆纸M數(shù)抗楔。如果每個(gè)HTTP事務(wù)由大量數(shù)據(jù)發(fā)送棋凳,要先發(fā)送一個(gè)分組,確認(rèn)后在發(fā)送兩個(gè)分組连躏,并且每個(gè)分組都要進(jìn)行確認(rèn)剩岳,這種方式稱為“打開擁塞窗口”。
? ? ????六入热、Nagle算法與TCP_NODELAY
? ? ? ? ? ? ? ? Nagle算法試圖在發(fā)送一個(gè)分組之前拍棕,將大量TCP數(shù)據(jù)綁定在一起,以提高網(wǎng)絡(luò)效率勺良。Nagle算法鼓勵(lì)發(fā)送全尺寸的段绰播。只有當(dāng)所有其他分組都被確認(rèn)之后,Nagle算法才允許發(fā)送非全尺寸的分組尚困。如果其他分組仍然在傳輸過(guò)程中蠢箩,就將那部分?jǐn)?shù)據(jù)緩存起來(lái)。只有當(dāng)掛起分組被確認(rèn)事甜,或者緩存中基類了足夠發(fā)送一個(gè)全尺寸分組的數(shù)據(jù)時(shí)谬泌,才會(huì)將緩存的數(shù)據(jù)發(fā)送出去。
? ? ? ? ? ? ? ? HTTP應(yīng)用程序常常會(huì)在自己的棧中設(shè)置參數(shù)TCP_NODELAY逻谦,禁用Nagle算法掌实,提高性能。
? ? ? ? 七邦马、TIME_WAIT累積與端口耗盡
? ? ? ? ? ? ? ? 當(dāng)某個(gè)TCP端點(diǎn)關(guān)閉TCP連接時(shí)贱鼻,會(huì)在內(nèi)存中維護(hù)一個(gè)小的控制塊宴卖,用來(lái)記錄最近所關(guān)閉連接的IP地址和端口號(hào)。? ??? ??? ??? ??
? ? ? ? ? ? ? ? ?在只有一個(gè)客戶端和一臺(tái)Web服務(wù)器的異常情況下邻悬,構(gòu)建一條TCP連接的4個(gè)值
????????????????????????<source-IP-address, source-port, destination-IP-address, destination-port>
????????????????其中的三個(gè)都是固定的----只有源端口號(hào)可以隨意改變
????????????????????????<client-IP, source-port, server-IP, 80> ?
? ? ? ? ? ? ? ? ? ?客戶端每次連接到服務(wù)器上去時(shí)嘱腥,都會(huì)獲得一個(gè)新的源端口,以實(shí)現(xiàn)連接的唯一性拘悦。即使沒(méi)有遇到端口耗盡問(wèn)題齿兔,也要特別小心有大量連接處于打開狀態(tài)的情況,或?yàn)樘幱诘却隣顟B(tài)的連接分配了大量控制塊的情況础米。再有大量打開連接或控制塊的情況下分苇,有些操作系統(tǒng)的速度會(huì)嚴(yán)重減緩。