精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節(jié)一面:如何用 UDP 實現(xiàn)可靠傳輸?

開發(fā) 前端
實現(xiàn)的思路確實這樣沒錯,但是有沒有想過,既然 TCP 天然支持可靠傳輸,為什么還需要基于 UDP 實現(xiàn)可靠傳輸呢?這不是重復造輪子嗎?

大家好,我是小林。

我記得之前在群里看到,有位讀者字節(jié)一面的時候被問到:「如何基于 UDP 協(xié)議實現(xiàn)可靠傳輸?」

很多同學第一反應就會說把 TCP 可靠傳輸?shù)奶匦?序列號、確認應答、超時重傳、流量控制、擁塞控制)在應用層實現(xiàn)一遍。

實現(xiàn)的思路確實這樣沒錯,但是有沒有想過,既然 TCP 天然支持可靠傳輸,為什么還需要基于 UDP 實現(xiàn)可靠傳輸呢?這不是重復造輪子嗎?

所以,我們要先弄清楚 TCP 協(xié)議有哪些痛點?而這些痛點是否可以在基于 UDP 協(xié)議實現(xiàn)的可靠傳輸協(xié)議中得到改進?

在之前這篇文章:??TCP 就沒什么缺陷嗎?????,我已經(jīng)說了 TCP 協(xié)議四個方面的缺陷:

  • 升級 TCP 的工作很困難;
  • TCP 建立連接的延遲;
  • TCP 存在隊頭阻塞問題;
  • 網(wǎng)絡遷移需要重新建立 TCP 連接;

現(xiàn)在市面上已經(jīng)有基于 UDP 協(xié)議實現(xiàn)的可靠傳輸協(xié)議的成熟方案了,那就是 QUIC 協(xié)議,已經(jīng)應用在了 HTTP/3。

這次,聊聊 QUIC 是如何實現(xiàn)可靠傳輸?shù)?又是如何解決上面 TCP 協(xié)議四個方面的缺陷?

QUIC 是如何實現(xiàn)可靠傳輸?shù)?

要基于 UDP 實現(xiàn)的可靠傳輸協(xié)議,那么就要在應用層下功夫,也就是要設計好協(xié)議的頭部字段。

拿 HTTP/3 舉例子,在 UDP 報文頭部與 HTTP 消息之間,共有 3 層頭部:

整體看的視角是這樣的:

接下來,分別對每一個 Header 做個介紹。

Packet Header

Packet Header 首次建立連接時和日常傳輸數(shù)據(jù)時使用的 Header 是不同的。如下圖,注意我沒有把 Header 所有字段都畫出來,只是畫出了重要的字段:

Packet Header

細分這兩種:

  • Long Packet Header 用于首次建立連接。
  • Short Packet Header 用于日常傳輸數(shù)據(jù)。

QUIC 也是需要三次握手來建立連接的,主要目的是為了確定連接 ID。

建立連接時,連接 ID 是由服務器根據(jù)客戶端的 Source Connection ID 字段生成的,這樣后續(xù)傳輸時,雙方只需要固定住 Destination Connection ID(連接 ID ),從而實現(xiàn)連接遷移功能。所以,你可以看到日常傳輸數(shù)據(jù)的 Short Packet Header 不需要在傳輸 Source Connection ID 字段了。

Short Packet Header 中的 Packet Number 是每個報文獨一無二的編號,它是嚴格遞增的,也就是說就算 Packet N 丟失了,重傳的 Packet N 的 Packet Number 已經(jīng)不是 N,而是一個比 N 大的值。

為什么要這么設計呢?

我們先來看看 TCP 的問題,TCP 在重傳報文時的序列號和原始報文的序列號是一樣的,也正是由于這個特性,引入了 TCP 重傳的歧義問題。

TCP 重傳的歧義問題

比如上圖,當 TCP 發(fā)生超時重傳后,客戶端發(fā)起重傳,然后接收到了服務端確認 ACK 。由于客戶端原始報文和重傳報文序列號都是一樣的,那么服務端針對這兩個報文回復的都是相同的 ACK。

這樣的話,客戶端就無法判斷出是原始報文的響應還是重傳報文的響應,這樣在計算 RTT(往返時間) 時應該選擇從發(fā)送原始報文開始計算,還是重傳原始報文開始計算呢?

如果算成原始報文的響應,但實際上是重傳報文的響應(上圖右),會導致采樣 RTT 變大;

如果算成重傳報文的響應,但實際上是原始報文的響應(上圖左),又很容易導致采樣 RTT 過小;

RTT 計算不精確的話,那么 RTO (超時時間)也就不精確,因為 RTO 是基于 RTT 來計算的,RTO 計算不準確可能導致重傳的概率事件增大。

