分布式通信協(xié)議分析-TCP/IP和UDP/IP

TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol)是一種可靠的網(wǎng)絡(luò)數(shù)據(jù)傳輸控制協(xié)議。定義了主機(jī)如何連入因特網(wǎng)以及數(shù)據(jù)如何在他們之間傳輸?shù)臉?biāo)準(zhǔn)。

TCP/IP協(xié)議參考模型把所有TCP/IP系列協(xié)議歸類到四個抽象層中;
每一個抽象層建立在低一層提供的服務(wù)上,并且為高一層提供服務(wù)

image.png

ICMP:控制報(bào)文協(xié)議
IGMP:internet組管理協(xié)議
ARP:地址解析協(xié)議
RARP:反向地址轉(zhuǎn)化協(xié)議

OSI模型(開放式系統(tǒng)互聯(lián)通信參考模型),它是由國際化標(biāo)準(zhǔn)組織提出來的,試圖使各種計(jì)算機(jī)在世界范圍內(nèi)互聯(lián)為網(wǎng)絡(luò)的標(biāo)準(zhǔn)框架

OSI模型多出了表達(dá)層和會話層。

三次握手協(xié)議

所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務(wù)端總共發(fā)送三個包以確認(rèn)連接的建立

suo
  1. 第一次握手:Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個seq=J,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN_SENT狀態(tài),等待Server確認(rèn)。
  2. 第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請求建立連接,Server將標(biāo)志位SYN和ACK都置為1,ack=J+1,隨機(jī)產(chǎn)生一個值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求,Server進(jìn)入SYN_RCVD狀態(tài)。
  3. 第三次握手:Client收到確認(rèn)后,檢查ack是否為J+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后Client和Server之間可以開始傳輸數(shù)據(jù)了。

SYN攻擊:
在三次握手過程中,Server發(fā)送SYN-ACK之后,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時Server處于SYN_RCVD狀態(tài),當(dāng)收到ACK后,Server轉(zhuǎn)入ESTABLISHED狀態(tài)。SYN攻擊就是Client在短時間內(nèi)偽造不存在的IP地址,并向Server不斷地發(fā)送SYN包,Server回復(fù)確認(rèn)包,并等待Client的確認(rèn),由于原地址是不存在的,因此,Server需要不斷重發(fā)直至超時,這些偽造的SYN包將產(chǎn)時間占用未連接隊(duì)列,導(dǎo)致正常的SYN請求因?yàn)殛?duì)列慢而被丟棄,從而引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。SYN攻擊是一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當(dāng)Server上有大量半連接狀態(tài)且源IP地址是隨機(jī)的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現(xiàn)行:
#netstat -nap | grep SYN_RECV

四次揮手協(xié)議

三次握手耳熟能詳,四次揮手估計(jì)就聽得比較少了,所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務(wù)端總共發(fā)送4個包以確認(rèn)連接的斷開.

  • 單工:數(shù)據(jù)傳輸只支持?jǐn)?shù)據(jù)在一個方向上傳輸
  • 半雙工:數(shù)據(jù)傳輸允許數(shù)據(jù)在兩個方向上傳輸,但是在某一時刻,只允許在一個方向上傳輸,實(shí)際上有點(diǎn)像切換方向的單工通信。
  • 全雙工:數(shù)據(jù)通信允許數(shù)據(jù)同時在兩個方向上傳輸,因此全雙工是兩個單工通信方式的結(jié)合,它要求發(fā)送設(shè)備和接收設(shè)備都有獨(dú)立的接收和發(fā)送能力
image.png

由于TCP連接是全雙工的,因此,每個方向都必須要單獨(dú)進(jìn)行關(guān)閉,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數(shù)據(jù)流動了,即不會再收到數(shù)據(jù)了,但是在這個TCP連接上仍然能夠發(fā)送數(shù)據(jù),直到這一方向也發(fā)送了FIN.首先進(jìn)行關(guān)閉的一方將執(zhí)行主動關(guān)閉,而另一方則執(zhí)行被動關(guān)閉,上圖描述的即是如此。

  1. 第一次揮手:Client發(fā)送了一個FIN,用來關(guān)閉Client到Server的數(shù)據(jù)傳送,Client進(jìn)入FIN_WAIT_1狀態(tài)。
  2. 第二次揮手:Server收到FIN后,發(fā)送一個ACK給Client,確認(rèn)序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進(jìn)入CLOSE_WAIT狀態(tài)。
  3. 第三次揮手:Server發(fā)送一個FIN,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)。
  4. 第四次揮手:Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個ACK給Server,確認(rèn)序號為收到序號+1,Server進(jìn)入CLOSED狀態(tài),完成四次握手。
