建立一條新的TCP連接時,甚至是在發(fā)送任意數(shù)據(jù)之前,TCP軟件之間會交換一系列的IP分組,對連接的有關(guān)參數(shù)進(jìn)行溝通,如果連接只用來傳送少量數(shù)據(jù),這些交換過程就會嚴(yán)重降低HTTP的性能
TCP連接三次握手:
- 請求新的TCP連接時,客戶端要向服務(wù)器發(fā)送一個小的TCP分組,這個分組中設(shè)置了一個特殊的SYN標(biāo)記,說明這是一個連接請求。
- 如果服務(wù)器接受了連接,就會對一些參數(shù)進(jìn)行計算,并向客戶端回送一個TCP分組,這個分組中的SYN和ACK標(biāo)記都被置位,說明連接請求已被接受
- 最后,客戶端向服務(wù)器回送一條確認(rèn)信息,通知它連接已成功建立。
參考書目 《HTTP權(quán)威指南》
另 參考 here:
TCP的三次握手是怎么進(jìn)行的:
- 發(fā)送端發(fā)送一個SYN=1,ACK=0標(biāo)志的數(shù)據(jù)包給接收端,請求進(jìn)行連接,這是第一次握手;
- 接收端收到請求并且允許連接的話,就會發(fā)送一個SYN=1,ACK=1標(biāo)志的數(shù)據(jù)包給發(fā)送端,告訴它,可以通訊了,并且讓發(fā)送端發(fā)送一個確認(rèn)數(shù)據(jù)包,這是第二次握手;
- 最后,發(fā)送端發(fā)送一個SYN=0,ACK=1的數(shù)據(jù)包給接收端,告訴它連接已被確認(rèn),這就是第三次握手。
之后,一個TCP連接建立,開始通訊。
SYN:同步標(biāo)志
同步序列編號(Synchronize Sequence Numbers)欄有效。該標(biāo)志僅在三次握手建立TCP連接時有效。它提示TCP連接的服務(wù)端檢查序列編號,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號。在這里,可以把 TCP序列編號看作是一個范圍從0到4,294,967,295的32位計數(shù)器。通過TCP連接交換的數(shù)據(jù)中每一個字節(jié)都經(jīng)過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節(jié)的序列編號。
ACK:確認(rèn)標(biāo)志
確認(rèn)編號(Acknowledgement Number)欄有效。大多數(shù)情況下該標(biāo)志位是置位的。TCP報頭內(nèi)的確認(rèn)編號欄內(nèi)包含的確認(rèn)編號(w+1,F(xiàn)igure-1)為下一個預(yù)期的序列編號,同時提示遠(yuǎn)端[系統(tǒng)]已經(jīng)成功接收所有數(shù)據(jù)。
RST:復(fù)位標(biāo)志
復(fù)位標(biāo)志有效。用于復(fù)位相應(yīng)的TCP連接。
URG:緊急標(biāo)志緊急(The urgent pointer) 標(biāo)志有效。緊急標(biāo)志置位,*PSH:推標(biāo)志該標(biāo)志置位時,接收端不將該數(shù)據(jù)進(jìn)行隊列處理,而是盡可能快將數(shù)據(jù)轉(zhuǎn)由應(yīng)用處理。在處理 telnet 或 rlogin 等交互模式的連接時,該標(biāo)志總是置位的。
FIN:結(jié)束標(biāo)志
帶有該標(biāo)志置位的數(shù)據(jù)包用來結(jié)束一個TCP回話,但對應(yīng)端口仍處于開放狀態(tài),準(zhǔn)備接收后續(xù)數(shù)據(jù)。
TCP的幾個狀態(tài)對于我們分析所起的作用
在TCP層,有個FLAGS字段,這個字段有以下幾個標(biāo)識:SYN, FIN, ACK, PSH, RST, URG.其中,對于我們?nèi)粘5姆治鲇杏玫木褪乔懊娴奈鍌€字段。它們的含義是:SYN表示建立連接,F(xiàn)IN表示關(guān)閉連接,ACK表示響應(yīng),PSH表示有 DATA數(shù)據(jù)傳輸,RST表示連接重置。其中,ACK是可能與SYN,F(xiàn)IN等同時使用的,比如SYN和ACK可能同時為1,它表示的就是建立連接之后的響應(yīng),如果只是單個的一個SYN,它表示的只是建立連接。
TCP的幾次握手就是通過這樣的ACK表現(xiàn)出來的。但SYN與FIN是不會同時為1的,因為前者表示的是建立連接,而后者表示的是斷開連接。RST一般是在FIN之后才會出現(xiàn)為1的情況,表示的是連接重置。一般地,當(dāng)出現(xiàn)FIN包或RST包時,我們便認(rèn)為客戶端與服務(wù)器端斷開了連接;而當(dāng)出現(xiàn)SYN和SYN+ACK包時,我們認(rèn)為客戶端與服務(wù)器建立了一個連接。PSH為1的情況,一般只出現(xiàn)在 DATA內(nèi)容不為0的包中,也就是說PSH為1表示的是有真正的TCP數(shù)據(jù)包內(nèi)容被傳遞。TCP的連接建立和連接關(guān)閉,都是通過請求-響應(yīng)的模式完成的。