用于tcp協(xié)議的重傳包丟失檢測方法和裝置制造方法
【專利摘要】本發(fā)明公開了一種用于TCP協(xié)議的重傳包丟失檢測方法和裝置。其中,重傳包丟失檢測方法包括:將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端,其中,接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包;從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包,其中,第一數(shù)據(jù)包為未收到接收端返回第一確認(rèn)信息的已重新發(fā)送過一次的數(shù)據(jù)包;檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包對應(yīng)的第二確認(rèn)信息,其中,第二數(shù)據(jù)包為發(fā)送隊(duì)列中在第一數(shù)據(jù)包之后發(fā)送的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包;以及如果檢測出在發(fā)送第一數(shù)據(jù)包之后接收到第二確認(rèn)信息,則確定第一數(shù)據(jù)包丟失。通過本發(fā)明,達(dá)到了及時(shí)確定丟失的重傳包的效果。
【專利說明】用于TCP協(xié)議的重傳包丟失檢測方法和裝置
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及互聯(lián)網(wǎng)領(lǐng)域,具體而言,涉及一種用于TCP協(xié)議的重傳包丟失檢測方 法和裝置。
【背景技術(shù)】
[0002] 傳輸控制協(xié)議(Transmission Control Protocol,TCP)是一種面向連接的、可靠 的、基于字節(jié)流的傳輸層通信協(xié)議,是許多日常應(yīng)用如HTTP、FTP、SSH、SMTP等服務(wù)的底層 協(xié)議基礎(chǔ)。
[0003] TCP的累積確認(rèn):TCP傳輸出去的數(shù)據(jù)的每個(gè)字節(jié)通常都對應(yīng)一個(gè)唯一的32比特 位長度的數(shù)字。在通過TCP進(jìn)行通信時(shí),當(dāng)數(shù)據(jù)包的發(fā)送端收到接收端響應(yīng)的報(bào)文中攜帶 的32比特位長度的確認(rèn)序號時(shí),則認(rèn)為該確認(rèn)序號以下的所有數(shù)據(jù)字節(jié)都已經(jīng)被接收到 了,即所謂的"累積確認(rèn)"。
[0004] TCP的SACK選項(xiàng):當(dāng)TCP接收端收到不是按序到達(dá)的數(shù)據(jù)包時(shí)(即先收到后發(fā)的 數(shù)據(jù)包),接收端會立即發(fā)送攜帶SACK選項(xiàng)的確認(rèn)包。該確認(rèn)包的累積確認(rèn)序號和上一次 發(fā)送的確認(rèn)包的累積確認(rèn)序號相同,但該確認(rèn)包攜帶的SACK選項(xiàng)中會記錄剛剛收到的亂 序包的起始字節(jié)的序號和結(jié)束字節(jié)的序號。發(fā)送端在收到該攜帶SACK信息的確認(rèn)包時(shí),就 能知道當(dāng)前接收端已經(jīng)接收到了哪些數(shù)據(jù)包,哪些數(shù)據(jù)包還沒被收到。
[0005] TCP的發(fā)送隊(duì)列:TCP維護(hù)一個(gè)發(fā)送隊(duì)列,該隊(duì)列內(nèi)包含所有已經(jīng)發(fā)送出去但還沒 收到累積確認(rèn)的數(shù)據(jù)包和等待發(fā)送出去的數(shù)據(jù)包,并且在每次收到累積確認(rèn)(ACK)時(shí)將已 經(jīng)被累積確認(rèn)的數(shù)據(jù)包移出該隊(duì)列。
[0006] 目前,在TCP協(xié)議中對重傳包(即重新發(fā)送的數(shù)據(jù)包)丟失檢測機(jī)制例如Linux 內(nèi)核是在每次重傳數(shù)據(jù)包時(shí)記錄從未發(fā)送過的最小序號數(shù)據(jù)包的序號。由于Linux內(nèi)核的 發(fā)包是優(yōu)先重傳已經(jīng)發(fā)送過但可能丟失的舊數(shù)據(jù)包,然后再發(fā)送從未發(fā)送過的數(shù)據(jù)包。所 以,如果已經(jīng)收到對重傳數(shù)據(jù)包時(shí)尚未發(fā)送的數(shù)據(jù)包的SACK確認(rèn)信息,而此前重傳過的舊 數(shù)據(jù)包還沒有收到對應(yīng)的確認(rèn)信息,則認(rèn)為該重傳的數(shù)據(jù)包已經(jīng)丟失,可以立即進(jìn)行補(bǔ)傳。
[0007] 如圖1所示為當(dāng)前TCP發(fā)送隊(duì)列的狀態(tài),實(shí)線方框代表已經(jīng)發(fā)送出去,但還沒有收 到累積確認(rèn)的數(shù)據(jù)包,虛線方框代表還未發(fā)送過的數(shù)據(jù)包。此時(shí)TCP已經(jīng)依據(jù)RFC6675標(biāo) 準(zhǔn)的快速重傳和快速恢復(fù)算法發(fā)現(xiàn)數(shù)據(jù)包1、2、3、4、5、6、7、8、9可能已丟失,于是立即按順 序重傳數(shù)據(jù)包1、2、3、4、5、6、7、8、9,并在重傳每個(gè)數(shù)據(jù)包時(shí)記錄下此時(shí)從未發(fā)送過的新數(shù) 據(jù)包編號,在這里是63。
[0008] Linux內(nèi)核的發(fā)包是優(yōu)先重傳已經(jīng)發(fā)送過但可能丟失的舊數(shù)據(jù)包,然后再發(fā)送從 未發(fā)送過的新數(shù)據(jù)包。所以直到1?62號包沒有其他需要重傳的以后,TCP才會開始發(fā)送 新數(shù)據(jù)包,也就是63號包。
[0009] 如果剛才重傳出去的數(shù)據(jù)包1又在網(wǎng)絡(luò)中丟失,那么必須等到63號包或者64及 其上的某個(gè)包被SACK確認(rèn)以后,才能判定數(shù)據(jù)包1再次丟失了。直到那時(shí)才會再次補(bǔ)傳數(shù) 據(jù)包1。
[0010] 在現(xiàn)代無線大帶寬網(wǎng)絡(luò)環(huán)境(比如4G網(wǎng)絡(luò)和Wi-Fi網(wǎng)絡(luò))下,一方面,由于無線 網(wǎng)絡(luò)的電磁波信號易受干擾和不穩(wěn)定特性,導(dǎo)致鏈路丟包率較高,所以重傳的數(shù)據(jù)包又一 次丟失的情況很容易出現(xiàn);另一方面,在像4G和Wi-Fi這種高速傳輸?shù)拇髱捑W(wǎng)絡(luò),TCP - 次就會傳輸幾十、幾百個(gè)數(shù)據(jù)包,所以其中由于丟包產(chǎn)生的重傳包也會很多。
[0011] 以圖1所示為例,在無線網(wǎng)絡(luò)環(huán)境下,由于無線傳輸?shù)母邅G包率,1?62號數(shù)據(jù)包 之間就會存在多個(gè)需要重傳的數(shù)據(jù)包。由于Linux內(nèi)核會優(yōu)先重傳數(shù)據(jù)包,所以在真正發(fā) 送63號數(shù)據(jù)包之前,還需要重傳1?62之間所有已經(jīng)丟失的數(shù)據(jù)包。所以63號包會很晚 才發(fā)送出去,進(jìn)而導(dǎo)致接收63包的確認(rèn)信息時(shí)間更長,延遲了重傳包丟失的檢測時(shí)間。
[0012] 在大帶寬網(wǎng)絡(luò)下,重傳隊(duì)列內(nèi)通常達(dá)到幾十,甚至上百個(gè)數(shù)據(jù)包,而在高丟包網(wǎng)絡(luò) 環(huán)境下,這些數(shù)據(jù)包很可能不止一個(gè)丟失。如果等到這些丟失的數(shù)據(jù)包都重傳完畢,再發(fā)送 新數(shù)據(jù)包,則要在收到新數(shù)據(jù)包的確認(rèn)信息時(shí)才能判定此前重傳的數(shù)據(jù)包是否丟失。這樣, 由于無法及時(shí)確定重傳的數(shù)據(jù)包是否丟失導(dǎo)致在該重傳的數(shù)據(jù)包丟失之后,無法及時(shí)重新 發(fā)送該重傳的數(shù)據(jù)包。
[0013] 針對現(xiàn)有技術(shù)中無法及時(shí)確定重傳的數(shù)據(jù)包是否丟失的問題,目前尚未提出有效 的解決方案。
【發(fā)明內(nèi)容】
[0014] 本發(fā)明的主要目的在于提供一種用于TCP協(xié)議的重傳包丟失檢測方法和裝置,以 解決現(xiàn)有技術(shù)中無法及時(shí)確定重傳的數(shù)據(jù)包是否丟失的問題。
[0015] 為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于TCP協(xié)議的重傳包 丟失檢測方法。根據(jù)本發(fā)明的重傳包丟失檢測方法包括:將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì) 列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端,其中,接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù) 包;從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包,其中,第一數(shù)據(jù)包為未收到接收端返回第一確認(rèn)信息的 已重新發(fā)送過一次的數(shù)據(jù)包,第一確認(rèn)信息為接收端在接收到第一數(shù)據(jù)包時(shí)返回的確認(rèn)信 息;檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包對應(yīng)的第二確認(rèn)信息, 其中,第二數(shù)據(jù)包為發(fā)送隊(duì)列中在第一數(shù)據(jù)包之后發(fā)送的第N個(gè)及第N個(gè)以后的任意一個(gè) 數(shù)據(jù)包,第二確認(rèn)信息為接收端在接收到第二數(shù)據(jù)包時(shí)返回的確認(rèn)信息;以及如果檢測出 在發(fā)送第一數(shù)據(jù)包之后接收到第二確認(rèn)信息,則確定第一數(shù)據(jù)包丟失。
[0016] 進(jìn)一步地,N為系統(tǒng)預(yù)設(shè)值,N的值大于或者等于3,其中,檢測在發(fā)送第一數(shù)據(jù)包 之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包對應(yīng)的第二確認(rèn)信息包括:查詢在發(fā)送第一數(shù)據(jù)包 之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包;檢測是否接收到第N個(gè)數(shù)據(jù) 包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包對應(yīng)的確認(rèn)信息。
[0017] 進(jìn)一步地,在將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收 端的同時(shí),重傳包丟失檢測方法還包括:記錄發(fā)送隊(duì)列中從未發(fā)送過的序號最小的數(shù)據(jù)包 的序號,在查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù) 據(jù)包之前,重傳包丟失檢測方法還包括:判斷在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí)間之后是 否存在至少N個(gè)已發(fā)送的數(shù)據(jù)包;如果判斷出在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí)間之后存 在至少N個(gè)已發(fā)送的數(shù)據(jù)包,則判斷至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號是否小于從未 發(fā)送過的序號最小的數(shù)據(jù)包的序號,其中,如果判斷出至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序 號均小于從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,則查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第 N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包。
[0018] 進(jìn)一步地,從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包包括:按照發(fā)送的時(shí)間順序?qū)Πl(fā)送隊(duì)列 中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序;從排序后的數(shù)據(jù)包中查詢已重新發(fā)送過一次的數(shù)據(jù)包; 以及按時(shí)間先后順序確定已重新發(fā)送過一次的數(shù)據(jù)包中最先發(fā)送出去并且未接收到接收 端返回的確認(rèn)信息的數(shù)據(jù)包,將最先發(fā)送出去并且未接收到接收端返回的確認(rèn)信息的數(shù)據(jù) 包作為第一數(shù)據(jù)包。
[0019] 進(jìn)一步地,按照發(fā)送的時(shí)間順序?qū)Πl(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序之 前,重傳包丟失檢測方法還包括:記錄所有已發(fā)送的數(shù)據(jù)包的發(fā)送時(shí)間,其中,按照記錄的 時(shí)間對所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序,從排序后的數(shù)據(jù)包中查詢已重新發(fā)送過一次的數(shù)據(jù) 包包括:接收接收端返回的ACK確認(rèn)包,ACK確認(rèn)包攜帶有SACK選項(xiàng);根據(jù)SACK選項(xiàng)標(biāo)記 發(fā)送隊(duì)列中接收端返回的確認(rèn)信息對應(yīng)的數(shù)據(jù)包,將未被標(biāo)記的數(shù)據(jù)包作為待重新發(fā)送的 數(shù)據(jù)包。
[0020] 為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的另一方面,提供了一種用于TCP協(xié)議的重傳包 丟失檢測裝置。根據(jù)本發(fā)明的重傳包丟失檢測裝置包括:發(fā)送單元,用于將基于TCP協(xié)議傳 輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端,其中,接收端用于接收基于TCP協(xié)議 傳輸?shù)臄?shù)據(jù)包;第一確定單元,用于從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包,其中,第一數(shù)據(jù)包為未 收到接收端返回第一確認(rèn)信息的已重新發(fā)送過一次的數(shù)據(jù)包,第一確認(rèn)信息為接收端在接 收到第一數(shù)據(jù)包時(shí)返回的確認(rèn)信息;檢測單元,用于檢測在發(fā)送第一數(shù)據(jù)包之后是否接收 到發(fā)送隊(duì)列中第二數(shù)據(jù)包對應(yīng)的第二確認(rèn)信息,其中,第二數(shù)據(jù)包為發(fā)送隊(duì)列中在第一數(shù) 據(jù)包之后發(fā)送的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包,第二確認(rèn)信息為接收端在接收到 第二數(shù)據(jù)包時(shí)返回的確認(rèn)信息;以及第二確定單元,用于如果檢測出在發(fā)送第一數(shù)據(jù)包之 后接收到第二確認(rèn)信息,則確定第一數(shù)據(jù)包丟失。
[0021] 進(jìn)一步地,N為系統(tǒng)預(yù)設(shè)值,N的值大于或者等于3,其中,檢測單元包括:第一查詢 模塊,用于查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù) 據(jù)包;檢測模塊,用于檢測是否接收到第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包對應(yīng) 的確認(rèn)信息。
[0022] 進(jìn)一步地,重傳包丟失檢測裝置還包括:第一記錄單元,用于在將基于TCP協(xié)議傳 輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端的同時(shí),記錄發(fā)送隊(duì)列中從未發(fā)送過的 序號最小的數(shù)據(jù)包的序號,第一判斷單元,用于在查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N 個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包之前,判斷在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí) 間之后是否存在至少N個(gè)已發(fā)送的數(shù)據(jù)包;第二判斷單元,用于當(dāng)判斷出在發(fā)送隊(duì)列中第 一數(shù)據(jù)包的發(fā)送時(shí)間之后存在至少N個(gè)已發(fā)送的數(shù)據(jù)包時(shí),判斷至少N個(gè)數(shù)據(jù)包的前N個(gè) 數(shù)據(jù)包的序號是否小于從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,其中,第一查詢模塊還用 于當(dāng)判斷出至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號均小于從未發(fā)送過的序號最小的數(shù)據(jù)包 的序號時(shí),查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù) 據(jù)包。
[0023] 進(jìn)一步地,第一確定單元包括:排序模塊,用于按照發(fā)送的時(shí)間順序?qū)Πl(fā)送隊(duì)列中 所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序;第二查詢模塊,用于從排序后的數(shù)據(jù)包中查詢已重新發(fā)送 過一次的數(shù)據(jù)包;以及確定模塊,用于按時(shí)間先后順序確定已重新發(fā)送過一次的數(shù)據(jù)包中 最先發(fā)送出去并且未接收到接收端返回的確認(rèn)信息的數(shù)據(jù)包,將最先發(fā)送出去并且未接收 到接收端返回的確認(rèn)信息的數(shù)據(jù)包作為第一數(shù)據(jù)包。
[0024] 進(jìn)一步地,重傳包丟失檢測裝置還包括:第二記錄單元,用于按照發(fā)送的時(shí)間順序 對發(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序之前,記錄所有已發(fā)送的數(shù)據(jù)包的發(fā)送時(shí)間, 其中,按照記錄的時(shí)間對所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序,第二查詢模塊包括:接收子模塊, 用于接收接收端返回的ACK確認(rèn)包,ACK確認(rèn)包攜帶有SACK選項(xiàng);標(biāo)記子模塊,用于根據(jù) SACK選項(xiàng)標(biāo)記發(fā)送隊(duì)列中接收端返回的確認(rèn)信息對應(yīng)的數(shù)據(jù)包,將未被標(biāo)記的數(shù)據(jù)包作為 待重新發(fā)送的數(shù)據(jù)包。
[0025] 根據(jù)本發(fā)明實(shí)施例,將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送 至接收端,從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包即為未被確認(rèn)且已經(jīng)重新發(fā)送過一次的數(shù)據(jù)包, 檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包的第二確認(rèn)信息即第一數(shù) 據(jù)包之后的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包的確認(rèn)信息,如果檢測出在重新發(fā)送第 一數(shù)據(jù)包之后接收到第二確認(rèn)信息,則確定第一數(shù)據(jù)包丟失,通過增加對重傳后的數(shù)據(jù)包 之后的發(fā)送的數(shù)據(jù)包確認(rèn)信息的檢測,無需等到接收到新的數(shù)據(jù)包的確認(rèn)信息時(shí),才確定 重發(fā)的數(shù)據(jù)包丟失,從而可以及時(shí)檢測重傳包是否丟失,解決了現(xiàn)有技術(shù)中無法及時(shí)確定 重傳的數(shù)據(jù)包是否丟失的問題,達(dá)到了及時(shí)確定丟失的重傳包的效果。
【專利附圖】
【附圖說明】
[0026] 構(gòu)成本申請的一部分的附圖用來提供對本發(fā)明的進(jìn)一步理解,本發(fā)明的示意性實(shí) 施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
[0027] 圖1是根據(jù)現(xiàn)有技術(shù)的發(fā)送隊(duì)列的示意圖;
[0028] 圖2是根據(jù)本發(fā)明實(shí)施例的重傳包丟失檢測方法的流程圖;
[0029] 圖3是根據(jù)本發(fā)明實(shí)施例的發(fā)送隊(duì)列的示意圖;
[0030] 圖4是根據(jù)本發(fā)明實(shí)施例優(yōu)選的重傳包丟失檢測方法的流程圖;以及
[0031] 圖5是根據(jù)本發(fā)明實(shí)施例的重傳包丟失檢測裝置的示意圖。
【具體實(shí)施方式】
[0032] 需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相 互組合。下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。
[0033] 為了使本【技術(shù)領(lǐng)域】的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實(shí)施例中的 附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是 本發(fā)明一部分的實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù) 人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范 圍。
[0034] 需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語"第一"、"第 二"等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使 用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實(shí)施例。此外,術(shù)語"包括"和 "具有"以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元 的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有 清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
[0035] 本發(fā)明實(shí)施例提供了一種用于TCP協(xié)議的重傳包丟失檢測方法。
[0036] 圖2是根據(jù)本發(fā)明實(shí)施例的重傳包丟失檢測方法的流程圖。如圖2所示,該重傳 包丟失檢測方法包括步驟如下:
[0037] 步驟S202,將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收 端。其中,接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包。
[0038] 基于TCP協(xié)議的發(fā)送隊(duì)列可以是TCP維護(hù)一個(gè)發(fā)送隊(duì)列,該隊(duì)列內(nèi)可以包含所有 已經(jīng)發(fā)送出去但還沒收到累積確認(rèn)的數(shù)據(jù)包和等待發(fā)送出去的數(shù)據(jù)包(例如已經(jīng)發(fā)送卻 丟失的待重新發(fā)送的數(shù)據(jù)包),并且在每次收到累積確認(rèn)(ACK)時(shí)將已經(jīng)被累積確認(rèn)的數(shù) 據(jù)包移出該隊(duì)列。同時(shí),如果ACK確認(rèn)包中包含SACK信息,則可以依據(jù)SACK信息將隊(duì)列中 已經(jīng)被SACK確認(rèn)的數(shù)據(jù)包標(biāo)記為S,然后根據(jù)快速重傳和快速恢復(fù)算法,將認(rèn)為丟失的數(shù) 據(jù)包標(biāo)記為L,并等待重傳。而當(dāng)真正重傳數(shù)據(jù)包時(shí),將需要重傳的數(shù)據(jù)包標(biāo)記為R。這里 的待重新發(fā)送的數(shù)據(jù)包是指在進(jìn)行TCP傳輸時(shí),已經(jīng)發(fā)送一次卻丟失的數(shù)據(jù)包,該數(shù)據(jù)包 需要重新發(fā)送至接收端。接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包。
[0039] 具體地,接收端向發(fā)送端發(fā)送數(shù)據(jù)請求,發(fā)送端響應(yīng)該數(shù)據(jù)請求,并將接收端所請 求的數(shù)據(jù)包通過網(wǎng)絡(luò)發(fā)送至接收端,接收端接收到數(shù)據(jù)包之后,向發(fā)送端返回確認(rèn)信息,以 告知發(fā)送端已經(jīng)接收到數(shù)據(jù)包。由于網(wǎng)絡(luò)中容易受到干擾或者一些不穩(wěn)定因素的影響,導(dǎo) 致數(shù)據(jù)包丟失。此時(shí),需要重新向接收端發(fā)送丟失的數(shù)據(jù)包。在重新發(fā)送之后,如果接收端 接收到重新發(fā)送的數(shù)據(jù)包,依然會向發(fā)送端返回確認(rèn)信息。
[0040] 步驟S204,從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包。其中,第一數(shù)據(jù)包為未收到接收端返回 第一確認(rèn)信息的已重新發(fā)送過一次的數(shù)據(jù)包,第一確認(rèn)信息為接收端在接收到第一數(shù)據(jù)包 時(shí)返回的確認(rèn)信息。
[0041] 由于TCP協(xié)議中接收端接收到的并非按序發(fā)送的數(shù)據(jù)包(即先發(fā)送的后接收到, 后發(fā)送的先接收到),這樣會導(dǎo)致接收端可能先收到后發(fā)送的數(shù)據(jù)包的確認(rèn)信息,先發(fā)送的 數(shù)據(jù)包可能是因?yàn)閬G失或者是到達(dá)接收端的時(shí)間晚于后發(fā)送的數(shù)據(jù)包。從發(fā)送隊(duì)列中確定 第一數(shù)據(jù)包,即未接收到接收端返回確認(rèn)信息且重新發(fā)送過一次的數(shù)據(jù)包,該數(shù)據(jù)包可以 是重新發(fā)送過一次的數(shù)據(jù)包中最早發(fā)送但是未被確認(rèn)的數(shù)據(jù)包,以便于從重新發(fā)送的數(shù)據(jù) 包中按時(shí)間順序優(yōu)先判斷較早發(fā)送的數(shù)據(jù)包是否再次丟失。
[0042] 步驟S206,檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包的第二 確認(rèn)信息。其中,第二數(shù)據(jù)包為發(fā)送隊(duì)列中在第一數(shù)據(jù)包之后發(fā)送的第N個(gè)及第N個(gè)以后 的的任意一個(gè)數(shù)據(jù)包,第二確認(rèn)信息為接收端在接收到第二數(shù)據(jù)包時(shí)返回的確認(rèn)信息。
[0043] 步驟S208,如果檢測出在發(fā)送第一數(shù)據(jù)包之后接收到第二確認(rèn)信息,則確定第一 數(shù)據(jù)包丟失。
[0044] 在發(fā)送第一數(shù)據(jù)包之后,發(fā)送端還需要發(fā)送剩下待重新發(fā)送的數(shù)據(jù)包和新的數(shù)據(jù) 包。在發(fā)送完第一數(shù)據(jù)包之后,可以對接收到的確認(rèn)信息進(jìn)行檢測,以檢測是否接收到第 一數(shù)據(jù)包之后第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包的確認(rèn)信息。其中,N為預(yù)設(shè)值,可以 根據(jù)實(shí)際情況進(jìn)行設(shè)置,也可以根據(jù)TCP傳輸協(xié)議中的屬性進(jìn)行設(shè)置,例如,基于TCP協(xié)議 傳輸?shù)臄?shù)據(jù)包通常不會晚于3個(gè)以后發(fā)送的數(shù)據(jù)包,因此,這里的N值可以是大于或者等于 3的值,即第二數(shù)據(jù)包可以是第一數(shù)據(jù)包之后的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包,其 中,當(dāng)N等于3時(shí)可以涵蓋TCP中大部分的重傳包丟失檢測。
[0045] 具體地,在當(dāng)需要檢測第一數(shù)據(jù)包是否丟失時(shí),可以檢測在第一數(shù)據(jù)包之后,相隔 預(yù)設(shè)值及其之后的數(shù)據(jù)包是否已經(jīng)確認(rèn)被接收端接收到。如圖1所示,當(dāng)數(shù)據(jù)包1至9為 已重新發(fā)送的數(shù)據(jù)包時(shí),首先,按照時(shí)間順序確定數(shù)據(jù)包1為未被確認(rèn)的數(shù)據(jù)包,檢測數(shù)據(jù) 包1是否丟失可以通過判斷數(shù)據(jù)包4或者數(shù)據(jù)包4之后的數(shù)據(jù)包(例如,數(shù)據(jù)包7或者數(shù) 據(jù)包63、64等)是否被確認(rèn),即是否接收到接收端返回的確認(rèn)信息,如果是已接收到接收端 返回的確認(rèn)信息,則認(rèn)為數(shù)據(jù)包1丟失。依次類推,判斷所有已經(jīng)重新發(fā)送過一次的數(shù)據(jù)包 是否丟失,從而無需等到接收到新的數(shù)據(jù)包的確認(rèn)信息時(shí),才確定重發(fā)的數(shù)據(jù)包丟失。
[0046] 根據(jù)本發(fā)明實(shí)施例,將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送 至接收端,從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包即為未被確認(rèn)且已經(jīng)重新發(fā)送過一次的數(shù)據(jù)包, 檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包的第二確認(rèn)信息即第一數(shù) 據(jù)包之后的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包的確認(rèn)信息,如果檢測出在發(fā)送第一數(shù) 據(jù)包之后接收到第二確認(rèn)信息,則確定第一數(shù)據(jù)包丟失,通過增加對重傳數(shù)據(jù)包之后的發(fā) 送的數(shù)據(jù)包確認(rèn)信息的檢測,無需等到接收到新的數(shù)據(jù)包的確認(rèn)信息時(shí),才確定重發(fā)的數(shù) 據(jù)包丟失,從而可以及時(shí)檢測重傳包是否丟失,解決了現(xiàn)有技術(shù)中無法及時(shí)確定重傳的數(shù) 據(jù)包是否丟失的問題,達(dá)到了及時(shí)確定丟失的重傳包的效果。
[0047] 在確定重傳包丟失之后,可以立即重傳丟失的重傳包,也可以根據(jù)需要選擇現(xiàn)有 的TCP處理流程。
[0048] 需要說明的是,在本發(fā)明實(shí)施例的重傳包丟失檢測方法可以應(yīng)用于有線網(wǎng)中數(shù)據(jù) 包的傳輸,也可以用于無線網(wǎng)絡(luò)中的數(shù)據(jù)包傳輸。由于無線網(wǎng)絡(luò)(比如2G、3G、4G、Wi-Fi網(wǎng) 絡(luò))環(huán)境下,一方面,由于無線網(wǎng)絡(luò)的電磁波信號易受干擾和不穩(wěn)定特性,導(dǎo)致鏈路丟包率 較高,所以重傳的數(shù)據(jù)包又一次丟失的情況很容易出現(xiàn);另一方面,在像4G和Wi-Fi這種高 速傳輸?shù)拇髱捑W(wǎng)絡(luò)環(huán)境中,TCP-次就會傳輸幾十、幾百個(gè)數(shù)據(jù)包,所以其中由于丟包產(chǎn) 生的重傳包也會很多,因此,本發(fā)明實(shí)施例的重傳包丟失檢測方法應(yīng)用于無線網(wǎng)絡(luò)其效果 更加顯著。
[0049] 優(yōu)選地,N為系統(tǒng)預(yù)設(shè)值,該值大于或者等于3,其中,檢測在發(fā)送第一數(shù)據(jù)包之后 是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包對應(yīng)的第二確認(rèn)信息包括:查詢在發(fā)送第一數(shù)據(jù)包之后 發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包;檢測是否接收到第N個(gè)數(shù)據(jù)包及 第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包對應(yīng)的確認(rèn)信息。
[0050] 在TCP協(xié)議中,通常要求先發(fā)送的數(shù)據(jù)包不晚于在其后發(fā)送的3個(gè)數(shù)據(jù)包到達(dá)接 收端,當(dāng)其后第3個(gè)或者3個(gè)以上中有一個(gè)數(shù)據(jù)包被確認(rèn),則很大程度上表明該先發(fā)送的數(shù) 據(jù)包丟失,在確定第一數(shù)據(jù)包之后,查詢第一數(shù)據(jù)包之后發(fā)送的第3個(gè)或者第3個(gè)以上的數(shù) 據(jù)包,檢測這些數(shù)據(jù)包中是否存在已經(jīng)被確認(rèn)的數(shù)據(jù)包(即第二數(shù)據(jù)包可以是這些數(shù)據(jù)包 中任意一個(gè)),如果存在,則確定第一數(shù)據(jù)包丟失。
[0051] 具體地,先找到最早發(fā)送、且被重傳過、且沒有被確認(rèn)的數(shù)據(jù)包A,在如圖1所示的 數(shù)據(jù)包1。再找到兩個(gè)在A之后發(fā)送的數(shù)據(jù)包B、C,無論是否被確認(rèn)或者重傳過,在這里是 2、3。然后,如果能找到一個(gè)在B、C兩個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包D,且D已經(jīng)被SACK確認(rèn) 過。在本示例中,可能是4,也可能是7或者64或者65。一旦存在符合條件的數(shù)據(jù)包D,則 可以認(rèn)為檢測到數(shù)據(jù)包A已經(jīng)丟失。
[0052] 根據(jù)本發(fā)明實(shí)施例,當(dāng)N取值等于3時(shí),可以覆蓋TCP協(xié)議中數(shù)據(jù)包丟失的情況, 同時(shí)能夠進(jìn)一步地提高對重傳包丟失檢測的及時(shí)性。
[0053] 進(jìn)一步地,在將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收 端的同時(shí),重傳包丟失檢測方法還包括:記錄發(fā)送隊(duì)列中從未發(fā)送過的序號最小的數(shù)據(jù)包 的序號。
[0054] 在發(fā)送隊(duì)列中每個(gè)數(shù)據(jù)包都存在與其相應(yīng)的序號,在重新發(fā)送數(shù)據(jù)包時(shí),同時(shí)記 錄從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,這里從未發(fā)送過的序號最小的數(shù)據(jù)包是指在發(fā) 送隊(duì)列中一次都未發(fā)送過但即將發(fā)送的序號最小的數(shù)據(jù)包。
[0055] 具體地,如圖1所示,在發(fā)送隊(duì)列中,TCP已經(jīng)依據(jù)RFC 6675標(biāo)準(zhǔn)的快速重傳和快 速恢復(fù)算法發(fā)現(xiàn)數(shù)據(jù)包1、2、3、4、5、6、7、8、9可能已丟失,于是立即按順序重傳數(shù)據(jù)包1、2、 3、4、5、6、7、8、9,并在重傳每個(gè)數(shù)據(jù)包時(shí)記錄下此時(shí)從未發(fā)送過的序號最小的數(shù)據(jù)包的序 號,在這里是63。
[0056] 在查詢在重新發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送 的數(shù)據(jù)包之前,重傳包丟失檢測方法還包括:判斷在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí)間之 后是否存在至少N個(gè)已發(fā)送的數(shù)據(jù)包;如果判斷出在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí)間之 后存在至少N個(gè)已發(fā)送的數(shù)據(jù)包,則判斷至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號是否小于 從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,其中,如果判斷出至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包 的序號均小于從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,則查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送 的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包。
[0057] 由于在檢測第一數(shù)據(jù)包是否丟失時(shí),第一數(shù)據(jù)包之后的數(shù)據(jù)包的個(gè)數(shù)可能存在小 于N的情況,也或者重傳包的個(gè)數(shù)小于N,在查詢在重新發(fā)送第一數(shù)據(jù)包的發(fā)送時(shí)間之后發(fā) 送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包之后,可以判斷第一數(shù)據(jù)包之后的是 否還存在至少N個(gè)數(shù)據(jù)包,如果不存在,則可以采用現(xiàn)有的檢測流程;如果存在,則進(jìn)一步 判斷,判斷這些數(shù)據(jù)包中前N個(gè)數(shù)據(jù)包的序號是否小于從未發(fā)送的序號最小的數(shù)據(jù)包的序 號,如果前N個(gè)數(shù)據(jù)包的序號均小于該序號,則可以做進(jìn)一步檢測;反之,則可以采用現(xiàn)有 的檢測流程進(jìn)行檢測。
[0058] 由于現(xiàn)有技術(shù)中必須使用新的數(shù)據(jù)包才能檢測到重傳包的丟失,而本發(fā)明實(shí)施例 中,則只要存在重傳的數(shù)據(jù)包之后發(fā)送的N個(gè)數(shù)據(jù)包就可以檢測,無論是否是新數(shù)據(jù)包。本 發(fā)明實(shí)施例的重傳包丟失檢測方法可以跟現(xiàn)有的TCP流程相結(jié)合,共同對重傳包丟失進(jìn)行 檢測,具體地,可以分以下幾種情況:(1)如果存在新的數(shù)據(jù)包,而丟包之后發(fā)送的數(shù)據(jù)包 又不足N個(gè)時(shí),可以使用現(xiàn)有的算法檢測;(2)如果不存在新的數(shù)據(jù)包時(shí),丟包之后發(fā)送的 數(shù)據(jù)包又足夠N個(gè)時(shí),此時(shí)現(xiàn)有算法無法檢測到丟包,卻可以使用本發(fā)明實(shí)施例的檢測方 法;(3)如果不存在新的數(shù)據(jù)包,丟包之后發(fā)送的數(shù)據(jù)包又不足N個(gè)時(shí),此時(shí)無法檢測到丟 失;(4)如果存在新數(shù)據(jù)包,丟包之后發(fā)送的數(shù)據(jù)包又足夠N個(gè)時(shí),此時(shí)哪種算法首先滿足 則使用哪種算法檢測丟包。綜上,在現(xiàn)有算法不能檢測時(shí),可以使用新算法檢測,通過綜合 現(xiàn)有算法和新算法,較現(xiàn)有單一方案而言能在更多情況下能檢測到丟包事件。
[0059] 優(yōu)選地,從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包包括:按照發(fā)送的時(shí)間順序?qū)Πl(fā)送隊(duì)列中 所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序;從排序后的數(shù)據(jù)包中查詢已重新發(fā)送過一次的數(shù)據(jù)包;以 及按時(shí)間先后順序確定已重新發(fā)送過一次的數(shù)據(jù)包中最先發(fā)送出去并且未接收到接收端 返回的確認(rèn)信息的數(shù)據(jù)包,將最先發(fā)送出去并且未接收到接收端返回的確認(rèn)信息的數(shù)據(jù)包 作為第一數(shù)據(jù)包。
[0060] 具體地,對發(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序,將當(dāng)前發(fā)送隊(duì)列中已經(jīng)發(fā) 送的數(shù)據(jù)包按實(shí)際的發(fā)送時(shí)間排序,最早發(fā)送的在前,最晚發(fā)送的在后,例如,對于圖1中 存在的數(shù)據(jù)包,按照數(shù)據(jù)包的順序應(yīng)該是1、2、3、4、5. . . 62、63、64、65的順序,但現(xiàn)在按照 發(fā)送時(shí)間排序,于是變?yōu)?、2、、3、4、5?62、1、2、3、4、5、6、7、8、9、63、64、65的順序,如圖3所 示。由于重傳的數(shù)據(jù)包中數(shù)據(jù)包1為最先發(fā)送的數(shù)據(jù)包,如果數(shù)據(jù)包1未被確認(rèn),則將數(shù)據(jù) 包1作為第一數(shù)據(jù)包;反之,如果數(shù)據(jù)包1已經(jīng)被確認(rèn),則判斷數(shù)據(jù)包2是否被確認(rèn),數(shù)據(jù)包 2未被確認(rèn)則將數(shù)據(jù)包2作為第一數(shù)據(jù)包,依次類推,直到檢測完所有重傳的數(shù)據(jù)包為止。
[0061] 根據(jù)本發(fā)明實(shí)施例,按照時(shí)間順序,依次將重傳的數(shù)據(jù)包中較先發(fā)送且未被確認(rèn) 的數(shù)據(jù)包作為第一數(shù)據(jù)包進(jìn)行判斷,從而可以每次檢測的都是未確認(rèn)的數(shù)據(jù)包中最先發(fā)送 的數(shù)據(jù)包。
[0062] 進(jìn)一步地,在按照發(fā)送的時(shí)間順序?qū)Πl(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序之 前,本發(fā)明實(shí)施例的重傳包丟失檢測方法還包括:記錄所有已發(fā)送的數(shù)據(jù)包的發(fā)送時(shí)間,其 中,對已發(fā)送的數(shù)據(jù)包進(jìn)行排序可以是按照記錄的時(shí)間對所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序。 [0063] 從排序后的數(shù)據(jù)包中查詢已重新發(fā)送過一次的數(shù)據(jù)包包括:接收接收端返回的 ACK確認(rèn)包,該ACK確認(rèn)包攜帶有SACK選項(xiàng);根據(jù)SACK選項(xiàng)標(biāo)記發(fā)送隊(duì)列中接收端返回的 確認(rèn)信息對應(yīng)的數(shù)據(jù)包進(jìn)行標(biāo)記,將未被標(biāo)記的數(shù)據(jù)包作為待重新發(fā)送的數(shù)據(jù)包。
[0064] 在每次TCP發(fā)包時(shí),無論是重傳還是發(fā)新數(shù)據(jù)包,都記錄當(dāng)前發(fā)送時(shí)間。在TCP每 次收到ACK確認(rèn)時(shí),在TCP依據(jù)確認(rèn)包中的SACK選項(xiàng)將發(fā)送隊(duì)列中的對應(yīng)的數(shù)據(jù)包標(biāo)記為 SACK確認(rèn)。具體地,如果ACK確認(rèn)包攜帶有SACK選項(xiàng),則可以依據(jù)SACK選項(xiàng)將隊(duì)列中已經(jīng) 被SACK確認(rèn)的數(shù)據(jù)包標(biāo)記為S,然后根據(jù)快速重傳和快速恢復(fù)算法,將認(rèn)為丟失的數(shù)據(jù)包 標(biāo)記為L,并等待重傳。
[0065] 本發(fā)明實(shí)施例的重傳包丟失檢測方法可以是在現(xiàn)有TCP流程的基礎(chǔ)上增加一種 新的重傳包丟失檢測算法,不需要對包括已經(jīng)提到的Linux現(xiàn)存的重傳包丟包檢測算法在 內(nèi)的流程進(jìn)行修改。
[0066] 如圖4所示,圖4左邊所示的是現(xiàn)有的Linux內(nèi)核的TCP主要的流程:TCP收到ACK 確認(rèn)包后,依據(jù)ACK確認(rèn)包中的信息移除已被確認(rèn)的數(shù)據(jù)包,并根據(jù)SACK信息標(biāo)記發(fā)送隊(duì) 列中的數(shù)據(jù)包。隨后將被標(biāo)記為丟失的數(shù)據(jù)包重傳出去。
[0067] 圖4右側(cè)所示的為本發(fā)明實(shí)施例的重傳包丟失檢測算法流程。
[0068] 在每次TCP發(fā)包時(shí),無論是重傳還是發(fā)新數(shù)據(jù)包,都記錄當(dāng)前發(fā)送時(shí)間。在TCP每 次收到ACK確認(rèn)時(shí),TCP依據(jù)確認(rèn)包中的SACK信息將發(fā)送隊(duì)列中的對應(yīng)的數(shù)據(jù)包標(biāo)記為 SACK確認(rèn)。
[0069] 將當(dāng)前發(fā)送隊(duì)列中已經(jīng)發(fā)送的數(shù)據(jù)包按實(shí)際的發(fā)送時(shí)間排序,最早發(fā)送的在前, 最晚發(fā)送的在后,例如,對于圖1中存在的數(shù)據(jù)包,按照數(shù)據(jù)包的順序應(yīng)該是1、2、3、4、 5. · · 62、63、64、65的順序,但現(xiàn)在按照發(fā)送時(shí)間排序,于是變?yōu)?、2、、3、4、5?62、1、2、3、4、 5、6、7、8、9、63、64、65的順序,如圖3所示。
[0070] 然后,找到最早發(fā)送、且被重傳過、且沒有被確認(rèn)的數(shù)據(jù)包A,在這里是數(shù)據(jù)包1。 再找到兩個(gè)在A之后發(fā)送的數(shù)據(jù)包B、C,無論是否被確認(rèn)或者重傳過,在這里是2、3。
[0071] 最后,如果能找到一個(gè)在B、C兩個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包D,且D已經(jīng)被SACK確 認(rèn)過。在本示例中,可能是4,也可能是7或者64或者65。一旦存在符合條件的數(shù)據(jù)包D, 則可以認(rèn)為檢測到數(shù)據(jù)包A已經(jīng)丟失。
[0072] 本發(fā)明實(shí)施例還提供了一種重傳包丟失檢測裝置。該裝置可以通過計(jì)算機(jī)設(shè)備實(shí) 現(xiàn)其功能。需要說明的是,本發(fā)明實(shí)施例的重傳包丟失檢測裝置可以用于執(zhí)行本發(fā)明實(shí)施 例所提供的重傳包丟失檢測方法,本發(fā)明實(shí)施例的重傳包丟失檢測方法也可以通過本發(fā)明 實(shí)施例所提供的重傳包丟失檢測裝置來執(zhí)行。
[0073] 圖5是根據(jù)本發(fā)明實(shí)施例的重傳包丟失檢測裝置的示意圖。如圖5所示,該重傳 包丟失檢測裝置包括:發(fā)送單元10、第一確定單元20、檢測單元30和第二確定單元40。
[0074] 發(fā)送單元10用于將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至 接收端,其中,接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包。
[0075] 基于TCP協(xié)議的發(fā)送隊(duì)列可以是TCP維護(hù)一個(gè)發(fā)送隊(duì)列,該隊(duì)列內(nèi)可以包含所有 已經(jīng)發(fā)送出去但還沒收到累積確認(rèn)的數(shù)據(jù)包和等待發(fā)送出去的數(shù)據(jù)包(例如已經(jīng)發(fā)送卻 丟失的待重新發(fā)送的數(shù)據(jù)包),并且在每次收到累積確認(rèn)(ACK)時(shí)將已經(jīng)被累積確認(rèn)的數(shù) 據(jù)包移出該隊(duì)列。同時(shí),如果ACK確認(rèn)包中包含SACK信息,則可以依據(jù)SACK信息將隊(duì)列中 已經(jīng)被SACK確認(rèn)的數(shù)據(jù)包標(biāo)記為S,然后根據(jù)快速重傳和快速恢復(fù)算法,將認(rèn)為丟失的數(shù) 據(jù)包標(biāo)記為L,并等待重傳。而當(dāng)真正重傳數(shù)據(jù)包時(shí),將需要重傳的數(shù)據(jù)包標(biāo)記為R。這里 的待重新發(fā)送的數(shù)據(jù)包是指在進(jìn)行TCP傳輸時(shí),已經(jīng)發(fā)送一次卻丟失的數(shù)據(jù)包,該數(shù)據(jù)包 需要重新發(fā)送至接收端。接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包。
[0076] 具體地,接收端向發(fā)送端發(fā)送數(shù)據(jù)請求,發(fā)送端響應(yīng)該數(shù)據(jù)請求,并將接收端所請 求的數(shù)據(jù)包通過網(wǎng)絡(luò)發(fā)送至接收端,接收端接收到數(shù)據(jù)包之后,向發(fā)送端返回確認(rèn)信息,以 告知發(fā)送端已經(jīng)接收到數(shù)據(jù)包。由于網(wǎng)絡(luò)中容易受到干擾或者一些不穩(wěn)定因素的影響,導(dǎo) 致數(shù)據(jù)包丟失。此時(shí),需要重新向接收端發(fā)送丟失的數(shù)據(jù)包。在重新發(fā)送之后,如果接收端 接收到重新發(fā)送的數(shù)據(jù)包,依然會向發(fā)送端返回確認(rèn)信息。
[0077] 第一確定單元20用于從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包,其中,第一數(shù)據(jù)包為未收到 接收端返回第一確認(rèn)信息的已重新發(fā)送過一次的數(shù)據(jù)包,第一確認(rèn)信息為接收端在接收到 第一數(shù)據(jù)包時(shí)返回的確認(rèn)信息。
[0078] 由于TCP協(xié)議中接收端接收到的并非按序發(fā)送的數(shù)據(jù)包(即先發(fā)送的后接收到, 后發(fā)送的先接收到),這樣會導(dǎo)致接收端可能先收到后發(fā)送的數(shù)據(jù)包的確認(rèn)信息,先發(fā)送的 數(shù)據(jù)包可能是因?yàn)閬G失或者是到達(dá)接收端的時(shí)間晚于后發(fā)送的數(shù)據(jù)包。從發(fā)送隊(duì)列中確定 第一數(shù)據(jù)包,即未接收到接收端返回確認(rèn)信息且重新發(fā)送過一次的數(shù)據(jù)包,該數(shù)據(jù)包可以 是重新發(fā)送過一次的數(shù)據(jù)包中最早發(fā)送但是未被確認(rèn)的數(shù)據(jù)包,以便于從重新發(fā)送的數(shù)據(jù) 包中按時(shí)間順序優(yōu)先判斷較早發(fā)送的數(shù)據(jù)包是否再次丟失。
[0079] 檢測單元30用于檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包 對應(yīng)的第二確認(rèn)信息,其中,第二數(shù)據(jù)包為發(fā)送隊(duì)列中在第一數(shù)據(jù)包之后發(fā)送的第N個(gè)及 第N個(gè)以后的任意一個(gè)數(shù)據(jù)包,第二確認(rèn)信息為接收端在接收到第二數(shù)據(jù)包時(shí)返回的確認(rèn) 信息。
[0080] 第二確定單元40用于如果檢測出在發(fā)送第一數(shù)據(jù)包之后接收到第二確認(rèn)信息, 則確定第一數(shù)據(jù)包丟失。
[0081] 在發(fā)送第一數(shù)據(jù)包之后,發(fā)送端還需要發(fā)送剩下待重新發(fā)送的數(shù)據(jù)包和新的數(shù)據(jù) 包。在發(fā)送完第一數(shù)據(jù)包之后,可以對接收到的確認(rèn)信息進(jìn)行檢測,以檢測是否接收到第 一數(shù)據(jù)包之后第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包的確認(rèn)信息。其中,N為預(yù)設(shè)值,可以 根據(jù)實(shí)際情況進(jìn)行設(shè)置,也可以根據(jù)TCP傳輸協(xié)議中的屬性進(jìn)行設(shè)置,例如,基于TCP協(xié)議 傳輸?shù)臄?shù)據(jù)包通常不會晚于3個(gè)以后發(fā)送的數(shù)據(jù)包,因此,這里的N值可以是大于或者等于 3的值,即第二數(shù)據(jù)包可以是第一數(shù)據(jù)包之后的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包,其 中,當(dāng)N等于3時(shí)可以涵蓋TCP中大部分的重傳包丟失檢測。
[0082] 具體地,在當(dāng)需要檢測第一數(shù)據(jù)包是否丟失時(shí),可以檢測在第一數(shù)據(jù)包之后,相隔 預(yù)設(shè)值及其之后的數(shù)據(jù)包是否已經(jīng)確認(rèn)被接收端接收到。如圖1所示,當(dāng)數(shù)據(jù)包1至9為 已重新發(fā)送的數(shù)據(jù)包時(shí),首先,按照時(shí)間順序確定數(shù)據(jù)包1為未被確認(rèn)的數(shù)據(jù)包,檢測數(shù)據(jù) 包1是否丟失可以通過判斷數(shù)據(jù)包4或者數(shù)據(jù)包4之后的數(shù)據(jù)包(例如,數(shù)據(jù)包7或者數(shù) 據(jù)包63、64等)是否被確認(rèn),即是否接收到接收端返回的確認(rèn)信息,如果已接收到接收端返 回的確認(rèn)信息,則認(rèn)為數(shù)據(jù)包1丟失。依次類推,判斷所有已經(jīng)重新發(fā)送過一次的數(shù)據(jù)包是 否丟失,從而無需等到接收到新的數(shù)據(jù)包的確認(rèn)信息時(shí),才確定重發(fā)的數(shù)據(jù)包丟失。
[0083] 根據(jù)本發(fā)明實(shí)施例,將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送 至接收端,從發(fā)送隊(duì)列中確定第一數(shù)據(jù)包即為未被確認(rèn)且已經(jīng)重新發(fā)送過一次的數(shù)據(jù)包, 檢測在發(fā)送第一數(shù)據(jù)包之后是否接收到發(fā)送隊(duì)列中第二數(shù)據(jù)包的第二確認(rèn)信息即第一數(shù) 據(jù)包之后的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包的確認(rèn)信息,如果檢測出在發(fā)送第一數(shù) 據(jù)包之后接收到第二確認(rèn)信息,則確定第一數(shù)據(jù)包丟失,通過增加對重傳數(shù)據(jù)包之后的發(fā) 送的數(shù)據(jù)包確認(rèn)信息的檢測,無需等到接收到新的數(shù)據(jù)包的確認(rèn)信息時(shí),才確定重發(fā)的數(shù) 據(jù)包丟失,從而可以及時(shí)檢測重傳包是否丟失,解決了現(xiàn)有技術(shù)中無法及時(shí)確定重傳的數(shù) 據(jù)包是否丟失的問題,達(dá)到了及時(shí)確定丟失的重傳包的效果。
[0084] 在確定重傳包丟失之后,可以立即重傳丟失的重傳包,也可以根據(jù)需要選擇現(xiàn)有 的TCP處理流程。
[0085] 需要說明的是,在本發(fā)明實(shí)施例的重傳包丟失檢測裝置可以應(yīng)用于有線網(wǎng)中數(shù)據(jù) 包的傳輸,也可以用于無線網(wǎng)絡(luò)中的數(shù)據(jù)包傳輸。由于無線網(wǎng)絡(luò)(比如2G、3G、4G、WI-FI網(wǎng) 絡(luò))環(huán)境下,一方面,由于無線網(wǎng)絡(luò)的電磁波信號易受干擾和不穩(wěn)定特性,導(dǎo)致鏈路丟包率 較高,所以重傳的數(shù)據(jù)包又一次丟失的情況很容易出現(xiàn);另一方面,在像4G和Wi-Fi這種高 速傳輸?shù)拇髱捑W(wǎng)絡(luò)環(huán)境中,TCP-次就會傳輸幾十、幾百個(gè)數(shù)據(jù)包,所以其中由于丟包產(chǎn) 生的重傳包也會很多,因此,本發(fā)明實(shí)施例的重傳包丟失檢測裝置應(yīng)用于無線網(wǎng)絡(luò)其效果 更加顯著。
[0086] 優(yōu)選地,N為系統(tǒng)預(yù)設(shè)值,N的值大于或者等于3,其中,檢測單元包括:第一查詢模 塊,用于查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù) 包;檢測模塊,用于檢測是否接收到第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包對應(yīng)的 確認(rèn)信息。
[0087] 在TCP協(xié)議中,通常要求先發(fā)送的數(shù)據(jù)包不晚于在其后發(fā)送的3個(gè)數(shù)據(jù)包達(dá)到接 收端,當(dāng)其后第3個(gè)或者3個(gè)以上中有一個(gè)數(shù)據(jù)包被確認(rèn),則很大程度上表明該先發(fā)送的數(shù) 據(jù)包丟失,在確定第一數(shù)據(jù)包之后,查詢第一數(shù)據(jù)包之后發(fā)送的第3個(gè)或者第3個(gè)以上的數(shù) 據(jù)包,檢測這些數(shù)據(jù)包中是否存在已經(jīng)被確認(rèn)的數(shù)據(jù)包(即第二數(shù)據(jù)包可以是這些數(shù)據(jù)包 中任意一個(gè)),如果存在,則確定第一數(shù)據(jù)包丟失。
[0088] 具體地,先找到最早發(fā)送、且被重傳過、且沒有被確認(rèn)的數(shù)據(jù)包A,在如圖1所示的 數(shù)據(jù)包1。再找到兩個(gè)在A之后發(fā)送的數(shù)據(jù)包B、C,無論是否被確認(rèn)或者重傳過,在這里是 2、 3。然后,如果能找到一個(gè)在B、C兩個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包D,且D已經(jīng)被SACK確認(rèn) 過。在本示例中,可能是4,也可能是7或者64或者65。一旦存在符合條件的數(shù)據(jù)包D,則 可以認(rèn)為檢測到數(shù)據(jù)包A已經(jīng)丟失。
[0089] 根據(jù)本發(fā)明實(shí)施例,當(dāng)N取值等于3時(shí),可以覆蓋TCP協(xié)議中數(shù)據(jù)包丟失的情況, 同時(shí)能夠進(jìn)一步地提高對重傳包丟失檢測的及時(shí)性。
[0090] 進(jìn)一步地,重傳包丟失檢測裝置還包括:第一記錄單元,用于在將基于TCP協(xié)議傳 輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端的同時(shí),記錄發(fā)送隊(duì)列中從未發(fā)送過的 序號最小的數(shù)據(jù)包的序號。
[0091] 在發(fā)送隊(duì)列中每個(gè)數(shù)據(jù)包都存在與其相應(yīng)的序號,在重新發(fā)送數(shù)據(jù)包時(shí),同時(shí)記 錄從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,這里從未發(fā)送過的序號最小的數(shù)據(jù)包是指在發(fā) 送隊(duì)列中一次都未發(fā)送過但即將發(fā)送的序號最小的數(shù)據(jù)包。
[0092] 具體地,如圖1所示,在發(fā)送隊(duì)列中,TCP已經(jīng)依據(jù)RFC 6675標(biāo)準(zhǔn)的快速重傳和快 速恢復(fù)算法發(fā)現(xiàn)數(shù)據(jù)包1、2、3、4、5、6、7、8、9可能已丟失,于是立即按順序重傳數(shù)據(jù)包1、2、 3、 4、5、6、7、8、9,并在重傳每個(gè)數(shù)據(jù)包時(shí)記錄下此時(shí)從未發(fā)送過的序號最小的數(shù)據(jù)包的序 號,在這里是63。
[0093] 第一判斷單元,用于在查詢在發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè) 數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包之前,判斷在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí)間之后是否存在至 少N個(gè)已發(fā)送的數(shù)據(jù)包;第二判斷單元,用于當(dāng)判斷出在發(fā)送隊(duì)列中第一數(shù)據(jù)包的發(fā)送時(shí) 間之后存在至少N個(gè)已發(fā)送的數(shù)據(jù)包時(shí),判斷至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號是否 小于從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,其中,第一查詢模塊還用于當(dāng)判斷出至少N 個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號均小于從未發(fā)送過的序號最小的數(shù)據(jù)包的序號時(shí),查詢在 發(fā)送第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包。
[0094] 由于在檢測第一數(shù)據(jù)包是否丟失時(shí),第一數(shù)據(jù)包之后的數(shù)據(jù)包的個(gè)數(shù)可能存在小 于N的情況,也或者重傳包的個(gè)數(shù)小于N,在查詢在重新發(fā)送第一數(shù)據(jù)包的發(fā)送時(shí)間之后發(fā) 送的第N個(gè)數(shù)據(jù)包及第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包之后,可以判斷第一數(shù)據(jù)包之后的是 否還存在至少N個(gè)數(shù)據(jù)包,如果不存在,則可以采用現(xiàn)有的檢測流程;如果存在,則進(jìn)一步 判斷,判斷這些數(shù)據(jù)包中前N個(gè)數(shù)據(jù)包的序號是否小于從未發(fā)送的序號最小的數(shù)據(jù)包的序 號,如果前N個(gè)數(shù)據(jù)包的序號均小于該序號,則可以做進(jìn)一步檢測;反之,則可以采用現(xiàn)有 的檢測流程進(jìn)行檢測。
[0095] 由于現(xiàn)有技術(shù)中必須使用新的數(shù)據(jù)包才能檢測到重傳包的丟失,而本發(fā)明實(shí)施例 中,則只要存在重傳的數(shù)據(jù)包之后發(fā)送的N個(gè)數(shù)據(jù)包就可以檢測,無論是否是新數(shù)據(jù)包。本 發(fā)明實(shí)施例的重傳包丟失檢測裝置可以跟現(xiàn)有的TCP流程相結(jié)合,共同對重傳包丟失進(jìn)行 檢測,具體地,可以分以下幾種情況:(1)如果存在新的數(shù)據(jù)包,而丟包之后發(fā)送的數(shù)據(jù)包 又不足N個(gè)時(shí),可以使用現(xiàn)有的算法檢測;(2)如果不存在新的數(shù)據(jù)包時(shí),丟包之后發(fā)送的 數(shù)據(jù)包又足夠N個(gè)時(shí),此時(shí)現(xiàn)有算法無法檢測到丟包,卻可以使用本發(fā)明實(shí)施例的檢測裝 置;(3)如果不存在新的數(shù)據(jù)包,丟包之后發(fā)送的數(shù)據(jù)包又不足N個(gè)時(shí),此時(shí)無法檢測到丟 失;(4)如果存在新數(shù)據(jù)包,丟包之后發(fā)送的數(shù)據(jù)包又足夠N個(gè)時(shí),此時(shí)哪種算法首先滿足 則使用哪種算法檢測丟包。綜上,在現(xiàn)有算法不能檢測時(shí),可以使用新算法檢測,通過綜合 現(xiàn)有算法和新算法,較現(xiàn)有單一方案而言能在更多情況下能檢測到丟包事件。
[0096] 優(yōu)選地,第一確定單元包括:排序模塊,用于按照發(fā)送的時(shí)間順序?qū)Πl(fā)送隊(duì)列中所 有已發(fā)送的數(shù)據(jù)包進(jìn)行排序;第二查詢模塊,用于從排序后的數(shù)據(jù)包中查詢已重新發(fā)送過 一次的數(shù)據(jù)包;以及確定模塊,用于按時(shí)間先后順序確定已重新發(fā)送過一次的數(shù)據(jù)包中最 先發(fā)送出去并且未接收到接收端返回的確認(rèn)信息的數(shù)據(jù)包,將最先發(fā)送出去并且未接收到 接收端返回的確認(rèn)信息的數(shù)據(jù)包作為第一數(shù)據(jù)包。
[0097] 具體地,對發(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序,將當(dāng)前發(fā)送隊(duì)列中已經(jīng)發(fā) 送的數(shù)據(jù)包按實(shí)際的發(fā)送時(shí)間排序,最早發(fā)送的在前,最晚發(fā)送的在后,例如,對于圖1中 存在的數(shù)據(jù)包,按照數(shù)據(jù)包的順序應(yīng)該是1、2、3、4、5. . . 62、63、64、65的順序,但現(xiàn)在按照 發(fā)送時(shí)間排序,于是變?yōu)?、2、、3、4、5?62、1、2、3、4、5、6、7、8、9、63、64、65的順序,如圖3所 示。由于重傳的數(shù)據(jù)包中數(shù)據(jù)包1為最先發(fā)送的數(shù)據(jù)包,如果數(shù)據(jù)包1未被確認(rèn),則將數(shù)據(jù) 包1作為第一數(shù)據(jù)包;反之,如果數(shù)據(jù)包1已經(jīng)被確認(rèn),則判斷數(shù)據(jù)包2是否被確認(rèn),數(shù)據(jù)包 2未被確認(rèn)則將數(shù)據(jù)包2作為第一數(shù)據(jù)包,依次類推,直到檢測完所有重傳的數(shù)據(jù)包為止。 [0098] 根據(jù)本發(fā)明實(shí)施例,按照時(shí)間順序,依次將重傳的數(shù)據(jù)包中較先發(fā)送且未被確認(rèn) 的數(shù)據(jù)包作為第一數(shù)據(jù)包進(jìn)行判斷,從而可以每次檢測的都是未確認(rèn)的數(shù)據(jù)包中最先發(fā)送 的數(shù)據(jù)包。
[0099] 進(jìn)一步地,重傳包丟失檢測裝置還包括:第二記錄單元,用于按照發(fā)送的時(shí)間順序 對發(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序之前,記錄所有已發(fā)送的數(shù)據(jù)包的發(fā)送時(shí)間, 其中,按照記錄的時(shí)間對所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序,第二查詢模塊包括:接收子模塊, 用于接收接收端返回的ACK確認(rèn)包,ACK確認(rèn)包攜帶有SACK選項(xiàng);標(biāo)記子模塊,用于根據(jù) SACK選項(xiàng)標(biāo)記發(fā)送隊(duì)列中接收端返回的確認(rèn)信息對應(yīng)的數(shù)據(jù)包,將未被標(biāo)記的數(shù)據(jù)包作為 待重新發(fā)送的數(shù)據(jù)包。
[0100] 從排序后的數(shù)據(jù)包中查詢已重新發(fā)送過一次的數(shù)據(jù)包包括:接收接收端返回的 ACK確認(rèn)包,該ACK確認(rèn)包攜帶有SACK選項(xiàng);根據(jù)SACK選項(xiàng)標(biāo)記發(fā)送隊(duì)列中接收端返回的 確認(rèn)信息對應(yīng)的數(shù)據(jù)包進(jìn)行標(biāo)記,將未被標(biāo)記的數(shù)據(jù)包作為待重新發(fā)送的數(shù)據(jù)包。
[0101] 在每次TCP發(fā)包時(shí),無論是重傳還是發(fā)新數(shù)據(jù)包,都記錄當(dāng)前發(fā)送時(shí)間。在TCP每 次收到ACK確認(rèn)時(shí),在TCP依據(jù)確認(rèn)包中的SACK選項(xiàng)將發(fā)送隊(duì)列中的對應(yīng)的數(shù)據(jù)包標(biāo)記為 SACK確認(rèn)。具體地,如果ACK確認(rèn)包攜帶有SACK選項(xiàng),則可以依據(jù)SACK選項(xiàng)將隊(duì)列中已經(jīng) 被SACK確認(rèn)的數(shù)據(jù)包標(biāo)記為S,然后根據(jù)快速重傳和快速恢復(fù)算法,將認(rèn)為丟失的數(shù)據(jù)包 標(biāo)記為L,并等待重傳。
[0102] 需要說明的是,對于前述的各方法實(shí)施例,為了簡單描述,故將其都表述為一系列 的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動(dòng)作順序的限制,因?yàn)?依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知 悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作和模塊并不一定是本發(fā)明 所必須的。
[0103] 在上述實(shí)施例中,對各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒有詳述的部 分,可以參見其他實(shí)施例的相關(guān)描述。
[0104] 在本申請所提供的幾個(gè)實(shí)施例中,應(yīng)該理解到,所揭露的裝置,可通過其它的方式 實(shí)現(xiàn)。例如,以上所描述的裝置實(shí)施例僅僅是示意性的,例如所述單元的劃分,僅僅為一種 邏輯功能劃分,實(shí)際實(shí)現(xiàn)時(shí)可以有另外的劃分方式,例如多個(gè)單元或組件可以結(jié)合或者可 以集成到另一個(gè)系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點(diǎn),所顯示或討論的相互之間 的耦合或直接耦合或通信連接可以是通過一些接口,裝置或單元的間接耦合或通信連接, 可以是電性或其它的形式。
[0105] 所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯 示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè) 網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部單元來實(shí)現(xiàn)本實(shí)施例方案的目 的。
[0106] 另外,在本發(fā)明各個(gè)實(shí)施例中的各功能單元可以集成在一個(gè)處理單元中,也可以 是各個(gè)單元單獨(dú)物理存在,也可以兩個(gè)或兩個(gè)以上單元集成在一個(gè)單元中。上述集成的單 元既可以采用硬件的形式實(shí)現(xiàn),也可以采用軟件功能單元的形式實(shí)現(xiàn)。
[0107] 所述集成的單元如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用 時(shí),可以存儲在一個(gè)計(jì)算機(jī)可讀取存儲介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì) 上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形 式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲在一個(gè)存儲介質(zhì)中,包括若干指令用以使得一臺計(jì)算 機(jī)設(shè)備(可為個(gè)人計(jì)算機(jī)、移動(dòng)終端、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所 述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機(jī)存取存儲器(RAM, Random Access Memory)、移動(dòng)硬盤、磁碟或者光盤等各種 可以存儲程序代碼的介質(zhì)。
[0108] 以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技 術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修 改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1. 一種用于TCP協(xié)議的重傳包丟失檢測方法,其特征在于,包括: 將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端,其中,所述接 收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包; 從所述發(fā)送隊(duì)列中確定第一數(shù)據(jù)包,其中,所述第一數(shù)據(jù)包為未收到所述接收端返回 第一確認(rèn)信息的已重新發(fā)送過一次的數(shù)據(jù)包,所述第一確認(rèn)信息為所述接收端在接收到所 述第一數(shù)據(jù)包時(shí)返回的確認(rèn)信息; 檢測在發(fā)送所述第一數(shù)據(jù)包之后是否接收到所述發(fā)送隊(duì)列中第二數(shù)據(jù)包對應(yīng)的第二 確認(rèn)信息,其中,所述第二數(shù)據(jù)包為所述發(fā)送隊(duì)列中在所述第一數(shù)據(jù)包之后發(fā)送的第N個(gè) 及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包,所述第二確認(rèn)信息為所述接收端在接收到所述第二數(shù)據(jù) 包時(shí)返回的確認(rèn)信息;以及 如果檢測出在發(fā)送所述第一數(shù)據(jù)包之后接收到所述第二確認(rèn)信息,則確定所述第一數(shù) 據(jù)包丟失。
2. 根據(jù)權(quán)利要求1所述的重傳包丟失檢測方法,其特征在于,所述N為系統(tǒng)預(yù)設(shè)值,所 述N的值大于或者等于3,其中,檢測在發(fā)送所述第一數(shù)據(jù)包之后是否接收到所述發(fā)送隊(duì)列 中第二數(shù)據(jù)包對應(yīng)的第二確認(rèn)信息包括: 查詢在發(fā)送所述第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及所述第N個(gè)數(shù)據(jù)包之后發(fā)送的 數(shù)據(jù)包; 檢測是否接收到所述第N個(gè)數(shù)據(jù)包及所述第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包對應(yīng)的確認(rèn) 信息。
3. 根據(jù)權(quán)利要求2所述的重傳包丟失檢測方法,其特征在于, 在將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收端的同時(shí),所述 重傳包丟失檢測方法還包括:記錄所述發(fā)送隊(duì)列中從未發(fā)送過的序號最小的數(shù)據(jù)包的序 號, 在查詢在發(fā)送所述第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及所述第N個(gè)數(shù)據(jù)包之后發(fā)送 的數(shù)據(jù)包之前,所述重傳包丟失檢測方法還包括:判斷在所述發(fā)送隊(duì)列中所述第一數(shù)據(jù)包 的發(fā)送時(shí)間之后是否存在至少N個(gè)已發(fā)送的數(shù)據(jù)包;如果判斷出在所述發(fā)送隊(duì)列中所述第 一數(shù)據(jù)包的發(fā)送時(shí)間之后存在至少N個(gè)已發(fā)送的數(shù)據(jù)包,則判斷所述至少N個(gè)數(shù)據(jù)包的前 N個(gè)數(shù)據(jù)包的序號是否小于所述從未發(fā)送過的序號最小的數(shù)據(jù)包的序號,其中,如果判斷出 所述至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號均小于所述從未發(fā)送過的序號最小的數(shù)據(jù)包的 序號,則查詢在發(fā)送所述第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及所述第N個(gè)數(shù)據(jù)包之后發(fā) 送的數(shù)據(jù)包。
4. 根據(jù)權(quán)利要求1所述的重傳包丟失檢測方法,其特征在于,從所述發(fā)送隊(duì)列中確定 第一數(shù)據(jù)包包括: 按照發(fā)送的時(shí)間順序?qū)λ霭l(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序; 從排序后的數(shù)據(jù)包中查詢所述已重新發(fā)送過一次的數(shù)據(jù)包;以及 按時(shí)間先后順序確定所述已重新發(fā)送過一次的數(shù)據(jù)包中最先發(fā)送出去并且未接收到 所述接收端返回的確認(rèn)信息的數(shù)據(jù)包,將所述最先發(fā)送出去并且未接收到所述接收端返回 的確認(rèn)信息的數(shù)據(jù)包作為所述第一數(shù)據(jù)包。
5. 根據(jù)權(quán)利要求4所述的重傳包丟失檢測方法,其特征在于, 按照發(fā)送的時(shí)間順序?qū)λ霭l(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序之前,重傳包丟 失檢測方法還包括:記錄所述所有已發(fā)送的數(shù)據(jù)包的發(fā)送時(shí)間,其中,按照記錄的時(shí)間對所 述所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序, 從排序后的數(shù)據(jù)包中查詢所述已重新發(fā)送過一次的數(shù)據(jù)包包括:接收所述接收端返回 的ACK確認(rèn)包,所述ACK確認(rèn)包攜帶有SACK選項(xiàng);根據(jù)所述SACK選項(xiàng)標(biāo)記所述發(fā)送隊(duì)列中 所述接收端返回的確認(rèn)信息對應(yīng)的數(shù)據(jù)包,將未被標(biāo)記的數(shù)據(jù)包作為所述待重新發(fā)送的數(shù) 據(jù)包。
6. -種用于TCP協(xié)議的重傳包丟失檢測裝置,其特征在于,包括: 發(fā)送單元,用于將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至接收 端,其中,所述接收端用于接收基于TCP協(xié)議傳輸?shù)臄?shù)據(jù)包; 第一確定單元,用于從所述發(fā)送隊(duì)列中確定第一數(shù)據(jù)包,其中,所述第一數(shù)據(jù)包為未收 到所述接收端返回第一確認(rèn)信息的已重新發(fā)送過一次的數(shù)據(jù)包,所述第一確認(rèn)信息為所述 接收端在接收到所述第一數(shù)據(jù)包時(shí)返回的確認(rèn)信息; 檢測單元,用于檢測在發(fā)送所述第一數(shù)據(jù)包之后是否接收到所述發(fā)送隊(duì)列中第二數(shù)據(jù) 包對應(yīng)的第二確認(rèn)信息,其中,所述第二數(shù)據(jù)包為所述發(fā)送隊(duì)列中在所述第一數(shù)據(jù)包之后 發(fā)送的第N個(gè)及第N個(gè)以后的任意一個(gè)數(shù)據(jù)包,所述第二確認(rèn)信息為所述接收端在接收到 所述第二數(shù)據(jù)包時(shí)返回的確認(rèn)信息;以及 第二確定單元,用于如果檢測出在發(fā)送所述第一數(shù)據(jù)包之后接收到所述第二確認(rèn)信 息,則確定所述第一數(shù)據(jù)包丟失。
7. 根據(jù)權(quán)利要求6所述的重傳包丟失檢測裝置,其特征在于,所述N為系統(tǒng)預(yù)設(shè)值,所 述N的值大于或者等于3,其中,所述檢測單元包括: 第一查詢模塊,用于查詢在發(fā)送所述第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及所述第N 個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包; 檢測模塊,用于檢測是否接收到所述第N個(gè)數(shù)據(jù)包及所述第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù) 據(jù)包對應(yīng)的確認(rèn)信息。
8. 根據(jù)權(quán)利要求7所述的重傳包丟失檢測裝置,其特征在于,所述重傳包丟失檢測裝 置還包括: 第一記錄單元,用于在將基于TCP協(xié)議傳輸?shù)陌l(fā)送隊(duì)列中待重新發(fā)送的數(shù)據(jù)包發(fā)送至 接收端的同時(shí),記錄所述發(fā)送隊(duì)列中從未發(fā)送過的序號最小的數(shù)據(jù)包的序號; 第一判斷單元,用于在查詢在發(fā)送所述第一數(shù)據(jù)包之后發(fā)送的第N個(gè)數(shù)據(jù)包及所述第 N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包之前,判斷在所述發(fā)送隊(duì)列中所述第一數(shù)據(jù)包的發(fā)送時(shí)間之 后是否存在至少N個(gè)已發(fā)送的數(shù)據(jù)包; 第二判斷單元,用于當(dāng)判斷出在所述發(fā)送隊(duì)列中所述第一數(shù)據(jù)包的發(fā)送時(shí)間之后存在 至少N個(gè)已發(fā)送的數(shù)據(jù)包時(shí),判斷所述至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號是否小于所 述從未發(fā)送過的序號最小的數(shù)據(jù)包的序號, 其中,第一查詢模塊還用于當(dāng)判斷出所述至少N個(gè)數(shù)據(jù)包的前N個(gè)數(shù)據(jù)包的序號均小 于所述從未發(fā)送過的序號最小的數(shù)據(jù)包的序號時(shí),查詢在發(fā)送所述第一數(shù)據(jù)包之后發(fā)送的 第N個(gè)數(shù)據(jù)包及所述第N個(gè)數(shù)據(jù)包之后發(fā)送的數(shù)據(jù)包。
9. 根據(jù)權(quán)利要求6所述的重傳包丟失檢測裝置,其特征在于,所述第一確定單元包括: 排序模塊,用于按照發(fā)送的時(shí)間順序?qū)λ霭l(fā)送隊(duì)列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排 序; 第二查詢模塊,用于從排序后的數(shù)據(jù)包中查詢所述已重新發(fā)送過一次的數(shù)據(jù)包;以及 確定模塊,用于按時(shí)間先后順序確定所述已重新發(fā)送過一次的數(shù)據(jù)包中最先發(fā)送出去 并且未接收到所述接收端返回的確認(rèn)信息的數(shù)據(jù)包,將所述最先發(fā)送出去并且未接收到所 述接收端返回的確認(rèn)信息的數(shù)據(jù)包作為所述第一數(shù)據(jù)包。
10.根據(jù)權(quán)利要求9所述的重傳包丟失檢測裝置,其特征在于, 重傳包丟失檢測裝置還包括:第二記錄單元,用于按照發(fā)送的時(shí)間順序?qū)λ霭l(fā)送隊(duì) 列中所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序之前,記錄所述所有已發(fā)送的數(shù)據(jù)包的發(fā)送時(shí)間,其中, 按照記錄的時(shí)間對所述所有已發(fā)送的數(shù)據(jù)包進(jìn)行排序, 所述第二查詢模塊包括:接收子模塊,用于接收所述接收端返回的ACK確認(rèn)包,所述 ACK確認(rèn)包攜帶有SACK選項(xiàng);標(biāo)記子模塊,用于根據(jù)所述SACK選項(xiàng)標(biāo)記所述發(fā)送隊(duì)列中所 述接收端返回的確認(rèn)信息對應(yīng)的數(shù)據(jù)包,將未被標(biāo)記的數(shù)據(jù)包作為所述待重新發(fā)送的數(shù)據(jù) 包。
【文檔編號】H04L1/16GK104104480SQ201410375443
【公開日】2014年10月15日 申請日期:2014年7月31日 優(yōu)先權(quán)日:2014年7月31日
【發(fā)明者】李易 申請人:北京藍(lán)汛通信技術(shù)有限責(zé)任公司