QUIC 報文中的 Pakcet Number 是嚴格遞增的, 即使是重傳報文,它的 Pakcet Number 也是遞增的,這樣就能更加精確計算出報文的 RTT。

如果 ACK 的 Packet Number 是 N+M,就根據(jù)重傳報文計算采樣 RTT。如果 ACK 的 Pakcet Number 是 N,就根據(jù)原始報文的時間計算采樣 RTT,沒有歧義性的問題。

另外,還有一個好處,QUIC 使用的 Packet Number 單調(diào)遞增的設計,可以讓數(shù)據(jù)包不再像TCP 那樣必須有序確認,QUIC 支持亂序確認,當數(shù)據(jù)包Packet N 丟失后,只要有新的已接收數(shù)據(jù)包確認,當前窗口就會繼續(xù)向右滑動。

待發(fā)送端超過一定時間沒收到 Packet N 的確認報文后,會將需要重傳的數(shù)據(jù)包放到待發(fā)送隊列,重新編號比如數(shù)據(jù)包 Packet N+M 后重新發(fā)送給接收端,對重傳數(shù)據(jù)包的處理跟發(fā)送新的數(shù)據(jù)包類似,這樣就不會因為丟包重傳將當前窗口阻塞在原地,從而解決了隊頭阻塞問題。

所以,Packet Number 單調(diào)遞增的兩個好處:

  • 可以更加精確計算 RTT,沒有 TCP 重傳的歧義性問題;
  • 可以支持亂序確認,防止因為丟包重傳將當前窗口阻塞在原地,而 TCP 必須是順序確認的,丟包時會導致窗口滑動;

QUIC Frame Header

一個 Packet 報文中可以存放多個 QUIC Frame。

每一個 Frame 都有明確的類型,針對類型的不同,功能也不同,自然格式也不同。我這里只舉例 Stream 類型的 Frame 格式,Stream 可以認為就是一條 HTTP 請求,它長這樣:

  • Stream ID 作用:多個并發(fā)傳輸?shù)?HTTP 消息,通過不同的 Stream ID 加以區(qū)別;
  • Offset 作用:類似于 TCP 協(xié)議中的 Seq 序號,保證數(shù)據(jù)的順序性和可靠性;
  • Length 作用:指明了 Frame 數(shù)據(jù)的長度。

在前面介紹 Packet Header 時,說到 Packet Number 是嚴格遞增,即使重傳報文的 Packet Number 也是遞增的,既然重傳數(shù)據(jù)包的 Packet N+M 與丟失數(shù)據(jù)包的 Packet N 編號并不一致,我們怎么確定這兩個數(shù)據(jù)包的內(nèi)容一樣呢?

所以引入 Frame Header 這一層,通過 Stream ID + Offset 字段信息實現(xiàn)數(shù)據(jù)的有序性,通過比較兩個數(shù)據(jù)包的 Stream ID 與 Stream Offset ,如果都是一致,就說明這兩個數(shù)據(jù)包的內(nèi)容一致。

舉個例子,下圖中,數(shù)據(jù)包 Packet N 丟失了,后面重傳該數(shù)據(jù)包的編號為 Packet N+2,丟失的數(shù)據(jù)包和重傳的數(shù)據(jù)包 Stream ID 與 Offset 都一致,說明這兩個數(shù)據(jù)包的內(nèi)容一致。這些數(shù)據(jù)包傳輸?shù)浇邮斩撕螅邮斩四芨鶕?jù) Stream ID 與 Offset 字段信息將 Stream x 和 Stream x+y 按照順序組織起來,然后交給應用程序處理。

總的來說,QUIC 通過單向遞增的 Packet Number,配合 Stream ID 與 Offset 字段信息,可以支持亂序確認而不影響數(shù)據(jù)包的正確組裝,擺脫了TCP 必須按順序確認應答 ACK 的限制,解決了 TCP 因某個數(shù)據(jù)包重傳而阻塞后續(xù)所有待發(fā)送數(shù)據(jù)包的問題。

QUIC 是如何解決 TCP 隊頭阻塞問題的?

什么是 TCP 隊頭阻塞問題?

TCP 隊頭阻塞的問題要從兩個角度看,一個是發(fā)送窗口的隊頭阻塞,另外一個是接收窗口的隊頭阻塞。

先來說說發(fā)送窗口的隊頭阻塞。

TCP 發(fā)送出去的數(shù)據(jù),都是需要按序確認的,只有在數(shù)據(jù)都被按順序確認完后,發(fā)送窗口才會往前滑動。

舉個例子,比如下圖的發(fā)送方把發(fā)送窗口內(nèi)的數(shù)據(jù)全部都發(fā)出去了,可用窗口的大小就為 0 了,表明可用窗口耗盡,在沒收到 ACK 確認之前是無法繼續(xù)發(fā)送數(shù)據(jù)了。