TCP通信原理
  • 首先,對于TCP通信來說,每個TCP Socket的內(nèi)核都有一個發(fā)送緩沖區(qū)和一個接收緩沖區(qū),TCP的全雙工的工作模式及TCP的滑動窗口就是依賴于這兩個獨(dú)立的Buffer和該Buffer的填充狀態(tài)。
  • 接收緩沖區(qū)就是把數(shù)據(jù)緩沖到內(nèi)核,若應(yīng)用進(jìn)程一直沒有調(diào)用Socket的read方法進(jìn)行讀取,那么該數(shù)據(jù)會一直被緩存在接收緩沖區(qū)內(nèi)。不管進(jìn)程是否讀取Socket,對端發(fā)來的數(shù)據(jù)都會經(jīng)過內(nèi)核接收并緩存到Socket的內(nèi)核接收緩沖區(qū)。
  • read所要做的工作,就是把內(nèi)核接收緩沖區(qū)的數(shù)據(jù)復(fù)制到應(yīng)用層用戶的Buffer里。
  • 進(jìn)程調(diào)用Socket的send發(fā)送數(shù)據(jù)的時候,一般情況下是將數(shù)據(jù)從應(yīng)用層用戶的Buffer里復(fù)制到Socket的內(nèi)核發(fā)送緩沖區(qū),然后send就會在上層返回。換句話說,send返回時,數(shù)據(jù)不一定會被發(fā)送到對端.
image.png
image.png

滑動窗口協(xié)議

  • 發(fā)送方和接收方都會維護(hù)一個數(shù)據(jù)幀的序列,這個序列被稱作窗口。發(fā)送方的窗口大小由接收方確認(rèn),目的是控制發(fā)送速度,以免接收方的緩存不夠大導(dǎo)致溢出,同時控制流量也可以避免網(wǎng)絡(luò)擁塞。
  • 下面圖中的4,5,6號數(shù)據(jù)幀已經(jīng)被發(fā)送出去,但是未收到關(guān)聯(lián)的ACK,7,8,9幀則是等待發(fā)送??梢钥闯霭l(fā)送端的窗口大小為6,這是由接受端告知的(事實(shí)上必須考慮擁塞窗口cwnd,這里暫且考慮cwnd>rwnd)。此時如果發(fā)送端收到4號ACK,則窗口的左邊緣向右收縮,窗口的右邊緣則向右擴(kuò)展,此時窗口就向前“滑動了”,即數(shù)據(jù)幀10也可以被發(fā)送
image.png
  • 明白了Socket讀寫數(shù)據(jù)的底層原理,我們就很容易理解“阻塞模式”:對于讀取Socket數(shù)據(jù)的過程而言,如果接收緩沖區(qū)為空,則調(diào)用Socket的read方法的線程會阻塞,直到有數(shù)據(jù)進(jìn)入接收緩沖區(qū);而對于寫數(shù)據(jù)到Socket中的線程來說,如果待發(fā)送的數(shù)據(jù)長度大于發(fā)送緩沖區(qū)空余長度,則會阻塞在write方法上,等待發(fā)送緩沖區(qū)的報(bào)文被發(fā)送到網(wǎng)絡(luò)上,然后繼續(xù)發(fā)送下一段數(shù)據(jù),循環(huán)上述過程直到數(shù)據(jù)都被寫入到發(fā)送緩沖區(qū)為止。
  • 從前面分析的過程中,傳統(tǒng)的Socket阻塞模式直接導(dǎo)致每個Socket都必須綁定一個線程來操作數(shù)據(jù),參與通信的任意一方如果處理數(shù)據(jù)的速度較慢,會直接拖累到另一方,導(dǎo)致另一方的線程不得不浪費(fèi)大量的時間在I/O等待上,所以這就是Socket阻塞模式的缺陷。但是這種模式在少量的TCP連接通信的情況下,雙方都可以快速的傳輸數(shù)據(jù),這個時候的性能是最高的。
image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容