接上篇《??通俗易懂圖解網(wǎng)絡(luò)面試知識—第一篇??》


(相關(guān)資料圖)

關(guān)于網(wǎng)絡(luò)的知識,上篇學(xué)習(xí)了網(wǎng)絡(luò)層的知識,今天我們學(xué)習(xí)一下傳輸層協(xié)議的知識。

UDP協(xié)議UDP協(xié)議簡介

UDP 是User Datagram Protocol的簡稱,中文名是用戶數(shù)據(jù)報協(xié)議,是OSI(Open System Interconnection,開放式系統(tǒng)互聯(lián)) 模型中一種無連接的傳輸層協(xié)議,提供面向事務(wù)的簡單不可靠的信息傳送服務(wù)。

UDP特點

UDP主要特點有無連接狀態(tài),無需建立連接,分組首部開銷小,速度快等。所以UDP一般使用在流媒體應(yīng)用,語音交流,視頻會議應(yīng)用。

無連接狀態(tài):UDP協(xié)議發(fā)送數(shù)據(jù)之前不需要建立連接,減少了開銷和發(fā)送數(shù)據(jù)之前的時延。TCP需要在端系統(tǒng)中維護(hù)連接狀態(tài),連接狀態(tài)包括接收和發(fā)送緩存、擁塞控制參數(shù)以及序號和確認(rèn)號的參數(shù)等。無需建立連接:UDP無需任何準(zhǔn)備即可進(jìn)行數(shù)據(jù)傳輸,UDP是沒有時延的。而TCP 在數(shù)據(jù)傳輸之前需要經(jīng)過三次握手的操作。分組首部開銷小:UDP 首部僅僅只有 8 字節(jié)的開銷,TCP 報文段都有 20 字節(jié)的首部開銷。速度快:使用UDP協(xié)議,只要應(yīng)用進(jìn)程把數(shù)據(jù)傳給UDP,UDP就會將數(shù)據(jù)打包進(jìn)UDP報文段立即傳遞給網(wǎng)絡(luò)層,而 TCP 有擁塞控制的功能,它會在發(fā)送前判斷互聯(lián)網(wǎng)的擁堵情況,如果互聯(lián)網(wǎng)極度阻塞,那么就會抑制 TCP 的發(fā)送方 TCP 有擁塞控制的功能,它會在發(fā)送前判斷互聯(lián)網(wǎng)的擁堵情況,如果互聯(lián)網(wǎng)極度阻塞,那么就會抑制 TCP 的發(fā)送方。UDP復(fù)用和分用:發(fā)送方可能有多個進(jìn)程需要發(fā)送數(shù)據(jù)報,UDP從不同的進(jìn)程接收數(shù)據(jù)報,每個進(jìn)程都分配一個端口號。在加上UDP報頭之后,UDP將數(shù)據(jù)報送往網(wǎng)絡(luò)層。發(fā)送方的UDP處理多個進(jìn)程的數(shù)據(jù)報稱為UDP復(fù)用。接收方根據(jù)接收的每個進(jìn)程的端口號分別處理稱為UDP分用。其實這個復(fù)用和分用只是UDP的一種聚合的功能,因為本身UDP協(xié)議是有目的端口和源端口,多進(jìn)程發(fā)送和接口都是基于端口,顯然這樣就能實現(xiàn)多進(jìn)程的復(fù)用和分用了。

了解了UDP協(xié)議的特點,我們從OSI的模型上看下UDP封包的流程圖:

應(yīng)用數(shù)據(jù)通過應(yīng)用進(jìn)程端口發(fā)送,組裝成應(yīng)用報文。應(yīng)用層報文數(shù)據(jù)在傳輸層添加UDP首部稱UDP段。UDP段在網(wǎng)絡(luò)層添加IP首部稱IP數(shù)據(jù)包。IP數(shù)據(jù)包到數(shù)據(jù)鏈路層添加以太網(wǎng)幀首部和尾部組合成以太網(wǎng)幀。最后,幀被轉(zhuǎn)換為比特,通過網(wǎng)絡(luò)介質(zhì)傳輸。這種協(xié)議棧逐層向下傳遞數(shù)據(jù),并添加報頭和報尾的過程稱為封裝。如果逐層向上傳遞數(shù)據(jù),出現(xiàn)去除報頭和報尾的過程叫解包。UDP協(xié)議報文組成部分