可用窗口耗盡

接著,當發(fā)送方收到對第 32~36 字節(jié)的 ACK 確認應答后,則滑動窗口往右邊移動 5 個字節(jié),因為有 5 個字節(jié)的數(shù)據(jù)被應答確認,接下來第 52~56 字節(jié)又變成了可用窗口,那么后續(xù)也就可以發(fā)送 52~56 這 5 個字節(jié)的數(shù)據(jù)了。

32 ~ 36 字節(jié)已確認

但是如果某個數(shù)據(jù)報文丟失或者其對應的 ACK 報文在網(wǎng)絡中丟失,會導致發(fā)送方無法移動發(fā)送窗口,這時就無法再發(fā)送新的數(shù)據(jù),只能超時重傳這個數(shù)據(jù)報文,直到收到這個重傳報文的 ACK,發(fā)送窗口才會移動,繼續(xù)后面的發(fā)送行為。

舉個例子,比如下圖,客戶端是發(fā)送方,服務器是接收方。

客戶端發(fā)送了第 5~9 字節(jié)的數(shù)據(jù),但是第 5 字節(jié)的 ACK 確認報文在網(wǎng)絡中丟失了,那么即使客戶端收到第 6~9 字節(jié)的 ACK 確認報文,發(fā)送窗口也不會往前移動。

此時的第 5 字節(jié)相當于“隊頭”,因為沒有收到“隊頭”的 ACK 確認報文,導致發(fā)送窗口無法往前移動,此時發(fā)送方就無法繼續(xù)發(fā)送后面的數(shù)據(jù),相當于按下了發(fā)送行為的暫停鍵,這就是發(fā)送窗口的隊頭阻塞問題。

再來說說接收窗口的隊頭阻塞。

接收方收到的數(shù)據(jù)范圍必須在接收窗口范圍內(nèi),如果收到超過接收窗口范圍的數(shù)據(jù),就會丟棄該數(shù)據(jù),比如下圖接收窗口的范圍是 32 ~ 51 字節(jié),如果收到第 52 字節(jié)以上數(shù)據(jù)都會被丟棄。

接收窗口

接收窗口什么時候才能滑動?當接收窗口收到有序數(shù)據(jù)時,接收窗口才能往前滑動,然后那些已經(jīng)接收并且被確認的「有序」數(shù)據(jù)就可以被應用層讀取。

但是,當接收窗口收到的數(shù)據(jù)不是有序的,比如收到第 33~40 字節(jié)的數(shù)據(jù),由于第 32 字節(jié)數(shù)據(jù)沒有收到, 接收窗口無法向前滑動,那么即使先收到第 33~40 字節(jié)的數(shù)據(jù),這些數(shù)據(jù)也無法被應用層讀取的。只有當發(fā)送方重傳了第 32 字節(jié)數(shù)據(jù)并且被接收方收到后,接收窗口才會往前滑動,然后應用層才能從內(nèi)核讀取第 32~40 字節(jié)的數(shù)據(jù)。

好了,至此發(fā)送窗口和接收窗口的隊頭阻塞問題都說完了,這兩個問題的原因都是因為 TCP 必須按序處理數(shù)據(jù),也就是 TCP 層為了保證數(shù)據(jù)的有序性,只有在處理完有序的數(shù)據(jù)后,滑動窗口才能往前滑動,否則就停留。

  • 停留「發(fā)送窗口」會使得發(fā)送方無法繼續(xù)發(fā)送數(shù)據(jù)。
  • 停留「接收窗口」會使得應用層無法讀取新的數(shù)據(jù)。

其實也不能怪 TCP 協(xié)議,它本來設計目的就是為了保證數(shù)據(jù)的有序性。

HTTP/2 的隊頭阻塞

HTTP/2 通過抽象出 Stream 的概念,實現(xiàn)了 HTTP 并發(fā)傳輸,一個 Stream 就代表 HTTP/1.1 里的請求和響應。

HTTP/2

在 HTTP/2 連接上,不同 Stream 的幀是可以亂序發(fā)送的(因此可以并發(fā)不同的 Stream ),因為每個幀的頭部會攜帶 Stream ID 信息,所以接收端可以通過 Stream ID 有序組裝成 HTTP 消息,而同一 Stream 內(nèi)部的幀必須是嚴格有序的。

但是 HTTP/2 多個 Stream 請求都是在一條 TCP 連接上傳輸,這意味著多個 Stream 共用同一個 TCP 滑動窗口,那么當發(fā)生數(shù)據(jù)丟失,滑動窗口是無法往前移動的,此時就會阻塞住所有的 HTTP 請求,這屬于 TCP 層隊頭阻塞。

