自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

通俗易懂圖解網(wǎng)絡(luò)知識(shí)—第二篇

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

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

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

UDP協(xié)議

UDP協(xié)議簡(jiǎn)介

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

UDP特點(diǎn)

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

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

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

圖片

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

UDP協(xié)議報(bào)文組成部分

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

圖片

  1. 源、目標(biāo)端口號(hào)字段:占16比特。作用與TCP數(shù)據(jù)段中的端口號(hào)字段相同,用來(lái)標(biāo)識(shí)源端和目標(biāo)端的應(yīng)用進(jìn)程。
  2. 長(zhǎng)度字段:占16比特。標(biāo)明UDP頭部和UDP數(shù)據(jù)的總長(zhǎng)度字節(jié)。
  3. 校驗(yàn)和字段:占16比特。用來(lái)對(duì)UDP頭部和UDP數(shù)據(jù)進(jìn)行校驗(yàn)。和TCP不同的是,對(duì)UDP來(lái)說(shuō),此字段是可選項(xiàng),而TCP數(shù)據(jù)段中的校驗(yàn)和字段是必須有的。

UDP服務(wù)實(shí)現(xiàn)

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

圖片

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

TCP協(xié)議

TCP協(xié)議簡(jiǎn)介

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

TCP特點(diǎn)

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

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

TCP協(xié)議報(bào)文組成

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

圖片

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

TCP服務(wù)實(shí)現(xiàn)

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

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

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

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

圖片

三次握手,四次揮手場(chǎng)景面試

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

圖片

問(wèn)題1:為什么是 TCP 三次握手?不是兩次、四次?

  • 三次握手(Three-way Handshake)其實(shí)就是指建立一個(gè) TCP 連接時(shí),需要客戶端和服務(wù)器總共發(fā)送 3 個(gè)包。
  • 進(jìn)行三次握手的主要作用就是為了確認(rèn)對(duì)方的接收能力和發(fā)送能力是否正常,從而為后面的可靠性傳送做準(zhǔn)備。需要三次握手才能確認(rèn)對(duì)方的接收與發(fā)送能力是否正常。第一次客戶端發(fā)送給服務(wù)端,服務(wù)端回復(fù)給客戶端之后,客戶端就能知道服務(wù)端具備發(fā)送和接收能力了,此時(shí)服務(wù)端能知道客戶端具備發(fā)送能力,但是接收能力還不確定,等客戶端再次回復(fù)服務(wù)端的時(shí)候,服務(wù)端能知曉客戶端也具備發(fā)送和接收能力了。
  • 三次握手的次要作用是減少惡意偽造數(shù)據(jù)包的用戶對(duì)服務(wù)器攻擊,大量攻擊數(shù)據(jù)包可能占用著未完成三次握手隊(duì)列,使得正常需要提供服務(wù)的連接進(jìn)不來(lái),有了第三次握手,如果服務(wù)器收不到攻擊數(shù)據(jù)報(bào)的ACK,就會(huì)嘗試重發(fā)SYN+ACK報(bào)文,如果多次重試,連接不上,則服務(wù)器會(huì)關(guān)閉連接,有效降低SYN攻擊帶來(lái)的資源損害。

問(wèn)題2:為什么關(guān)閉連接的需要四次揮手?

  • 當(dāng)服務(wù)端收到客戶端FIN數(shù)據(jù)包后(第一次揮手),服務(wù)端不會(huì)立即close,為什么不立即close,因?yàn)榭赡軘?shù)據(jù)還沒有發(fā)完,服務(wù)端會(huì)先將ACK發(fā)送告訴客戶端我收到你的斷開請(qǐng)求(第二次揮手),請(qǐng)給我一點(diǎn)時(shí)間,這段時(shí)間用來(lái)發(fā)送剩下的數(shù)據(jù)報(bào)文,發(fā)送之后再將FIN包發(fā)給客戶端表示現(xiàn)在可以斷開了(第三次揮手)。客戶端收到FIN包之后發(fā)送ACK確認(rèn)斷開消息給服務(wù)端(第四次揮手)。
  • TCP允許單向發(fā)送數(shù)據(jù)。當(dāng)主動(dòng)關(guān)閉方關(guān)閉連接,被動(dòng)方在不調(diào)用close的狀態(tài)下,可以長(zhǎng)時(shí)間發(fā)送數(shù)據(jù),此時(shí)連接處于半關(guān)閉狀態(tài)。這一特性是TCP的雙向通道相互獨(dú)立導(dǎo)致的,也導(dǎo)致了關(guān)閉連接必須進(jìn)行四次揮手。

