一、詳解TCP概念及特點(diǎn)
概念:TCP是傳輸層協(xié)議岛宦,對(duì)應(yīng)OSI網(wǎng)絡(luò)模型的第四層:傳輸層
特點(diǎn):1台丛、基于鏈接(點(diǎn)對(duì)點(diǎn)),也就是傳輸數(shù)據(jù)前需要建立好鏈接砾肺,然后再進(jìn)行傳輸挽霉。
? ? ? ? ? ? 2、雙工傳輸变汪,一旦建立侠坎,雙向通信。
? ? ? ? ? ? 3裙盾、基于字節(jié)流而非報(bào)文实胸,TCP能夠保證接收數(shù)據(jù)的有序性和完整性,因此TCP能夠提供可靠傳輸番官。
????????????4庐完、流量控制
? ??????????????TCP的流量控制由滑動(dòng)窗口來(lái)實(shí)現(xiàn)的,滑動(dòng)窗口控制流量取決于接收方的窗口大小徘熔。
? ? ? ? ? ? ? ? 滑動(dòng)窗口的本質(zhì)是動(dòng)態(tài)緩沖區(qū)门躯,接收端根據(jù)自己的處理能力,再TCP的Header種動(dòng)態(tài)的調(diào)整窗口大小酷师,通過(guò)ACK包通知給發(fā)送端讶凉,發(fā)送端根據(jù)窗口的大小調(diào)整發(fā)送的速度。
? ? ? ? ? ? 5窒升、擁塞控制
? ? ? ? ? ? ? ? TCP考慮到網(wǎng)絡(luò)問(wèn)題可能導(dǎo)致大量重傳等問(wèn)題缀遍,進(jìn)而導(dǎo)致網(wǎng)絡(luò)情況進(jìn)一步惡化,因此TCP協(xié)議還提供了擁塞控制饱须。
? ??????????????擁塞控制主要有四個(gè)算法:慢啟動(dòng)域醇、擁塞避免、快速重傳和快速恢復(fù)蓉媳。
二譬挚、詳解TCP的三次握手建立連接
TCP是基于鏈接的,所以在傳輸數(shù)據(jù)前需要新建鏈接酪呻,并且是雙工傳輸减宣,不區(qū)分客戶(hù)端與服務(wù)端,這里把主動(dòng)發(fā)起鏈接的一端叫做Client玩荠,被動(dòng)建立鏈接的一端叫做Server漆腌。
首先建立鏈接前Server端先監(jiān)聽(tīng)端口贼邓,因此初始狀態(tài)是LISTEN狀態(tài),這時(shí)Client端準(zhǔn)備建立連接闷尿,先發(fā)送一個(gè)SYN同步包塑径,發(fā)送完同步包后Client端狀態(tài)變成SYN_SENT狀態(tài)。
Server端接收到SYN后填具,同意建立鏈接统舀,會(huì)向Client端回復(fù)一個(gè)ACK數(shù)據(jù)包。由于TCP是雙工傳輸劳景,Server端也會(huì)同時(shí)向Client端發(fā)送SYN數(shù)據(jù)包誉简,申請(qǐng)Server端向Client端的反向建立鏈接,發(fā)送完ACK和SYN后盟广,Server端狀態(tài)變成SYN_RCVD狀態(tài)闷串。
Client端接收到Server端的ACK后,狀態(tài)就變成了ESTABLISHER狀態(tài)衡蚂,同時(shí)窿克,Client端向Server端發(fā)送ACK,回復(fù)Server端的請(qǐng)求毛甲。Server端收到ACK后年叮,鏈接狀態(tài)就變成ESTABLISHER狀態(tài),此時(shí)建連完成玻募,雙方隨時(shí)可以進(jìn)行數(shù)據(jù)傳輸只损。
注意:1、三次握手是為了建立雙向鏈接七咧,需要記住狀態(tài)的變化跃惫。
? ? ? ? ? ?2、SYN洪水攻擊的原因:Server端收到Client端的SYN同步包后艾栋,回復(fù)ACK和SYN爆存,但是Client不進(jìn)行回復(fù),導(dǎo)致Server端大量鏈接處于SYN_RCVD(半連接)狀態(tài)蝗砾,進(jìn)而影響其他正常請(qǐng)求的連接先较。
? ? ? ? ? ? 解決:a、設(shè)置TCP參數(shù) tcp_synack_retries=0 來(lái)加快半鏈接的回收速度悼粮。
? ? ? ? ? ? ? ? ? ? ? ? ?b闲勺、調(diào)大 tcp_max_syn_backlog 來(lái)應(yīng)對(duì)少量的洪水攻擊,具體調(diào)大多少看內(nèi)存而定扣猫,這個(gè)參數(shù)起輔助作用菜循。
三、詳解TCP四次揮手?jǐn)嚅_(kāi)連接
TCP連接關(guān)閉申尤,雙方都可以先發(fā)起癌幕,這里吧先發(fā)起的一方稱(chēng)為Client衙耕。
首先通信的雙方狀態(tài)都是ESTABLISHER狀態(tài),然后Client端發(fā)起關(guān)閉連接請(qǐng)求勺远,Client端向Server端發(fā)送FIN數(shù)據(jù)包臭杰,表示Client端已經(jīng)沒(méi)有數(shù)據(jù)要發(fā)送了,然后Client端進(jìn)入FIN_WAIT_1狀態(tài)谚中。
Server端接收到FIN后返回ACK數(shù)據(jù)包,就進(jìn)入CLOSE_WAIT狀態(tài)寥枝,此時(shí)Server端屬于半關(guān)閉狀態(tài)宪塔,因?yàn)榇藭r(shí)Client端已經(jīng)不會(huì)再向Server端傳輸數(shù)據(jù)了,但是Server端向Client可能還有數(shù)據(jù)要發(fā)送囊拜。Client端接收到ACK后某筐,進(jìn)入FIN_WAIT_2狀態(tài)。
當(dāng)Server端數(shù)據(jù)發(fā)送完畢后冠跷,Server端會(huì)向Client端發(fā)送FIN數(shù)據(jù)包南誊,表示Server端也沒(méi)有數(shù)據(jù)要傳輸了,這時(shí)Server端進(jìn)入LAST_ACK狀態(tài)蜜托,就等待Client端應(yīng)答就可以關(guān)閉連接了抄囚。
Client端接收到Server端的FIN后回復(fù)ACK,然后進(jìn)入TIME_WAIT狀態(tài)橄务,這個(gè)狀態(tài)下要等待兩倍的MSL也就是最大報(bào)文段生存時(shí)間幔托,來(lái)保證鏈接的可靠關(guān)閉,之后才會(huì)進(jìn)入CLOSED狀態(tài)蜂挪,而Server端接收到ACK后直接進(jìn)入CLOSED狀態(tài)重挑。
注意:1、為什么需要等待2倍的MSL之后才能關(guān)閉連接棠涮?
? ? ? ? ? ? ? ? ? ? a谬哀、要保證TCP雙工鏈接能夠可靠關(guān)閉。
? ? ? ? ? ? ? ? ? ? b严肪、要保證這次鏈接種重復(fù)的數(shù)據(jù)段能夠從網(wǎng)絡(luò)種消失史煎,防止端口被重用的時(shí)候可能會(huì)產(chǎn)生數(shù)據(jù)混淆。
? ? ? ? ? ? ?2诬垂、大量的Socket處于TIME_WAIT狀態(tài)或者CLOSE_WAIT狀態(tài)問(wèn)題解決劲室。
? ? ? ? ? ? ? ? ? ? a、加快TIME_WAIT狀態(tài)的Socket回收開(kāi)啟tcp_tw_reuse和tcp_tw recycle结窘。
? ? ? ? ? ? ? ? ? ? b很洋、大量的Socket處于TIME_WAIT狀態(tài)可能是被動(dòng)關(guān)閉的一方存在代碼bug,沒(méi)有正確關(guān)閉導(dǎo)致的隧枫。
四喉磁、總結(jié)
從這兩個(gè)交互可以看出谓苟,無(wú)論是建連還是斷連,都是從兩個(gè)方向上進(jìn)行的协怒,只不過(guò)建連的時(shí)候Server端的SYN和ACK是合并為一次發(fā)送的涝焙,而斷連時(shí),兩個(gè)方向上的數(shù)據(jù)發(fā)送停止時(shí)間可能不同孕暇,所以不能和并發(fā)送SYN和ACK仑撞。這就是三握四揮的原因。