沒有隊頭阻塞的 QUIC

QUIC 也借鑒 HTTP/2 里的 Stream 的概念,在一條 QUIC 連接上可以并發(fā)發(fā)送多個 HTTP 請求 (Stream)。

但是 QUIC 給每一個 Stream 都分配了一個獨立的滑動窗口,這樣使得一個連接上的多個 Stream 之間沒有依賴關系,都是相互獨立的,各自控制的滑動窗口。

假如 Stream2 丟了一個 UDP 包,也只會影響 Stream2 的處理,不會影響其他 Stream,與 HTTP/2 不同,HTTP/2 只要某個流中的數(shù)據(jù)包丟失了,其他流也會因此受影響。

QUIC 是如何做流量控制的?

TCP 流量控制是通過讓「接收方」告訴「發(fā)送方」,它(接收方)的接收窗口有多大,從而讓「發(fā)送方」根據(jù)「接收方」的實際接收能力控制發(fā)送的數(shù)據(jù)量。

在前面說到,TCP 的接收窗口在收到有序的數(shù)據(jù)后,接收窗口才能往前滑動,否則停止滑動;TCP 的發(fā)送窗口在收到對已發(fā)送數(shù)據(jù)的順序確認 ACK后,發(fā)送窗口才能往前滑動,否則停止滑動。

QUIC 是基于 UDP 傳輸?shù)模?UDP 沒有流量控制,因此 QUIC 實現(xiàn)了自己的流量控制機制。不過,QUIC 的滑動窗口滑動的條件跟 TCP 有所差別的。

QUIC 實現(xiàn)了兩種級別的流量控制,分別為 Stream 和 Connection 兩種級別:

  • Stream 級別的流量控制:每個 Stream 都有獨立的滑動窗口,所以每個 Stream 都可以做流量控制,防止單個 Stream 消耗連接(Connection)的全部接收緩沖。
  • Connection 流量控制:限制連接中所有 Stream 相加起來的總字節(jié)數(shù),防止發(fā)送方超過連接的緩沖容量。

Stream 級別的流量控制

回想一下 TCP,當發(fā)送方發(fā)送 seq1、seq2、seq3 報文,由于 seq2 報文丟失了,接收方收到 seq1 后會 ack1,然后接收方收到 seq3 后還是回 ack1(因為沒有收到 seq2),這時發(fā)送窗口無法往前滑動。

但是,QUIC 就不一樣了,即使中途有報文丟失,發(fā)送窗口依然可以往前滑動,具體怎么做到的呢?我們來看看。

最開始,接收方的接收窗口初始狀態(tài)如下:

接著,接收方收到了發(fā)送方發(fā)送過來的數(shù)據(jù),有的數(shù)據(jù)被上層讀取了,有的數(shù)據(jù)丟包了,此時的接收窗口狀況如下:

可以看到,接收窗口的左邊界取決于接收到的最大偏移字節(jié)數(shù),此時的接收窗口 = 最大窗口數(shù) - 接收到的最大偏移數(shù),這里就跟 TCP 不一樣了。

那接收窗口觸發(fā)的滑動條件是什么呢?看下圖:

接收窗口觸發(fā)的滑動

當圖中的綠色部分數(shù)據(jù)超過最大接收窗口的一半后,最大接收窗口向右移動,同時給對端發(fā)送「窗口更新幀」。當發(fā)送方收到接收方的窗口更新幀后,發(fā)送窗口也會往前滑動,即使中途有丟包,依然也會滑動,這樣就防止像 TCP 那樣在出現(xiàn)丟包的時候,導致發(fā)送窗口無法移動,從而避免了無法繼續(xù)發(fā)送數(shù)據(jù)。

在前面我們說過,每個 Stream 都有各自的滑動窗口,不同 Stream 互相獨立,隊頭的 Stream A 被阻塞后,不妨礙 StreamB、C的讀取。而對于 TCP 而言,其不知道將不同的 Stream 交給上層哪一個請求,因此同一個Connection內(nèi),Stream A 被阻塞后,StreamB、C 必須等待。

經(jīng)過了解完 QUIC 的流量控制機制后,對于隊頭阻塞問題解決得更加徹底。

QUIC 協(xié)議中同一個 Stream 內(nèi),滑動窗口的移動僅取決于接收到的最大字節(jié)偏移(盡管期間可能有部分數(shù)據(jù)未被接收),而對于 TCP 而言,窗口滑動必須保證此前的 packet 都有序的接收到了,其中一個 packet 丟失就會導致窗口等待。

Connection 流量控制

而對于 Connection 級別的流量窗口,其接收窗口大小就是各個 Stream 接收窗口大小之和。

