溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

TCP基礎(chǔ)知識有哪些

發(fā)布時間:2021-12-18 15:24:19 來源:億速云 閱讀:115 作者:iii 欄目:云計算

本篇內(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ì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(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)容。

tcp
AI