問(wèn)題3:為什么主動(dòng)斷開方在TIME-WAIT狀態(tài)必須等待2MSL的時(shí)間?

  • MSL(Maximum Segment Lifetime)Linux中MSL的值固定為30秒,所以TIME_WAIT的時(shí)間為60秒。
  • 如果沒有這個(gè)TIME_WAIT,端口可以復(fù)用于新連接了。這時(shí)被動(dòng)方的FIN報(bào)文可能再次到達(dá),可能是路由器重復(fù)發(fā)的,也可能是被動(dòng)方?jīng)]有收到ACK重發(fā)的。這樣正常的新連接就會(huì)被重復(fù)發(fā)送的舊的FIN誤關(guān)閉。保留了TIME_WAIT就可以應(yīng)付重發(fā)的FIN。
  • 等待2倍MSL,其實(shí)是允許ACK丟失一次,如果一個(gè)ACK丟失,被動(dòng)方重發(fā)的FIN就會(huì)在第二個(gè)MSL內(nèi)到達(dá),TIME_WAIT就可以應(yīng)付。

問(wèn)題4:什么是SYN攻擊?

  • SYN(synchronous)是TCP/IP建立連接時(shí)使用的握手信號(hào)。SYN攻擊屬于DDoS攻擊的一種,它利用TCP協(xié)議缺陷,通過(guò)發(fā)送大量的半連接請(qǐng)求,耗費(fèi)CPU和內(nèi)存資源。
  • SYN攻擊解決辦法:修改等待數(shù):
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
  • 啟用SYN Cookie,它的原理是,在TCP服務(wù)器收到TCP SYN包并返回TCP SYN+ACK包時(shí),不分配一個(gè)專門的數(shù)據(jù)區(qū),而是根據(jù)這個(gè)SYN包計(jì)算出一個(gè)cookie值。在收到TCP ACK包時(shí),TCP服務(wù)器在根據(jù)那個(gè)cookie值檢查這個(gè)TCP ACK包的合法性。如果合法,再分配專門的數(shù)據(jù)區(qū)進(jìn)行處理未來(lái)的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

責(zé)任編輯:趙寧寧 來(lái)源: 利志分享
相關(guān)推薦

2022-08-01 08:18:58

網(wǎng)絡(luò)網(wǎng)絡(luò)協(xié)議

2019-06-19 08:30:47

網(wǎng)絡(luò)協(xié)議IPTCP

2022-07-06 08:17:50

C 語(yǔ)言函數(shù)選型

2019-05-20 07:37:00

TCPIP網(wǎng)絡(luò)協(xié)議

2011-10-26 19:57:33

2022-09-23 08:32:53

微服務(wù)架構(gòu)服務(wù)

2023-01-06 09:40:20

項(xiàng)目性能

2020-06-08 10:50:58

前端TypeScript代碼

2018-12-03 09:19:28

移動(dòng)網(wǎng)絡(luò)NAT

2018-01-17 22:36:46

區(qū)塊鏈數(shù)字貨幣比特幣

2021-05-26 16:12:20

區(qū)塊鏈加密貨幣比特幣

2022-06-28 07:31:11

哨兵模式redis

2021-11-04 08:16:50

MySQL SQL 語(yǔ)句數(shù)據(jù)庫(kù)

2014-03-28 13:30:36

2018-03-11 14:57:07

物聯(lián)網(wǎng)組網(wǎng)無(wú)線通信

2018-03-29 06:40:26

物聯(lián)網(wǎng)

2011-06-21 10:28:49

Oracle

2023-09-02 21:14:32

2018-03-11 15:11:38

物聯(lián)網(wǎng)數(shù)據(jù)物聯(lián)網(wǎng)數(shù)據(jù)

2021-05-25 09:50:01

GitLinux命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)