Connection 流量控制

上圖所示的例子,所有 Streams 的最大窗口數(shù)為 120,其中:

  • Stream 1 的最大接收偏移為 100,可用窗口 = 120 - 100 = 20
  • Stream 2 的最大接收偏移為 90,可用窗口 = 120 - 90 = 30
  • Stream 3 的最大接收偏移為 110,可用窗口 = 120 - 110 = 10

那么整個 Connection 的可用窗口 = 20 + 30 + 10 = 60

可用窗口 = Stream 1 可用窗口 + Stream 2 可用窗口 + Stream 3 可用窗口

QUIC 對擁塞控制改進

QUIC 協(xié)議當前默認使用了 TCP 的 Cubic 擁塞控制算法(我們熟知的慢開始、擁塞避免、快重傳、快恢復策略),同時也支持 CubicBytes、Reno、RenoBytes、BBR、PCC 等擁塞控制算法,相當于將 TCP 的擁塞控制算法照搬過來了,QUIC 是如何改進 TCP 的擁塞控制算法的呢?

QUIC 是處于應用層的,應用程序?qū)用婢湍軐崿F(xiàn)不同的擁塞控制算法,不需要操作系統(tǒng),不需要內(nèi)核支持。這是一個飛躍,因為傳統(tǒng)的 TCP 擁塞控制,必須要端到端的網(wǎng)絡協(xié)議棧支持,才能實現(xiàn)控制效果。而內(nèi)核和操作系統(tǒng)的部署成本非常高,升級周期很長,所以 TCP 擁塞控制算法迭代速度是很慢的。而 QUIC 可以隨瀏覽器更新,QUIC 的擁塞控制算法就可以有較快的迭代速度。

TCP 更改擁塞控制算法是對系統(tǒng)中所有應用都生效,無法根據(jù)不同應用設定不同的擁塞控制策略。但是因為 QUIC 處于應用層,所以就可以針對不同的應用設置不同的擁塞控制算法,這樣靈活性就很高了。

QUIC 更快的連接建立

對于 HTTP/1 和 HTTP/2 協(xié)議,TCP 和 TLS 是分層的,分別屬于內(nèi)核實現(xiàn)的傳輸層、openssl 庫實現(xiàn)的表示層,因此它們難以合并在一起,需要分批次來握手,先 TCP 握手(1RTT),再 TLS 握手(2RTT),所以需要 3RTT 的延遲才能傳輸數(shù)據(jù),就算 Session 會話服用,也需要至少 2 個 RTT。

HTTP/3 在傳輸數(shù)據(jù)前雖然需要 QUIC 協(xié)議握手,這個握手過程只需要 1 RTT,握手的目的是為確認雙方的「連接 ID」,連接遷移就是基于連接 ID 實現(xiàn)的。

但是 HTTP/3 的 QUIC 協(xié)議并不是與 TLS 分層,而是QUIC 內(nèi)部包含了 TLS,它在自己的幀會攜帶 TLS 里的“記錄”,再加上 QUIC 使用的是 TLS1.3,因此僅需 1 個 RTT 就可以「同時」完成建立連接與密鑰協(xié)商,甚至在第二次連接的時候,應用數(shù)據(jù)包可以和 QUIC 握手信息(連接信息 + TLS 信息)一起發(fā)送,達到 0-RTT 的效果。

如下圖右邊部分,HTTP/3 當會話恢復時,有效負載數(shù)據(jù)與第一個數(shù)據(jù)包一起發(fā)送,可以做到 0-RTT:

QUIC 是如何遷移連接的?

基于 TCP 傳輸協(xié)議的 HTTP 協(xié)議,由于是通過四元組(源 IP、源端口、目的 IP、目的端口)確定一條 TCP 連接。

那么當移動設備的網(wǎng)絡從 4G 切換到 WIFI 時,意味著 IP 地址變化了,那么就必須要斷開連接,然后重新建立 TCP 連接。

而建立連接的過程包含 TCP 三次握手和 TLS 四次握手的時延,以及 TCP 慢啟動的減速過程,給用戶的感覺就是網(wǎng)絡突然卡頓了一下,因此連接的遷移成本是很高的。

QUIC 協(xié)議沒有用四元組的方式來“綁定”連接,而是通過連接 ID來標記通信的兩個端點,客戶端和服務器可以各自選擇一組 ID 來標記自己,因此即使移動設備的網(wǎng)絡變化后,導致 IP 地址變化了,只要仍保有上下文信息(比如連接 ID、TLS 密鑰等),就可以“無縫”地復用原連接,消除重連的成本,沒有絲毫卡頓感,達到了連接遷移的功能。

參考資料:

??https://www.taohui.tech/2021/02/04/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/%E6%B7%B1%E5%85%A5%E5%89%96%E6%9E%90HTTP3%E5%8D%8F%E8%AE%AE/??

??https://zhuanlan.zhihu.com/p/32553477??

責任編輯:武曉燕 來源: 小林coding
相關推薦

2022-08-18 17:44:25

HTTPS協(xié)議漏洞

2022-03-30 10:10:17

字節(jié)碼棧空間

2022-08-13 12:07:14

URLHTTP加密

2024-09-19 08:51:01

HTTP解密截取

2022-10-10 08:13:16

遞歸通用代碼

2024-11-26 08:52:34

SQL優(yōu)化Kafka

2022-07-26 00:00:02

TCPUDPMAC

2024-03-18 08:21:06

TCPUDP協(xié)議

2022-01-05 21:54:51

網(wǎng)絡分層系統(tǒng)

2024-03-05 10:07:22

TCPUDP協(xié)議

2025-04-15 10:00:00

Feign負載均衡微服務

2025-09-03 10:01:05

2022-06-01 11:52:42

網(wǎng)站客戶端網(wǎng)絡

2024-11-11 10:34:55

2022-05-11 22:15:51

云計算云平臺

2022-11-30 17:13:05

MySQLDynamic存儲

2022-10-19 14:08:42

SYNTCP報文

2024-05-15 16:41:57

進程IO文件

2024-11-11 16:40:04

2010-09-06 09:43:46

TCPUDPAndroid
點贊
收藏

51CTO技術棧公眾號

