TCP連接
????????TCP/IP是全球計算機及網絡設備都在使用的一種常用的分組交換網絡分層協議集。客戶端應用程序可以打開一條TCP / IP 連接,連接到可能運行在世界任何地方的服務器應用程序。一旦連接建立起來,在客戶端和服務器的的計算機之間交互的報文就永遠不會丟失、受損和失序。
????????一、TCP的可靠數據管道
?????????????????TCP為HTTP提供了一條可靠的比特傳輸管道。從TCP連接一端填入的字節會從另一端以原有的順序、正確的傳送過來。
? ? ? ? 二、TCP流是分段的,由IP分組傳送? ???
????????????????TCP的數據是通過名為IP分組的小數據塊來發送的 ?? ??
? ? ? ????????? HTTP要傳送一條報文時,會以流的形式將報文數據的內容通過一條打開的TCP連接按序傳輸。TCP收到數據流之后,會將數據流砍成被稱作段的小數據塊,并將段封裝在IP分組中,通過因特網進行傳輸。每個IP分組包括(1、IP分組首部【包含了源和目的IP地址、長度和其他標記】。2、TCP段首部【包含了TCP端口號、TCP控制標記、以及用于數據排序和完整性檢查的數字值】。3、TCP數據塊)。
? ? ? ? 三、保持TCP連接的正確運行
????????????????TCP是通過端口號來保持所有這些連接的正確運行。TCP連接是通過4個值來識別的:?<源IP地址、源端口號、目的IP地址、目的端口號>這四個值一起唯一地定義了一條連接,兩條不同的TCP連接不能擁有4個完全相同的地址組件值
? ? ? ? 四、用TCP套接字編程
? ? ? ? ? ? ? ? 套接字API允許用戶創建端點的數據結構將這些端點與遠程服務器的TCP端點進行連接并對數據流進行讀寫。
TCP性能的考慮
? ? ? ? HTTP緊挨著TCP,位于TCP的上層,所以HTTP事務的性能在很大程度上取決于底層TCP通道的性能。
? ? ? ? 一、HTTP事務的時延
????????HTTP的時延有一下幾種原因:(1)、客戶端首先需要根據URI確定Web服務器的IP地址和端口號。(2)、接下來,客戶端會向服務器發送一條TCP連接請求,并等待服務器回送一個請求接受應答。(3)、一旦連接建立起來了,客戶端就會通過新建立的TCP管道來發送HTTP請求。數據到達時,Web服務器會從TCP連接中讀取請求報文,并對請求進行處理。(4)、然后,Web服務器會回應HTTP響應。? ??? ??
? ? ? ? 【這些TCP網絡延時取決于硬件速度,網絡或者服務器的負載,請求響應報文的尺寸,客戶端與服務器距離,TCP技術的復雜性】
? ? ? ? 二、性能聚焦區域
? ? ? ? ? ? ? ? 最長見的TCP時延:(1)TCP連接建立握手;(2)TCP慢啟動擁塞控制;(3)數據聚集的Nagle算法;(4)用于捎帶確認的TCP延遲確認算法;(5)TIME_WAIT時延和端口耗盡。
? ? ? ? 三、TCP連接的握手的時延
? ? ? ? TCP連接握手的步驟:
? ? ? ? ? ? ? ? (1)請求新的TCP連接時,客戶端要向服務器發送一個小的TCP分組(通常40~60字節)。這個分組中設置了一個SYN標記,說明這是一個連接請求。
? ? ? ? ? ? ? ? (2)如果服務器接受了連接,就會對一些連接參數進行計算,并向客戶端發送一個TCP分組,這個分組中的SYN和ACK標記都被置位,說明連接請求已被接受。? ??? ??? ??
? ? ? ? ? ? ? ? (3)最后,客戶端向服務器回送一條確認消息,通知它連接已成功建立。現代的TCP棧都允許客戶端在這個確認分組中發送數據。
? ? ? ? 四、延遲確認
? ? ? ? ? ? ? ? 每個TCP段都有一個序列號和數據完整性校驗和。每個段的接受者收到完好的段時,都會向發送者回送小的確認分組。如果發送者沒有在指定的窗口時間內收到確認信息,發送者就認為分組已經被破壞或損毀,并重發數據。由于確認報文很小,所以允許TCP相同方向輸出數據分組中對其進行“捎帶”,TCP返回的確認信息與輸出的數據分組結合在一起,更有效利用網絡,為增加確認報文找到同向傳輸數據分組的可能性,TCP棧實現一種延時確認算法。
? ? ? ? 延時確認算法會在一個特定的窗口內將輸出確認放在緩沖區,以尋找能夠捎帶它的輸出數據分組。如果在哪個時間段內沒有輸出數據分組,就將確認信息放在單獨的分組中傳送。
? ? ? ? 五、TCP慢啟動
? ? ? ? ? ? ? ? TCP數據傳輸的性能還取決于TCP連接的試用期。TCP連接會隨著時間進行自我“調諧”,起初會限制連接的最大速度,如果數據成功傳輸,會隨著時間的推移提高傳輸的速度。這種調諧被稱為TCP慢啟動,用于防止因特網的突然過載和擁塞。
? ? ? ? ? ? ? ? TCP慢啟動限制了一個TCP端點在任意時刻可以傳輸的分組數。如果每個HTTP事務由大量數據發送,要先發送一個分組,確認后在發送兩個分組,并且每個分組都要進行確認,這種方式稱為“打開擁塞窗口”。
? ? ????六、Nagle算法與TCP_NODELAY
? ? ? ? ? ? ? ? Nagle算法試圖在發送一個分組之前,將大量TCP數據綁定在一起,以提高網絡效率。Nagle算法鼓勵發送全尺寸的段。只有當所有其他分組都被確認之后,Nagle算法才允許發送非全尺寸的分組。如果其他分組仍然在傳輸過程中,就將那部分數據緩存起來。只有當掛起分組被確認,或者緩存中基類了足夠發送一個全尺寸分組的數據時,才會將緩存的數據發送出去。
? ? ? ? ? ? ? ? HTTP應用程序常常會在自己的棧中設置參數TCP_NODELAY,禁用Nagle算法,提高性能。
? ? ? ? 七、TIME_WAIT累積與端口耗盡
? ? ? ? ? ? ? ? 當某個TCP端點關閉TCP連接時,會在內存中維護一個小的控制塊,用來記錄最近所關閉連接的IP地址和端口號。? ??? ??? ??? ??
? ? ? ? ? ? ? ? ?在只有一個客戶端和一臺Web服務器的異常情況下,構建一條TCP連接的4個值
????????????????????????<source-IP-address, source-port, destination-IP-address, destination-port>
????????????????其中的三個都是固定的----只有源端口號可以隨意改變
????????????????????????<client-IP, source-port, server-IP, 80> ?
? ? ? ? ? ? ? ? ? ?客戶端每次連接到服務器上去時,都會獲得一個新的源端口,以實現連接的唯一性。即使沒有遇到端口耗盡問題,也要特別小心有大量連接處于打開狀態的情況,或為處于等待狀態的連接分配了大量控制塊的情況。再有大量打開連接或控制塊的情況下,有些操作系統的速度會嚴重減緩。