UDP協(xié)議由四個部分組成,源端口號,目的端口號,UDP長度,UDP校驗和,UDP的首部是由8個字節(jié)組成,每個組成部分占2個字節(jié),也就是16位。下面我們看下協(xié)議報文圖:

源、目標(biāo)端口號字段:占16比特。作用與TCP數(shù)據(jù)段中的端口號字段相同,用來標(biāo)識源端和目標(biāo)端的應(yīng)用進(jìn)程。長度字段:占16比特。標(biāo)明UDP頭部和UDP數(shù)據(jù)的總長度字節(jié)。校驗和字段:占16比特。用來對UDP頭部和UDP數(shù)據(jù)進(jìn)行校驗。和TCP不同的是,對UDP來說,此字段是可選項,而TCP數(shù)據(jù)段中的校驗和字段是必須有的。UDP服務(wù)實現(xiàn)

UDP協(xié)議和TCP協(xié)議在工作方式是不同的,但是他們都是建立了端口到端口的通信。端口(port)是伴隨著傳輸層誕生的概念。實現(xiàn)一個UDP通信服務(wù)實現(xiàn)是調(diào)用操作系統(tǒng)的API來構(gòu)建socket,socket是操作系統(tǒng)的一種編程接口,它代表某個網(wǎng)絡(luò)通信。下面我們圖解一下UDP基于編程接口的調(diào)用實現(xiàn)。

IP協(xié)議和UDP都是無連接的,IP協(xié)議主要是通過IP地址進(jìn)行投遞目標(biāo)主機(jī),UDP是通過端口投遞到指定的網(wǎng)絡(luò)應(yīng)用程序。

TCP協(xié)議TCP協(xié)議簡介

TCP協(xié)議是傳輸控制協(xié)議,面向連接的,在不可靠的互聯(lián)網(wǎng)上提供可靠的,全雙工通信服務(wù)傳輸協(xié)議。TCP提供傳輸連接管理機(jī)制,差錯控制,流量控制,擁塞控制等。

TCP特點

TCP協(xié)議的主要特點是面向連接,全雙工通信,建立和釋放可靠的連接,流量控制和擁塞控制,支持流接口。

面向連接:源進(jìn)程在指定的端口和目的進(jìn)程指定的端口建立傳輸連接,一旦這個連接建立之后,通信的兩個進(jìn)程就可以在這個連接上發(fā)送和接受數(shù)據(jù)流。面向連接的傳輸服務(wù)可以很好地保證數(shù)據(jù)流傳輸?shù)目煽啃浴Hp工通信:全雙工概念:可以同時進(jìn)行信號的雙向傳輸(A->B且B->A)。TCP允許全雙工通信。在兩個應(yīng)用進(jìn)程傳輸連接建立后,客戶與服務(wù)器進(jìn)程可以同時發(fā)送和接收數(shù)據(jù)流。TCP在發(fā)送和接收方都使用緩存機(jī)制,發(fā)送緩存用來存儲進(jìn)程準(zhǔn)備發(fā)送的數(shù)據(jù),接收緩存在收到報文段之后,將它們存儲在接收緩存中,等待接收進(jìn)程讀取對方傳送來的數(shù)據(jù)。建立和釋放可靠的連接:為了保證傳輸連接建立和釋放的可靠性,TCP在連接建立階段防止出現(xiàn)因失效的連接請求數(shù)據(jù)包造成請求錯誤,TCP使用了“三次握手”機(jī)制。在釋放傳輸連接時,保證在關(guān)閉連接時已經(jīng)發(fā)送的數(shù)據(jù)報可以全部正確的達(dá)到目的端口,TCP使用了“四次揮手”機(jī)制。流量控制和擁塞控制:TCP采用了大小可以變化的滑動窗口方法進(jìn)行流量控制。發(fā)送窗口大小在建立連接時由雙方商定。在通信過程中,發(fā)送方可以根據(jù)自己的資源情況隨機(jī)、動態(tài)地調(diào)整發(fā)送窗口的大小,而接收方將跟隨發(fā)送方調(diào)整接收窗口。支持流接口:TCP提供一個流接口(Stream Interface),應(yīng)用進(jìn)程可以利用它發(fā)送連續(xù)的數(shù)據(jù)流。TCP傳輸連接提供一個“管道”,保證數(shù)據(jù)流從一端正確地“流”到另一端。TCP對數(shù)據(jù)流的內(nèi)容不作任何解釋,數(shù)據(jù)流的解釋由雙方的應(yīng)用程序處理。TCP協(xié)議報文組成