亚洲第一狼人社区| 毛片一区二区三区| 日韩精品在线播放| 免费看涩涩视频| 午夜影院免费在线| 91视视频在线直接观看在线看网页在线看| 欧美自拍视频在线观看| 国产一二三四区在线| 日本精品一区二区三区在线观看视频| 疯狂蹂躏欧美一区二区精品| 性欧美精品一区二区三区在线播放| 国产精品视频无码| 午夜亚洲视频| 久久精品久久久久| 国产精品无码久久久久久| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 久久国产生活片100| 欧美国产日韩一区二区在线观看 | 国产精品超碰97尤物18| 国产欧美一区二区三区另类精品| 少妇无套内谢久久久久| 伊人久久亚洲影院| 久久久精品日本| 午夜一区二区三区免费| 狂野欧美xxxx韩国少妇| 欧美三级电影网站| www黄色av| 51漫画成人app入口| 亚洲欧美成aⅴ人在线观看 | www 日韩| 91视视频在线直接观看在线看网页在线看| 亚洲伊人一本大道中文字幕| 69av视频在线观看| 性8sex亚洲区入口| 97免费中文视频在线观看| 欧美做爰爽爽爽爽爽爽| 久久国产小视频| 亚洲欧洲日韩国产| 中文字幕精品久久久| 视频一区国产| 91精品国产综合久久久久久漫画 | 久久一夜天堂av一区二区三区| 99久久综合狠狠综合久久止| 一级黄色片在线| 免费一级片91| 国产精品黄视频| 精品久久久久久久久久久久久久久久久久| 亚洲福利国产| 国产69精品久久久久9| 黄色一级视频免费观看| 女主播福利一区| 欧美成人在线影院| 91精品国产高清一区二区三蜜臀| 99视频精品全国免费| 最近中文字幕日韩精品| 国产黄色录像视频| 欧美残忍xxxx极端| 久热在线中文字幕色999舞| 免费成人美女女在线观看| 久久中文字幕av| 最近2019年好看中文字幕视频| 国产在线免费av| 欧美激情成人| 久久国产精品首页| 九九视频在线观看| 亚洲国内精品| 奇米四色中文综合久久| 国产男人搡女人免费视频| 久久精品电影| 国产精品一区二区久久| 91亚洲国产成人久久精品麻豆| 久久99日本精品| 91精品中国老女人| 狠狠躁日日躁夜夜躁av| 91香蕉视频污在线| 亚洲第一综合| 日本天码aⅴ片在线电影网站| 一区二区高清免费观看影视大全| 人妻av中文系列| 国产精品专区免费| 欧美日本一区二区在线观看| 亚洲一二三av| 欧美三级自拍| 社区色欧美激情 | 久久久久久久久久91| 亚洲视频www| 国产专区欧美专区| 蜜桃视频久久一区免费观看入口| 91毛片在线观看| 一区精品在线| 操人在线观看| 欧美日本在线观看| 中文字幕在线永久| 98精品视频| 97碰在线观看| 国产伦精品一区二区三区视频痴汉| 国产999精品久久| 天天综合色天天综合色hd| 午夜小视频在线观看| 欧美日韩美女在线观看| 亚洲一区精品视频在线观看| 粉嫩av一区二区| 中文字幕精品—区二区| 免费一级片视频| 日韩av中文字幕一区二区| 91中文字精品一区二区| 九色在线观看视频| 亚洲一区二区三区在线播放| 性生交免费视频| heyzo欧美激情| 日韩中文字幕免费视频| 一级片中文字幕| 国产精品一区二区三区网站| 日韩欧美第二区在线观看| 久草在线新免费首页资源站| 欧美午夜精品久久久久久孕妇| 蜜臀视频在线观看| 99精品视频精品精品视频| 欧美中文字幕在线视频| 精品黑人一区二区三区国语馆| 国产校园另类小说区| 黄页网站大全在线观看| 51精品国产| 欧美超级免费视 在线| 在线观看你懂的网站| 波多野结衣一区二区三区| 无码人妻精品一区二区三区99v| 桃花岛tv亚洲品质| 亚洲精品日韩久久久| 日韩黄色在线视频| 国产 日韩 欧美大片| 激情五月五月婷婷| 外国成人毛片| 色悠悠久久久久| 伊人网综合在线| 中文字幕成人在线观看| 欧美日韩亚洲一二三| 一呦二呦三呦国产精品| 777777777亚洲妇女| 亚洲精品国偷拍自产在线观看蜜桃| 亚洲欧洲成人自拍| 伊人影院综合在线| 日韩精品欧美| 国产日韩精品在线播放| av在线三区| 欧美日韩视频专区在线播放| 中文字幕有码在线播放| 日日夜夜精品视频天天综合网| 精品一区久久| 在线亚洲人成| 亚洲网站在线看| 中日精品一色哟哟| 国产精品伦一区二区三级视频| 嫩草av久久伊人妇女超级a| 国产一区二区三区四区二区| 国产成人精品一区| 国产精品ⅴa有声小说| 欧美最新大片在线看| 国产又黄又粗的视频| 日本色综合中文字幕| 亚洲蜜桃av| 国产一区二区三区亚洲综合 | 日本一区二区三区免费看| 超碰国产一区| 色噜噜国产精品视频一区二区| 亚洲天堂一二三| 亚洲欧美日韩国产成人精品影院| 日本女人黄色片| 亚洲日本视频| 日本不卡在线播放| 成人av集中营| 欧美成人免费小视频| 日本毛片在线观看| 色综合色狠狠综合色| 日本高清黄色片| 国产一区二区91| 女人天堂av手机在线| 精品国产91久久久久久浪潮蜜月| 国产精品自拍偷拍| 青草在线视频在线观看| 日韩大片免费观看视频播放| 亚洲天堂视频在线播放| 亚洲免费在线电影| 少妇精品一区二区三区| 精品亚洲国产成人av制服丝袜| 一本色道久久88亚洲精品综合| 大型av综合网站| 国产成人精品在线观看| 中文字幕免费高清电视剧网站在线观看| 精品免费99久久| 伊人久久久久久久久久久久| 国产精品不卡视频| 国产麻豆剧传媒精品国产av| 日韩精品成人一区二区在线| 超级碰在线观看| 蜜桃a∨噜噜一区二区三区| 国产主播精品在线| 日韩大片免费观看| 久久天堂电影网| 精品亚洲综合| 日韩欧美一级在线播放| av首页在线观看| 亚洲国产乱码最新视频| 91免费在线看片| 97精品超碰一区二区三区| 手机在线国产视频| 久久久蜜桃一区二区人| 久久99久久久久久| 日韩黄色大片网站| 欧美三日本三级少妇三99| 中文无码日韩欧| 国产一区二区色| 波多野结衣亚洲一二三| 欧美激情第99页| 黄色成人在线| 中文字幕9999| 青青草在线视频免费观看| 欧美成人乱码一区二区三区| 影音先锋国产在线| 日本韩国欧美在线| 交换做爰国语对白| 久久综合影音| 欧美二区在线视频| 午夜日韩在线| youjizz.com亚洲| 日本黄色精品| 日本一区二区在线| 少妇精品导航| 精品一区二区国产| 免费成人蒂法| 国模一区二区三区私拍视频| 亚洲精品a区| 亚洲一区久久久| 999色成人| 成人久久久久爱| 欧美在线se| 国产狼人综合免费视频| 欧美日韩在线精品一区二区三区激情综合 | 五月婷婷婷婷婷| 国产亚洲福利社区一区| 亚洲一区二区自偷自拍 | 日本一区二区在线视频观看| 欧美日韩大片免费观看| 国产精品亚洲综合| 精品国产一区二区三区2021| 成人欧美一区二区三区在线湿哒哒| av成人在线播放| 国产日韩中文字幕| 看亚洲a级一级毛片| 亚洲一区二区在线播放| 在线视频亚洲欧美中文| 国产免费高清一区| 青青草这里只有精品| 久久久久久精| 怕怕欧美视频免费大全| 日韩中文字幕一区二区| 日本精品黄色| 99热一区二区三区| 欧美激情视频一区二区三区免费| 欧美黄网在线观看| 韩国av一区| 免费黄色福利视频| 日本中文字幕不卡| 爽爽爽在线观看| 国产精品一区二区三区四区| 亚洲欧美日韩色| 91天堂素人约啪| 日本污视频网站| 亚洲精品视频一区| 国产无遮挡又黄又爽在线观看| 精品国产福利在线| 亚洲av综合一区| 欧美一二三区精品| 亚洲av成人精品毛片| 一个人看的www久久| 国产盗摄在线观看| 国语自产偷拍精品视频偷| 欧美xx视频| 91色琪琪电影亚洲精品久久| 成人av资源网址| 日韩精品不卡| 欧美在线国产| 777米奇影视第四色| 理论电影国产精品| 在线观看亚洲免费视频| 国产亚洲精品资源在线26u| 亚洲天堂网av在线| 亚洲线精品一区二区三区| 日韩免费av网站| 欧美一二三区在线| 国产精品视频二区三区| 欧美麻豆久久久久久中文| 最近高清中文在线字幕在线观看1| 国产精品一区二区三区久久久| 午夜视频在线观看精品中文| 欧美久久电影| 亚洲欧美一区在线| 欧洲熟妇精品视频| 国产sm精品调教视频网站| 国产伦理片在线观看| 亚洲一区在线看| 涩涩视频在线观看| 日韩精品在线观| av观看在线| 国产精品黄色影片导航在线观看| 国产精品tv| 正在播放91九色| 久久高清免费观看| www.四虎精品| 国产精品成人一区二区三区夜夜夜| 日韩高清免费av| 欧美一区二区三区四区视频| 国产午夜在线观看| 9.1国产丝袜在线观看| 日本一区二区乱| 视频一区二区在线| 欧美专区18| 中国极品少妇videossexhd| 亚洲女同一区二区| 中文字幕av影视| 亚洲人成网站999久久久综合| 啪啪免费视频一区| 亚洲精品日韩激情在线电影| 日本激情一区| 成年网站在线播放| 国产亚洲欧洲997久久综合| 中文字幕视频网| 国产视频精品免费播放| 波多野结衣在线播放| 亚洲资源在线看| 欧美在线首页| 日本亚洲一区二区三区| 成人欧美一区二区三区黑人麻豆| 夜夜爽妓女8888视频免费观看| 精品视频久久久久久| 2021天堂中文幕一二区在线观| 成人国产1314www色视频| 最新精品国产| 欧美国产在线一区| 亚洲精品乱码久久久久久久久| 国产精品爽爽久久| 久久亚洲欧美日韩精品专区 | 国产欧美一区二区视频 | 尤蜜粉嫩av国产一区二区三区| 久久日一线二线三线suv| www.国产高清| 亚洲男子天堂网| 台湾佬成人网| 亚洲精品国产精品国自产观看| 青青国产91久久久久久| eeuss中文字幕| 51午夜精品国产| 污的网站在线观看| 国产日韩欧美二区| 一区二区三区四区五区精品视频 | 亚洲最大成人综合| 亚洲精品喷潮一区二区三区| 欧美福利视频网站| 美腿丝袜亚洲图片| 日韩精品一区二区三区久久| 久久久天堂av| 中文字幕日韩国产| 美女久久久久久久久久久| 亚洲**毛片| 亚洲熟妇av一区二区三区漫画| 久久蜜臀精品av| 在线观看国产黄| 欧美成人四级hd版| 啪啪国产精品| 美女少妇一区二区| 一区二区三区四区在线| 蜜桃视频久久一区免费观看入口| 国产69精品久久久久久| 国产一区二区三区日韩精品 | 久久93精品国产91久久综合| 久久久久国产精品熟女影院| 国产精品久久毛片av大全日韩| 999久久久久久| 57pao成人永久免费视频| 日韩成人精品一区二区| 风韵丰满熟妇啪啪区老熟熟女| 欧美色视频日本版| 麻豆av在线导航| 99久热re在线精品996热视频| 先锋影音久久| 我家有个日本女人| 亚洲男人第一网站| 日韩黄色av| 噼里啪啦国语在线观看免费版高清版| ...xxx性欧美| 欧洲一区av| 99视频国产精品免费观看| 国产精品综合| www.色小姐com| 一本色道久久综合亚洲精品小说| 97一区二区国产好的精华液| 欧美黄色一级片视频| 亚洲综合久久久久| 3p在线观看| 蜜桃av色综合|