您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“TCP基礎(chǔ)知識有哪些”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
TCP報文段: 概念:分為頭部和數(shù)據(jù)兩部分。
TCP報文段頭部中的字段: 源端口/目的端口 這兩個字段與IP頭部中的源IP地址和目的IP地址一起, 唯一地標(biāo)識了每個連接。一個ip地址和一個端口的組合被稱為一個socket或一個endpoint。 序列號(seq) 本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序列號,seq的值等于前面已發(fā)送過的數(shù)據(jù)的最后一個字節(jié)的序列號+1。(TCP傳輸時將每個字節(jié)的數(shù)據(jù)都進(jìn)行了編號,這個編號就是序列號) 確認(rèn)號(ack) 期望收到對方下一個報文段的第一個數(shù)據(jù)字節(jié)的序列號,若ack為x,則到序號x-1為止(包括x-1)的所有數(shù)據(jù)都已正確收到。 確認(rèn)(ACK) 僅當(dāng)ACK=1時,ack字段才有效,當(dāng)ACK=0時,ack無效。 同步(SYN) SYN=1且ACK=0 表明這是一個連接請求報文段,若對方同意建立連接,則對方應(yīng)在響應(yīng)報文中包含SYN=1和ACK=1。 終止(FIN) FIN=1表明此報文的發(fā)送方已經(jīng)結(jié)束向?qū)Ψ桨l(fā)送數(shù)據(jù),并要求釋放連接。 重置(RST) 重置連接。 窗口大小 接收端接收緩沖區(qū)剩余的大小。這是一個16位的字段,單位是字節(jié)數(shù)。窗口大小字段最大能表示65535個字節(jié)(64K), 但是TCP的接收窗口大小最大并不是64K。TCP實際的接收窗口大小為16位窗口大小字段的值左移M(M表示:窗口擴大因子)位,每移一位,窗口擴大兩倍。 校驗和 該字段覆蓋了TCP頭部和數(shù)據(jù),由發(fā)送方進(jìn)行計算,然后由接收方來驗證。 其目的是為了發(fā)現(xiàn)TCP頭部和數(shù)據(jù)在發(fā)送端到接收端之間發(fā)生的任何改動,如果接收方檢測到校驗和有差錯,則TCP報文會被直接丟棄。 說明: 在連接建立后所有傳送的報文都必須把ACK置1。 SYN報文段、FIN報文段不能攜帶數(shù)據(jù),但會消耗掉一個序列號。 ACK報文段可以攜帶數(shù)據(jù),但如果不攜帶數(shù)據(jù)則不消耗序列號。 TCP數(shù)據(jù)
TCP三次握手
概念:建立一個TCP連接時,客戶端和服務(wù)器需要交互3次,即發(fā)送3次TCP報文段,故稱為3次握手。 目的:與服務(wù)器建立TCP連接,并同步連接雙方的序列號、確認(rèn)號、TCP窗口大小等信息。 說明: 三次握手改為兩次握手會產(chǎn)生死鎖: 兩次握手:A發(fā)送連接請求報文,B接收A的請求報文并發(fā)出確認(rèn)報文后,則認(rèn)為連接建立。 舉例:A發(fā)送連接請求報文,B收到A的請求報文并發(fā)出確認(rèn)報文,如果B的確定報文在傳輸過程中丟失了,此時,B認(rèn)為連接已建立并開始發(fā)送數(shù)據(jù),而A一直在等待著B的確定報文,且不會接受B發(fā)送的數(shù)據(jù),而B在發(fā)送數(shù)據(jù)后將一直處于等待A確定的狀態(tài)中,從而造成A和B相互等待,形成死鎖。 第一次握手: 客戶端向服務(wù)器發(fā)出連接請求報文段(報文段頭部:(初始)序列號seq=x、同步SYN=1),此時客戶端進(jìn)入SYN_SENT(同步已發(fā)送)狀態(tài)。 說明:同步SYN=1會消耗一個序列號位,即把x這個序列號位給占了,故下次發(fā)送的序列號應(yīng)該從x+1開始,第一次揮手時的FIN也同理。 第二次握手: 服務(wù)器收到連接請求報文段后,若同意建立連接,則向客戶端發(fā)送響應(yīng)報文段(報文段頭部:同步SYN=1、確認(rèn)ACK=1、確認(rèn)號ack=x+1、序列號seq=y,此時服務(wù)器進(jìn)入SYN_RECV(同步已收到)狀態(tài)。此時的TCP連接稱為半連接(half-open connect)。 第三次握手: 客戶端收到服務(wù)器的響應(yīng)報文段后,再次向服務(wù)器發(fā)出用于確認(rèn)的報文段(報文段頭部:同步SYN=0、確認(rèn)ACK=1、確認(rèn)號ack=y+1、序號seq=x+1),此時TCP連接已建立,客戶端和服務(wù)器都進(jìn)入ESTABLISHED(已建立連接)狀態(tài)。
TCP四次揮手
概念:釋放一個TCP連接時,客戶端和服務(wù)器需要交互4次,即發(fā)送4次TCP報文段,故稱為4次揮手。 說明: 1)斷開TCP連接 即 客戶端關(guān)閉發(fā)送數(shù)據(jù)的通道 并且 服務(wù)器關(guān)閉發(fā)送數(shù)據(jù)的通道。 2)為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手: 1>建立連接時:當(dāng)Server端收到Client端的SYN連接請求報文后,Server端可以直接發(fā)送SYN+ACK報文,其中ACK報文是用來應(yīng)答的,SYN報文是用來同步的。 2>關(guān)閉連接時:當(dāng)Server端收到Client端的FIN報文后,Server端很可能不會立即關(guān)閉SOCKET,而是先回復(fù)一個ACK報文,告訴Client端,"你發(fā)的FIN報文我收到了,但是我(可能)還有數(shù)據(jù)要發(fā)送",當(dāng)Server端所有的報文都發(fā)送完了,Server端才會發(fā)送FIN報文,即Server端通知Client端的過程中需要揮兩次手,故在關(guān)閉連接的時候總共需要四次揮手。 第一次揮手: 客戶端向服務(wù)器發(fā)出連接釋放報文段(報文段頭部:終止FIN=1、序號seq=u),并停止發(fā)送數(shù)據(jù),主動關(guān)閉TCP連接,此時客戶端進(jìn)入FIN_WAIT1(終止等待1)狀態(tài)。 第二次揮手: 服務(wù)器收到客戶端的連接釋放報文段后,向客戶端發(fā)送確認(rèn)報文段(報文段頭部:確認(rèn)ACK=1、確認(rèn)號ack=u+1、序號seq=v),此時服務(wù)器進(jìn)入CLOSE_WAIT(關(guān)閉等待)狀態(tài),并通知應(yīng)用進(jìn)程。 客戶端收到服務(wù)器的確認(rèn)報文段后,進(jìn)入FIN_WAIT2(終止等待2)狀態(tài)。 此時,客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但是服務(wù)器可能還有數(shù)據(jù)要發(fā)送,且客戶端依然可以接受服務(wù)器發(fā)送的數(shù)據(jù),此時的TCP連接處于半關(guān)閉狀態(tài)。 第三次揮手: 應(yīng)用進(jìn)程通知服務(wù)器釋放連接后,服務(wù)器發(fā)出連接釋放報文段(報文段頭部:確認(rèn)ACK=1,終止FIN=1、序號seq=w(在半關(guān)閉狀態(tài)時服務(wù)器可能又發(fā)送了一些數(shù)據(jù))、確認(rèn)號ack=u+1),此時服務(wù)器進(jìn)入LAST_ACK(最后確定)狀態(tài)。 第四次揮手: 客戶端收到服務(wù)器的連接釋放報文段后,向服務(wù)器發(fā)送確定報文段(報文段頭部:確認(rèn)ACK=1、序號seq=u+1、確認(rèn)號ack=w+1),此時客戶端進(jìn)入到TIME-WAIT(時間等待)狀態(tài),等到等待時間過后,二者才都進(jìn)入到CLOSED(關(guān)閉)狀態(tài)。
SYN攻擊: 概念:SYN攻擊是一個典型的DDOS(Distributed Denial of Service:分布式拒絕服務(wù))攻擊。
原理: 客戶端在短時間內(nèi)偽造大量不存在的IP地址,然后向服務(wù)器不斷地發(fā)送SYN包(即不斷地發(fā)起第一次握手,建立大量的半連接狀態(tài)的請求), 服務(wù)器收到連接請求后發(fā)送響應(yīng)報文,并等待客戶的確認(rèn),由于源地址是不存在的,故服務(wù)器需要不斷的重發(fā)直到超時, 這些偽造的SYN包將長時間占用未連接隊列(syns queue),正常的SYN請求被丟棄,目標(biāo)系統(tǒng)運行緩慢,嚴(yán)重者引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。 檢測: 查看狀態(tài)為SYN_RECV的TCP連接: netstat -npt | grep SYN_RECV # 若Foreign Address的ip地址是隨機的,則服務(wù)器此時很可能正在被SYN攻擊。 統(tǒng)計TCP連接的狀態(tài): netstat -npt | awk '{print $6}' | grep -v "Foreign" | sort | uniq -c 說明:一般較新的TCP/IP協(xié)議棧都對這一過程進(jìn)行修正來防范SYN攻擊,修改tcp協(xié)議實現(xiàn)。主要方法有SynAttackProtect保護(hù)機制、SYN cookies技術(shù)、增加最大半連接和縮短超時時間等.但是不能完全防范SYN攻擊。
socket編程: Socket.connect() 會觸發(fā)TCP的三次握手。 Socket.close() 會觸發(fā)TCP的四次揮手。表示不發(fā)送數(shù)據(jù)也不接受數(shù)據(jù)了。
超時重傳: 概念:TCP傳輸數(shù)據(jù)時,發(fā)送方發(fā)送數(shù)據(jù)后會等待接收方響應(yīng)的ACK報文,并根據(jù)ACK報文來判斷數(shù)據(jù)是否傳輸成功。如果發(fā)送方發(fā)送完數(shù)據(jù)后,長時間沒有等到接收方的ACK報文,那么發(fā)送方會重新發(fā)送這些數(shù)據(jù)。
發(fā)送方?jīng)]有收到ACK報文的原因: 數(shù)據(jù)在傳輸過程中由于網(wǎng)絡(luò)原因等直接全體丟包,接收方根本沒有接收到。 接收方接收到了響應(yīng)的數(shù)據(jù),但是響應(yīng)的ACK報文卻由于網(wǎng)絡(luò)原因丟包了。之后接收方若再次收到發(fā)送方重新發(fā)送的數(shù)據(jù)(根據(jù)序列號可判斷是否是重復(fù)數(shù)據(jù)),則會將這些重復(fù)的數(shù)據(jù)丟棄,但是仍然會響應(yīng)ACK報文。 超時時間的計算: 默認(rèn)500ms,重發(fā)一次后,若仍沒有響應(yīng),那么等待2*500ms的時間后,再次重傳。重傳的次數(shù)達(dá)到某個值后,TCP就認(rèn)為網(wǎng)絡(luò)已經(jīng)斷了或?qū)Ψ匠霈F(xiàn)異常了,然后強制關(guān)閉連接。 超時時間過長會降低TCP傳輸?shù)恼w效率。超時時間過短會導(dǎo)致頻繁的發(fā)送重復(fù)的包。
窗口機制: 概念:每個TCP連接的兩端都維護(hù)了一個發(fā)送窗口和一個接收窗口。
發(fā)送窗口: 發(fā)送方的發(fā)送緩存內(nèi)的數(shù)據(jù)都可以被分為4類,其中類型2和類型3屬于發(fā)送窗口: 1>已發(fā)送,已收到ACK 2>已發(fā)送,未收到ACK 3>未發(fā)送,但允許發(fā)送 4>未發(fā)送,但不允許發(fā)送 接收窗口: 接收方的緩存數(shù)據(jù)分為3類,其中類型2屬于接收窗口: 1>已接收 2>未接收但準(zhǔn)備接收 3>未接收而且不準(zhǔn)備接收 滑動機制: 發(fā)送窗口只有收到發(fā)送窗口內(nèi)字節(jié)的ACK確認(rèn)后,才會移動發(fā)送窗口的左邊界。 接收窗口只有在前面所有的報文段都確認(rèn)的情況下才會移動左邊界。 若接收窗口前面還有字節(jié)未接收,此時如果收到后面的字節(jié),則接收窗口不會移動,TCP也不會對后面的字節(jié)發(fā)送確認(rèn),發(fā)送方超時后會重傳這些數(shù)據(jù)。
流量控制: 概念:TCP根據(jù)接收端對數(shù)據(jù)的處理能力(窗口大小字段的值)來決定發(fā)送端的發(fā)送速度。 過程: 接收端在確認(rèn)應(yīng)答時發(fā)送ACK報文,ACK報文中包含了自己接收窗口的大小,發(fā)送方根據(jù)ACK報文里窗口大小的值的來設(shè)定自己發(fā)送數(shù)據(jù)的速度。 若ACK報文中窗口大小的值為0,那么發(fā)送方將停止發(fā)送數(shù)據(jù),并定期向接收端發(fā)送窗口探測數(shù)據(jù)段,以便及時地獲取接收端最新窗口大小的值。
說明:如果發(fā)送端發(fā)送的數(shù)據(jù)太快,則接收端的接收緩沖區(qū)很快就會被填滿,接受端的接收緩存區(qū)被填滿后,發(fā)送端再發(fā)送的數(shù)據(jù)就會被接收端丟棄,進(jìn)而觸發(fā)發(fā)送端的超時重傳。
擁塞控制: 概念:路由器因無法處理高速率到達(dá)的流量而被迫丟棄數(shù)據(jù)的現(xiàn)象稱為擁塞。 擁塞的原因:當(dāng)路由器在單位時間內(nèi)接收到的數(shù)據(jù)量大于其可發(fā)送的數(shù)據(jù)量時,路由器就需要把多余的數(shù)據(jù)存儲起來。若接收到的數(shù)據(jù)量持續(xù)大于可發(fā)送的數(shù)據(jù)量,那么會耗盡路由器的存儲資源,導(dǎo)致路由器丟棄部分?jǐn)?shù)據(jù)。
原理:發(fā)送方維持一個擁塞窗口變量cwnd,擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,發(fā)送方的發(fā)送窗口大小取 擁塞窗口的大小 和 接收端的接收窗口大小 的較小值,TCP通過動態(tài)地調(diào)整發(fā)送窗口的大小來實現(xiàn)擁塞控制。 慢啟動機制: 擁塞窗口的初始值為1,發(fā)送方每次收到ACK報文后,將擁塞窗口的值加1。 慢啟動中的"慢",表示剛開始發(fā)送的數(shù)據(jù)少,發(fā)送的速度慢,但是擁塞窗口值的增長是指數(shù)級別的增長,故增長的非???。當(dāng)擁塞窗口的值達(dá)到閾值時,擁塞窗口值的增長就改為線性增長。 在慢啟動開始的時候,慢啟動的閾值等于窗口的最大值,TCP一旦發(fā)現(xiàn)網(wǎng)絡(luò)擁塞,慢啟動的閾值將會變?yōu)楫?dāng)前閥值的一半,同時擁塞窗口重置為1。
TCP的可靠性: 連接管理:三次揮手四次握手 傳輸數(shù)據(jù): 序列號和確認(rèn)號機制 校驗和 超時重傳機制 流量控制 擁塞控制
常見問題:
服務(wù)器返回“RST”的問題: 分析:服務(wù)器關(guān)閉connection后,若客戶端還在connection上讀寫,服務(wù)器內(nèi)核接收到數(shù)據(jù)后發(fā)現(xiàn)Socket已經(jīng)close了,此時服務(wù)器會返回“RST”標(biāo)志給客戶端。 說明: 服務(wù)器返回了“RST”時,若此時客戶端正在從Socket套接字的輸出流中讀數(shù)據(jù)則會提示Connection reset” 服務(wù)器返回了“RST”時,若此時客戶端正在往Socket套接字的輸入流中寫數(shù)據(jù)則會提示“Connection reset by peer”
解決:重試。
“TCP基礎(chǔ)知識有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。