TCP報文段由首部和數(shù)據(jù)兩部分組成。TCP首部的前20字節(jié)是固定的,稱為TCP固定首部,后面有4×N字節(jié)的選項部分。TCP協(xié)議如圖:

源端口(Source Port)和目的端口(Destination Port):各占16位。分別表示報文的源端口號和目的端口號。將TCP報文中源端口和目的端口字段加上IP報文中源IP地址和目的IP地址字段構(gòu)成一個4元組<源端口,源IP地址,目的端口,目的IP地址>,它可以唯一地標(biāo)識一個TCP連接。序號(Sequence Number)、確認(rèn)序號(Acknowledgment Number)和通告窗口(Advertised Window):序號和確認(rèn)序號各占32位,通告窗口占16位。首部長度(Header Length):占4位。表示TCP首部長度,該值以32位為單位計算,如TCP固定首部為20字節(jié),則頭部長度為5。標(biāo)志位(Flags):占6位。用于區(qū)分不同類型的TCP報文,目前用到的標(biāo)志位有SYN、ACK、FIN、RST、PSH和URG。校驗和:與UDP中的校驗和字段用法完全相同,它是通過計算整個TCP報文的首部、TCP報文的數(shù)據(jù)報以及來自IP報文首部的源地址、目的地址、協(xié)議和TCP長度字段構(gòu)成的偽首部得來的。TCP報文字段中的校驗和字段是必需的。選項:最常用的選項字段是最大段長度(Maximum Segment Size,MSS),通常用MSS來限制報文段數(shù)據(jù)的最大長度。TCP服務(wù)實現(xiàn)

TCP 網(wǎng)絡(luò)編程有兩種模式,一種是服務(wù)器模式,另一種是客戶端模式。服務(wù)器模式創(chuàng)建一個服務(wù)程序,等待客戶端用戶的連接,接收到用戶的連接請求后,根據(jù)用戶的請求進(jìn)行處理;客戶端模式則根據(jù)目的服務(wù)器的地址和端口進(jìn)行連接,向服務(wù)器發(fā)送請求,并對服務(wù)器的響應(yīng)進(jìn)行處理。

關(guān)于服務(wù)器模式的程序設(shè)計流程:

套接字初始化:用戶對套接字的需求來確定套接字的選項。套接字與端口綁定:將套接字與一個地址結(jié)構(gòu)進(jìn)行綁定。綁定之后,在進(jìn)行網(wǎng)絡(luò)程序設(shè)計的時候,套接字所代表的 IP 地址和端口地址以及協(xié)議類型等參數(shù)按照綁定值進(jìn)行操作由于一個服務(wù)器需要滿足多個客戶端的連接請求,而服務(wù)器在某個時刻僅能處理有限個客戶端的連接請求,所以服務(wù)器需要設(shè)置服務(wù)端排隊隊列的長度。服務(wù)器在偵聽連接時會設(shè)置這個參數(shù),限制客戶端中等待服務(wù)器處理的連接請求的隊列長度在客戶端發(fā)送連接請求之后,可以從套接字文件描述符中讀取數(shù)據(jù)或者向描述符發(fā)送數(shù)據(jù)。當(dāng)服務(wù)器處理完數(shù)據(jù),要結(jié)束與客戶端的通信過程的時候,需要關(guān)閉套接字連接。

關(guān)于服務(wù)器模式可以參考下圖:

三次握手,四次揮手場景面試

首先我們看下TCP建立和結(jié)束示意圖:

問題1:為什么是 TCP 三次握手?不是兩次、四次?三次握手(Three-way Handshake)其實就是指建立一個 TCP 連接時,需要客戶端和服務(wù)器總共發(fā)送 3 個包。進(jìn)行三次握手的主要作用就是為了確認(rèn)對方的接收能力和發(fā)送能力是否正常,從而為后面的可靠性傳送做準(zhǔn)備。需要三次握手才能確認(rèn)對方的接收與發(fā)送能力是否正常。第一次客戶端發(fā)送給服務(wù)端,服務(wù)端回復(fù)給客戶端之后,客戶端就能知道服務(wù)端具備發(fā)送和接收能力了,此時服務(wù)端能知道客戶端具備發(fā)送能力,但是接收能力還不確定,等客戶端再次回復(fù)服務(wù)端的時候,服務(wù)端能知曉客戶端也具備發(fā)送和接收能力了。三次握手的次要作用是減少惡意偽造數(shù)據(jù)包的用戶對服務(wù)器攻擊,大量攻擊數(shù)據(jù)包可能占用著未完成三次握手隊列,使得正常需要提供服務(wù)的連接進(jìn)不來,有了第三次握手,如果服務(wù)器收不到攻擊數(shù)據(jù)報的ACK,就會嘗試重發(fā)SYN+ACK報文,如果多次重試,連接不上,則服務(wù)器會關(guān)閉連接,有效降低SYN攻擊帶來的資源損害。問題2:為什么關(guān)閉連接的需要四次揮手?當(dāng)服務(wù)端收到客戶端FIN數(shù)據(jù)包后(第一次揮手),服務(wù)端不會立即close,為什么不立即close,因為可能數(shù)據(jù)還沒有發(fā)完,服務(wù)端會先將ACK發(fā)送告訴客戶端我收到你的斷開請求(第二次揮手),請給我一點時間,這段時間用來發(fā)送剩下的數(shù)據(jù)報文,發(fā)送之后再將FIN包發(fā)給客戶端表示現(xiàn)在可以斷開了(第三次揮手)。客戶端收到FIN包之后發(fā)送ACK確認(rèn)斷開消息給服務(wù)端(第四次揮手)。TCP允許單向發(fā)送數(shù)據(jù)。當(dāng)主動關(guān)閉方關(guān)閉連接,被動方在不調(diào)用close的狀態(tài)下,可以長時間發(fā)送數(shù)據(jù),此時連接處于半關(guān)閉狀態(tài)。這一特性是TCP的雙向通道相互獨立導(dǎo)致的,也導(dǎo)致了關(guān)閉連接必須進(jìn)行四次揮手。問題3:為什么主動斷開方在TIME-WAIT狀態(tài)必須等待2MSL的時間?MSL(Maximum Segment Lifetime)Linux中MSL的值固定為30秒,所以TIME_WAIT的時間為60秒。如果沒有這個TIME_WAIT,端口可以復(fù)用于新連接了。這時被動方的FIN報文可能再次到達(dá),可能是路由器重復(fù)發(fā)的,也可能是被動方?jīng)]有收到ACK重發(fā)的。這樣正常的新連接就會被重復(fù)發(fā)送的舊的FIN誤關(guān)閉。保留了TIME_WAIT就可以應(yīng)付重發(fā)的FIN。等待2倍MSL,其實是允許ACK丟失一次,如果一個ACK丟失,被動方重發(fā)的FIN就會在第二個MSL內(nèi)到達(dá),TIME_WAIT就可以應(yīng)付。問題4:什么是SYN攻擊?SYN(synchronous)是TCP/IP建立連接時使用的握手信號。SYN攻擊屬于DDoS攻擊的一種,它利用TCP協(xié)議缺陷,通過發(fā)送大量的半連接請求,耗費CPU和內(nèi)存資源。SYN攻擊解決辦法:修改等待數(shù):

sysctl -w net.ipv4.tcp_max_syn_backlog=2048啟用SYN Cookie,它的原理是,在TCP服務(wù)器收到TCP SYN包并返回TCP SYN+ACK包時,不分配一個專門的數(shù)據(jù)區(qū),而是根據(jù)這個SYN包計算出一個cookie值。在收到TCP ACK包時,TCP服務(wù)器在根據(jù)那個cookie值檢查這個TCP ACK包的合法性。如果合法,再分配專門的數(shù)據(jù)區(qū)進(jìn)行處理未來的TCP連接。

sysctl -w net.ipv4.tcp_syncookies=1修改重試次數(shù),重傳次數(shù)設(shè)置為0,只要收不到客戶端的響應(yīng),立即丟棄該連接,默認(rèn)設(shè)置為5次

sysctl -w net.ipv4.tcp_syn_retries = 0

標(biāo)簽: 網(wǎng)絡(luò)協(xié)議