版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
TCPTCP理解Linux是怎樣把三次握手中的狀態(tài)給我們,以及通過哪些工具可以找到優(yōu)化依因此,這一講介紹TCP握手過程中各狀態(tài)的意義,并以狀態(tài)變化作為主線,看看如何調(diào)整Linux參數(shù)才能提升握手的性能??蛻舳撕头?wù)器都可以針對(duì)三次握手優(yōu)化性能。相對(duì)而言,主動(dòng)發(fā)起連接的客戶端優(yōu)化相對(duì)簡(jiǎn)單一些,而服務(wù)器需要在端口上等待連接,并保存許多握手的中間狀態(tài),優(yōu)化方法更為復(fù)雜一些。我們首先來看如何優(yōu)化客戶端。三次握手建立連接的首要目的是同步序列號(hào)。只有同步了序列號(hào)才有可靠的傳輸,TCP協(xié)議的許多特性都是依賴序列號(hào)實(shí)現(xiàn)的,比如流量控制、消息丟失后的重發(fā)等等,這也是三次握手中的報(bào)文被稱為SYN的原因,因?yàn)镾YN的全稱就叫做SynchronizeeqenNumbers。過程中出現(xiàn)的3種狀態(tài)的意義??蛻舳税l(fā)送SYN開啟了三次握手,此時(shí)在客戶端上用netstat命令(后續(xù)查看連接狀態(tài)都使用該命令)可以看到連接的狀態(tài)是SYN_SENT(顧名思義,就是把剛SYN發(fā)送出去)。代代1 1ACKACK,但如果客戶端遲遲沒有收到ACK會(huì)怎么樣呢?客戶端會(huì)重發(fā)SYN,重試的次數(shù)由tcp_syn_retries參數(shù)控制,默認(rèn)是6次:1net.ipv4.tcp_syn_retries=第1次重試發(fā)生在1秒鐘后,接著會(huì)以翻倍的方式在第、、、、秒共做6次重試,最后一次重試會(huì)等待64秒,如果仍然沒有返回ACK,才會(huì)終止三次握手。所以,總耗時(shí)是1+2+4+8+16+32+64=127秒,超過2分鐘。如果這是一臺(tái)有明確任務(wù)的服務(wù)器,你可以根據(jù)網(wǎng)絡(luò)的穩(wěn)定性和目標(biāo)服務(wù)器的繁忙程度修改重試次數(shù),調(diào)整客戶端的三次握手時(shí)間上限。比如內(nèi)網(wǎng)中通訊時(shí),就可以適當(dāng)調(diào)低重試次數(shù),盡快把錯(cuò)誤給應(yīng)用程序。SYNSYN+ACKSYN_RCV(RCVreceived)SYN新連接建立失敗的原因有很多,怎樣獲得由于隊(duì)列已滿而次數(shù)呢?netstat-s命#netstat-s|grep"SYNstoSYNstoLISTENsocketsSYN加,則應(yīng)該調(diào)大SYN半連接隊(duì)列。修改隊(duì)列大小的方法,是設(shè)置Linux的tcp_max_syn_backlog參數(shù):1net.ipv4.tcp_max_syn_backlog=如果SYN半連接隊(duì)列已滿,只能丟棄連接嗎?并不是這樣,開啟syn s功能就可以在不使用SYN隊(duì)列的情況下成功建立連接。syn s是這么做的:服務(wù)器根據(jù)當(dāng)前狀態(tài)計(jì)算出一個(gè)值,放在己方發(fā)出的SYN+ACK報(bào)文中發(fā)出,當(dāng)客戶端返回ACK報(bào)文時(shí),取出Linux下怎樣開啟syn s功能呢?修改tcp_syn s參數(shù)即可,其中值為0時(shí)表示關(guān)閉該功能,2表示無條件開能,而1則表示僅當(dāng)SYN半連接隊(duì)列放不下時(shí),再啟用它。由于syn 僅用于應(yīng)對(duì)SYN泛洪(者構(gòu)造大量的SYN報(bào)文發(fā)送給服務(wù)器,造成SYN半連接隊(duì)列溢出,導(dǎo)致正??蛻舳说倪B接無法建立),這種方式建立的連接,許多TCP特性都無法使用。所以,應(yīng)當(dāng)把tcp_syn s設(shè)置為1,僅在隊(duì)列1s=SYN+ACKACK連接狀態(tài)從SYN_SENT轉(zhuǎn)換為ESTABLISHED,表示連接建立成功。服務(wù)器端連接成功建立的時(shí)間還要再往后,到它收到ACK后狀態(tài)才變?yōu)镋STABLISHED。如果服務(wù)器沒有收到ACK,就會(huì)一直重發(fā)SYN+ACK報(bào)文。當(dāng)網(wǎng)絡(luò)繁忙、不穩(wěn)定時(shí),報(bào)文丟失就會(huì)變嚴(yán)重,此時(shí)應(yīng)該調(diào)大重發(fā)次數(shù)。反之則可以調(diào)小重發(fā)次數(shù)。修改重發(fā)次數(shù)的方法是,調(diào)整tcp_synack_retries參數(shù):1net.ipv4.tcp_synack_retries=tcp_synack_retries的默認(rèn)重試次數(shù)是5次,與客戶端重發(fā)SYN類似,它的重試會(huì)經(jīng)歷1、2、4、8、16秒,最后一次重試后等待32秒,若仍然沒有收到ACK,才會(huì)關(guān)閉連接,故共63ACKSYN入accept隊(duì)列,等待進(jìn)程調(diào)用accept函數(shù)時(shí)把連接取出來。如果進(jìn)程不地調(diào)用accept函數(shù),就會(huì)造成accept隊(duì)列溢出,最終導(dǎo)致建立好的TCP連接被丟棄。實(shí)際上,丟棄連接只是Linux的默認(rèn)行為,我們還可以選擇向客戶端發(fā)送RST復(fù)位報(bào)文,告訴客戶端連接已經(jīng)建立失敗。打開這能需要將tcp_abort_on_overflow參數(shù)設(shè)置為1net.ipv4.tcp_abort_on_overflow=通常情況下,應(yīng)當(dāng)把tcp_abort_on_overflow設(shè)置為0,因?yàn)檫@樣更有利于應(yīng)對(duì)突發(fā)流量。舉個(gè)例子,當(dāng)accept隊(duì)列滿導(dǎo)致服務(wù)器丟掉了ACK,與此同時(shí),客戶端的連接狀態(tài)卻是ESTABLISHED,進(jìn)程就在建立好的連接上發(fā)送請(qǐng)求。只要服務(wù)器沒有為請(qǐng)求回復(fù)ACK,請(qǐng)求就會(huì)被多次重發(fā)。如果服務(wù)器上的進(jìn)程只是短暫的繁忙造成accept隊(duì)列滿,那么當(dāng)accept隊(duì)列有空位時(shí),再次接收到的請(qǐng)求報(bào)文由于含有ACK,仍然會(huì)觸發(fā)服務(wù)器端成功建立連接。所以,tcp_abort_on_overflow設(shè)為0可以提高連接建立的成功率,只有你非??隙╝ccept隊(duì)列會(huì)長(zhǎng)期溢出時(shí),才能設(shè)置為1以盡快通知客戶端。那么,怎樣調(diào)整accept隊(duì)列的長(zhǎng)度呢?listen函數(shù)的backlog參數(shù)就可以設(shè)置accept隊(duì)列的大小。事實(shí)上,backlogLinux限閾值也可以通過somaxconn參數(shù)修改。1net.core.somaxconn=當(dāng)下各端口上的accept隊(duì)列長(zhǎng)度可以通過ss-ltn命令查看,但accept隊(duì)列長(zhǎng)度是否需要調(diào)整該怎么判斷呢?還是通過netstats##netstat-s|grep"listen14timesthelistenqueueofasocket代三次握手建立連接造成的就是,HTTP請(qǐng)求必須在一次RTT(RoundTripTime,從客戶端到服務(wù)器一個(gè)往返的時(shí)間)后才能發(fā)送,對(duì)此做的統(tǒng)計(jì)顯示,三次握手消耗的時(shí)間,在HTTP請(qǐng)求完成的時(shí)間占比在10%到30%之間。因此,提出了TCPfastopen方案(簡(jiǎn) TFO),客戶端可以在首個(gè)SYN1RTT接下來我們就來看看,TFO具體是怎么實(shí)現(xiàn)的。為了讓客戶端在SYN報(bào)文中攜帶請(qǐng)求數(shù)據(jù),必須解決服務(wù)器的信任問題。因?yàn)榇藭r(shí)服務(wù)器的SYN報(bào)文還沒有發(fā)給客戶端,客戶端是否能夠正常建立連接還未可知,但此時(shí)服務(wù)器需要假定連接已經(jīng)建立成功,并把請(qǐng)求交付給進(jìn)程去處理,所以服務(wù)器必須能夠信任這個(gè)客戶端。TFOSYNTFO樣服務(wù)器會(huì)把客戶端IP地址用只有自己知道的密鑰加密(比如AES加密算法),作為 之后,如果客戶端再次向服務(wù)器建立連接,就可以在第一個(gè)SYN報(bào)文中攜帶請(qǐng)求數(shù)據(jù),同 。很顯然,這種通訊方式下不能再采用經(jīng)典的“先connect再write請(qǐng)求”這種編程方法,而要改用sendto或者sendmsg函數(shù)才能實(shí)現(xiàn)。 把請(qǐng)求交給進(jìn)程處理,同時(shí)給客戶端返回SYN+ACK。雖然客戶端收到后還會(huì)返回ACK,但服務(wù)器不等收到ACK就可以發(fā)送HTTP響應(yīng)了,這就減少了握手帶來的1個(gè)RTT的時(shí)間當(dāng)然,為了防止SYN泛洪,服務(wù)器的TFO實(shí)現(xiàn)必須能夠自動(dòng)化地定時(shí)更新密鑰Linux下怎么打開TFO功能呢?這要通過tcp_fastopen參數(shù)。由于只有客戶端和服務(wù)器同時(shí)支持時(shí),TFO功能才能使用,所以tcp_fastopen參數(shù)是按比特位控制的。其中,第1個(gè)比特位為1時(shí),表示作為客戶端時(shí)支持TFO;第2個(gè)比特位為1時(shí),表示作為服務(wù)器時(shí)支持TFO,所以當(dāng)tcp_fastopen的值為3時(shí)(比特為0x11)就表示完全支持TFO功能。1net.ipv4.tcp_fastopen=這一講,我們沿著三次握手的流程,介紹了Linux當(dāng)客戶端通過發(fā)送SYN發(fā)起握手時(shí),可以通過tcp_syn_retries控制重發(fā)次數(shù)。當(dāng)服務(wù)器的SYN半連接隊(duì)列溢出后,SYN報(bào)文會(huì)丟失從而導(dǎo)致連接建立失敗。我們可以通過netstatstcp_max_syn_backlog調(diào)整隊(duì)列的長(zhǎng)度。服務(wù)器回復(fù)SYN+ACK報(bào)文的重試次數(shù)由tcp_synack_retries參數(shù)控制,網(wǎng)絡(luò)穩(wěn)定時(shí)可以調(diào)小它。為了應(yīng)對(duì)SYN泛洪,應(yīng)將tcp_syn s參數(shù)設(shè)置為1,它僅在SYN隊(duì)列滿后開啟syn 服務(wù)器收到客戶端返回的ACK后,會(huì)把連接移入accept隊(duì)列,等待進(jìn)程調(diào)用accept函數(shù)取出連接。如果accept隊(duì)列溢出,默認(rèn)系統(tǒng)會(huì)丟棄ACK,也可以通過tcp_abort_on_overflow參數(shù)用RST通知客戶端連接建立失敗。如果netstat統(tǒng)計(jì)信息顯示,大量的ACK被丟棄后,可以通過listen函數(shù)的backlog參數(shù)和somaxconn系統(tǒng)參TFOHTTP1RTTLinux從這一講可以看出,雖然TCP是由操作系統(tǒng)實(shí)現(xiàn)的,但Linux通過多種方式提供了修改TCP功能的接口,供我們優(yōu)化TCP的性能。下一講我們?cè)賮硖接懰拇挝帐株P(guān)閉連接時(shí),Linux怎樣幫助我們優(yōu)化其性能。 歸科技所有 不得售賣。頁面已增加防盜追蹤,將依法其上一 08|驅(qū)動(dòng):C10M是如何實(shí)現(xiàn)的下一 10|如何提升TCP四次揮手的性能言言1 7net/ipv4/tcp_retries2決定。4time_wait時(shí)長(zhǎng),復(fù)用time_wait3看評(píng)論區(qū),很多同學(xué)都說是長(zhǎng)連接,普通的httpkeepalive會(huì)不會(huì)有坑,營(yíng)商或者2作者回復(fù):1 221老師,TFO編程的時(shí)候,為什么要改為sendto或者sendmsg作者回復(fù):你好Tango281,非TFO場(chǎng)景下,你大可先調(diào)用connect函數(shù),在這里傳遞服務(wù)器地11 當(dāng)SYN1linux老師今天內(nèi)容很有價(jià)值讓我對(duì)tcp連接有了更深入的了解,此時(shí)我有些問題1.在內(nèi)容中只講到了服務(wù)端在建立連接的時(shí)候會(huì)半連接隊(duì)列,和accep隊(duì)列,問在這個(gè)過程當(dāng)中,客戶端會(huì)隊(duì)列嗎?如果有的是什么樣結(jié)構(gòu)和規(guī)范?第二個(gè)問題就是確認(rèn)下我今天聽課的一個(gè)收獲,我的總結(jié)是在tcp傳輸過程當(dāng)中無論是客戶端和服務(wù)端再給對(duì)方發(fā)送請(qǐng)求時(shí)必須要有回應(yīng),如果沒有回應(yīng)就會(huì)通過重試機(jī)制來重發(fā),重試一定次數(shù)后仍然沒…作者回復(fù) 你好a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版存量房屋買賣合同范本:房產(chǎn)交易售后服務(wù)合同2篇
- 2025年度生態(tài)園林景觀石采購(gòu)供應(yīng)合同協(xié)議書3篇
- 2025年度消費(fèi)借款合同(寵物消費(fèi)貸款版)
- 人教版數(shù)學(xué)四年級(jí)上冊(cè)-93公頃和平方千米、角的度量-教學(xué)課件
- 2024版化工材料采購(gòu)合同
- 二零二五年度供應(yīng)鏈金融貸款合同雙方2篇
- 2025版鋼構(gòu)加工與項(xiàng)目管理服務(wù)合同3篇
- 2024版家庭服務(wù)居間代理合同樣本版B版
- 2024消防安全隱患排查及整改工程協(xié)議3篇
- 學(xué)校消防知識(shí)宣傳橫幅標(biāo)語(95句)
- 山東省濟(jì)南市2022年中考英語情景運(yùn)用拔高練習(xí)(Word版含答案)
- 中學(xué)校本課程教材《生活中的化學(xué)》
- 污水處理站運(yùn)行維護(hù)管理方案
- 農(nóng)村公路養(yǎng)護(hù)工程施工組織設(shè)計(jì)
- 個(gè)人如何開辦婚介公司,婚介公司經(jīng)營(yíng)和管理
- 公司物流倉儲(chǔ)規(guī)劃方案及建議書
- 天津市歷年社會(huì)保險(xiǎn)繳費(fèi)基數(shù)、比例
- 2024國(guó)家開放大學(xué)電大??啤秾W(xué)前兒童發(fā)展心理學(xué)》期末試題及答案
- 汽車座椅面套縫紉工時(shí)定額的研究
- 立體幾何??级ɡ砜偨Y(jié)(八大定理)
- 噴嘴壓力計(jì)算表及選型
評(píng)論
0/150
提交評(píng)論