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