1. 程式人生 > >1.2分布式-網絡通訊協議

1.2分布式-網絡通訊協議

未收到 正常 緩沖區 使用 什麽是 fab gmp 大小 報文

網絡協議: TCP/IP 和UDP/IP

TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol)是一種可靠的網絡數據傳輸控制協議。定義了主機如何連入因特網以及數據如何在他們之間傳輸的標準。

TCP/IP協議參考模型把所有TCP/IP系列協議歸類到四個抽象層中;

每一個抽象層建立在低一層提供的服務上,並且為高一層提供服務

技術分享圖片

ICMP:控制報文協議

IGMP:internet組管理協議

ARP:地址解析協議

RARP:反向地址轉化協議

OSI模型(開放式系統互聯通信參考模型),它是由國際標準化組織提出的,試圖使各種計算機在世界範圍內互聯為網絡的標準框架

OSI模型多了表達層、會話層

3次握手協議

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

技術分享圖片

(1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。

(2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。

(3)第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

SYN攻擊:

在三次握手過程中,Server發送SYN-ACK之後,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地發送SYN包,Server回復確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間占用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

#netstat -nap | grep SYN_RECV

4次揮手協議

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

單工:數據傳輸只支持數據在一個方向上傳輸

半雙工:數據傳輸允許數據在兩個方向上傳輸,但是在某一時刻,只允許在一個方向上傳輸,實際上有點像切換方向的單工通信

全雙工:數據通信允許數據同時在兩個方向上傳輸,因此全雙工是兩個單工通信方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力

由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。

(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

TCP通信原理

首先,對於TCP通信來說,每個TCP Socket的內核中都有一個發送緩沖區和一個接收緩沖區,TCP的全雙工的工作模式及TCP的滑動窗口就是依賴於這兩個獨立的Buffer和該Buffer的填充狀態。

接收緩沖區把數據緩存到內核,若應用進程一直沒有調用Socket的read方法進行讀取,那麽該數據會一直被緩存在接收緩沖區內。不管進程是否讀取Socket,對端發來的數據都會經過內核接收並緩存到Socket的內核接收緩沖區。

read索要做的工作,就是把內核接收緩沖區中的數據復制到應用層用戶的Buffer裏。

進程調用Socket的send發送數據的時候,一般情況下是講數據從應用層用戶的Buffer裏復制到Socket的內核發送緩沖區,然後send就會在上層返回。換句話說,send返回時,數據不一定會被發送到對端。

技術分享圖片技術分享圖片

什麽是滑動窗口協議

發送方和接收方都會維護一個數據幀的序列,這個序列被稱作窗口。發送方的窗口大小由接收方確認,目的是控制發送速度,以免接收方的緩存不夠大導致溢出,同時控制流量也可以避免網絡擁塞。

下面圖中的4,5,6號數據幀已經被發送出去,但是未收到關聯的ACK,7,8,9幀則是等待發送。可以看出發送端的窗口大小為6,這是由接受端告知的(事實上必須考慮擁塞窗口cwnd,這裏暫且考慮cwnd>rwnd)。此時如果發送端收到4號ACK,則窗口的左邊緣向右收縮,窗口的右邊緣則向右擴展,此時窗口就向前“滑動了”,即數據幀10也可以被發送

技術分享圖片

明白了Socket讀寫數據的底層原理,我們就很容易理解“阻塞模式”:對於讀取Socket數據的過程而言,如果接收緩沖區為空,則調用Socket的read方法的線程會阻塞,知道有數據進入接收緩沖區;而對於寫數據到Socket中的線程來說,如果待發送的數據長度大於發送緩沖區空余長度,則會阻塞在write方法上,等待發送緩沖區的報文被發送到網絡上,然後繼續發送下一段數據,循環上述過程直到數據都被寫入到發送緩沖區為止

從前面分析的過程來看,傳統的Socket阻塞模式直接導致每個Socket都必須綁定一個線程來操作數據,參與通信的任意一方如果處理數據的速度較慢,會直接拖累到另一方,導致另一方的線程不得不浪費大量的時間在I/O等待上,所以這就是Socket阻塞模式的“缺陷”。但是這種模式在少量的TCP連接通信的情況下,雙方都可以快速的傳輸數據,這個時候的性能是最高的。

技術分享圖片

1.2分布式-網絡通訊協議