日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RDMA】16. RDMA之DDP(Direct Data Placement)

發布時間:2024/1/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【RDMA】16. RDMA之DDP(Direct Data Placement) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【RDMA】RDMA 學習資料總目錄_bandaoyu的筆記-CSDN博客SavirRDMA 分享1. RDMA概述https://blog.csdn.net/bandaoyu/article/details/112859853https://zhuanlan.zhihu.com/p/1388747382. 比較基于Socket與RDMA的通信https://blog.csdn.net/bandaoyu/article/details/1128613993. RDMA基本元素和編程基礎https://blog.csdn.net/bandaoyu/article/de.https://blog.csdn.net/bandaoyu/article/details/120485737

概述

傳統TCP/IP協議棧中,網卡先將數據DMA拷貝到內核空間的緩沖區,再由CPU將經過協議棧處理的數據拷貝到用戶空間。

那么為什么不能放用戶空間呢?網卡知道放到內核空間的哪個位置,是因為協議棧已經提前告知網卡緩沖區的地址。

iWARP是在現有TCP/IP協議棧基礎上實現RDMA技術,TCP/IP協議早已形成標準,不可能修改現有協議字段,增加DDP,既在TCP基礎(或者是SCTP)上加一層,DDP的報文頭中,攜帶了能夠幫助網卡識別用戶應用程序緩沖區的位置信息。

正文

原文:16. RDMA之DDP(Direct Data Placement) - 知乎

本文歡迎轉載,轉載請注明出處。

最近在研究iWARP的實現,就先寫一下它的各層協議吧,iWARP的綜述篇可能會晚于各層協議完成。

Direct Data Placement,簡稱為DDP,是iWARP協議棧的核心成員。DDP協議在TCP/SCTP之上實現了了RDMA技術中的零拷貝,即在通信過程中,使接收端的硬件可以直接把收到的數據放置到用戶空間的Buffer,從而避免多次在Buffer間的拷貝數據對CPU產生的開銷。

本文的主要目的是幫助大家快速且容易的了解DDP,內容主要是基于RFC4296和RFC 5041完成的,更多細節請參考原文。閱讀本文前建議溫習一下本專欄的基礎概念篇。如有疑問或有錯誤需要更正,歡迎在評論區留言。

概述

我們先來看一下DDP試圖解決什么樣的問題:

每次數據在內存中的拷貝,都需要CPU一邊通過總線從內存中讀取數據,一邊通過總線向內存中的另外一處寫入數據。所以至少需要占用2倍于網卡帶寬的CPU負載和3倍于網卡帶寬的內存帶寬(設備DMA寫入一次,CPU讀寫各一次),因此有必要實現零拷貝技術來解放CPU和內存的帶寬。

同一份數據,被DMA拷貝了一次(網卡-->驅動內存),CPU拷貝了一次(驅動內存-->應用內存)

Infiniband技術的RDMA Write/Read操作已經有了零拷貝的實現,是通過在報文中攜帶VA和R_Key的方式來實現的。接收端的硬件通過接收報文中的R_Key找到內存的VA-PA(虛擬地址-物理地址)轉換表,然后把報文中的VA轉換為PA,最后直接把Payload放到內存的對應位置中。

RDMA Extended Transport Header (RETH)

然而Infiniband使用的是全新設計的協議棧,硬件無法與現有網絡兼容。之前我們講過,如果用戶想要從以太網切換到IB,那么需要把網卡、交換機、路由器和光纜等設備全部更換,將是很大的一筆開銷。

DMA技術在以太網卡中早已普及,即網卡收到消息后,可以在CPU不參與數據拷貝的情況下,就可以直接將數據放到指定內存區域中。

在傳統的TCP/IP協議棧中,網卡要先將數據通過DMA拷貝到內核空間的緩沖區中,再由CPU將經過協議棧處理的數據拷貝到用戶空間。

既然網卡可以直接將數據放到內核空間,那么為什么不能放用戶空間呢?本質上只是地址不同罷了,之所以網卡知道放到內核空間的哪個位置,是因為協議棧已經提前告知網卡緩沖區的地址。同理,只要網卡有辦法獲取到用戶空間內存地址對應的物理地址,就可以直接把數據放到用戶空間了,也就是實現了不需要CPU參與的零拷貝:

iWARP的目標是在現有TCP/IP協議棧基礎上實現RDMA技術,而DDP這一層的主要功能就是實現零拷貝。因為TCP/IP協議早已形成標準,不可能修改現有協議字段,所以DDP實現零拷貝的方案就是在TCP基礎(或者是SCTP)上加一層,作為其負載。而DDP的報文頭中,攜帶了能夠幫助網卡識別用戶應用程序緩沖區的位置信息。

DDP作為中間層,本身是不限制上層和下層協議的。只是在iWARP協議棧中,DDP向上為RDMAP服務,向下承接TCP(中間有一層很“薄”的MPA,我們在后文介紹)或者SCTP:

iWARP協議棧

術語

為了方便后文的講解,我們先來對一些屬術語進行說明。

ULP

Upper Layer Protocol,上層協議。顧名思義,就是在DDP協議之上的其他協議,最常見的是iWARP協議棧中的RDMAP層。

RDMA Consortium?和?IBTA?主導了RDMA,RDMAC是IETF的一個補充,它主要定義的是iWRAP和iSER,IBTA是infiniband的全部標準制定者,并補充了RoCE v1 v2的標準化。應用和RNIC之間的傳輸接口層(software transport interface)被稱為Verbs。IBTA解釋了RDMA傳輸過程中應具備的特性行為,而并沒有規定Verbs的具體接口和數據結構原型。這部分工作由另一個組織OFA(Open Fabric Alliance)來完成,OFA提供了RDMA傳輸的一系列Verbs API。OFA開發出了OFED(Open Fabric Enterprise Distribution)協議棧,支持多種RDMA傳輸層協議。

OFED中除了提供向下與RNIC基本的隊列消息服務,向上還提供了ULP(Upper Layer Protocols),通過ULPs,上層應用不需要直接到Verbs API對接,而是借助于ULP與應用對接,常見的應用不需要做修改,就可以跑在RDMA傳輸層上。

LLP

Lower Layer Protocol,下層協議。跟ULP的含義相反,指的是DDP層之下的協議,最常見的是TCP和SCTP。

RNIC

指的是支持RDMA技術的網卡(RDMA enbled Network Interface Controller)。iWARP協議中一般稱網卡為RNIC,而Infiniband和RoCE一般稱為HCA(Host Channel Adapter)。

Node

指的是網絡中的物理設備,即網絡中的一個節點。一個Node可以包含多個RNIC。

Peer

我們將相互之間建立了連接的兩個支持DDP協議的實體稱為Peer,這個實體一般指的是用戶應用程序。Peer一定是成對存在的,鏈路兩端分別稱為Local Peer和Remote Peer。

Node/Peer是兩個不同層級的概念,Node是物理實體,Peer是協議實體。一個Node上可以有多個Peer。

DDP Message

來自于ULP的數據,因為LLP的限制,這個Message可能會被切分成多個塊,每個塊都是一個DDP Segment。這些Segment中的數據最終會在接收端被提取出來還原成原來的Message。

DDP Segment

Message切分后產生的多個DDP分段。每個Segment都包含Header和Payload部分。Header部分包含的是控制信息,Payload就是實際的數據。

它們之間的關系如下圖所示:

Data Sink

指接收數據的Peer,而不是接收DDP消息的Peer。比如在上層是RDMAP時,RDMA Read操作的發起方是最終接收數據的一方,所以是Data Sink;如果是RDMA Write操作,響應方是數據的接受者,所以它是Data Sink。

Data Source

指發送數據的Peer。

Data Sink和Data Source

Steering Tag (轉向標簽)

簡稱為STag,是指向Data Sink(Data Sink)的一片內存區域的標識符。通過STag,RNIC可以找到對應的內存的物理地址,并且對其進行讀寫。這個概念跟Infiniband協議中的R_Key和L_Key很像,只不過iWARP中的通信雙方對于一片內存使用相同的STag,而沒有區分本地訪問和遠端訪問。

在注冊指定的一片內存緩沖區之后,會產生一個STag,用于本地和遠端用戶訪問這片內存。這個注冊的過程是由ULP實現的,如果ULP是RDMAP,那么這個步驟就是注冊MR的動作。注冊MR的過程中,硬件會記錄STag和內存位置的關系,然后驅動程序將STag返回給ULP。

Data Source的ULP可以將注冊MR過程中產生的STag下發給硬件,以使其能夠直接訪問本地用戶Buffer(比如post recv時下發給硬件的WR中指定的Buffer)。也可以把STag發送給對端,對端可以把這個STag攜帶在報文中,用于指定本端的一個Buffer。

Advertisement

指的是將STag等地址信息告知對端的行為。這個行為是由ULP控制的,具體發送哪些信息,以什么格式發送都由上層決定。通常在通信準備階段,Local Peer將一塊內存區域注冊到硬件,產生Stag等信息之后,將這些信息Advertise給Remote Peer。

Placement

指的是RNIC根據DDP Header的信息把收到的DDP segment的Payload放到Buffer中的行為。

Delivery

通知ULP數據已經就緒的行為,即告訴ULP數據已經組裝完畢,可以取走使用了。在一個DDP Message的所有Segment都放置完畢后,即已經在Buffer中還原出完整的數據后,DDP會通知ULP。

Buffer Model

根據數據接收端如何存放收到的數據,DDP中定義了兩種接收緩沖區的類型:

Tagged Buffer Model

還記得IB規范中描述的RDMA Write操作和Read操作嗎?Tagged Buffer Model類似于Infiniband規范中所描述的RDMA Write/Read操作。

ULP可以將STag以Socket/CM等方式發送給對端(即上文提到的Advertisement操作)。這樣Data Source就可以通過在DDP Header中攜帶STag,來指定想要寫入或者讀取的Data Sink的內存區域。Data Sink的硬件通過STag找到內存中的目的地,從而可以在CPU不參與的情況下搬移數據。

因為DDP的Message可能會被下層的協議分成多個Segment,所以每個DDP分段都要在Header中攜帶STag。另外由于每個分段可能不按順序到達對端,所以對端還需要額外的信息把這些分段拼接起來。DDP采用的方式是在Header中攜帶偏移信息TO(Tagged Offset),接收端的硬件可以通過這些偏移信息,一段一段的把每個DDP Segment的Payload放到STag指向的Buffer中的指定位置(即上文所說的Placement)。當一個消息的所有分段都被放到正確的位置之后,Message也就在接收端的內存被完整的還原了出來。

ULP并不知道從Tagged Buffer的哪個位置開始取數據,即上圖中Message 1的起始位置TO 1或者Message 2的起始位置TO 3,它們也被稱為Initial TO。ULP需要通過某種方式得到這個TO 1,根據RFC 5041中的描述,有幾種解決辦法:

  • 如RDMAP協議一樣,增加一些交互邏輯,提前知會對方這個偏移。
  • 固定從Buffer的起始地址開始存放數據:即通信的雙方約定好,每個消息都固定使用Initial TO = 0。
  • 通過額外的方式告知:即發送Tagged DDP Message之后,緊接著發送一個Untagged DDP Message(下文介紹)來告知對端Initial TO。

Untagged Buffer Model

DDP中的Untagged Buffer Model,類似于IB規范中的Send-Recv操作中的接收方式。它并不會用STag來指定對端的特定緩沖區,這也是它被稱為“Untagged”的原因。

這種模型下,Data Sink提前準備好了一些接收隊列,這些隊列中各存放了一些接收Buffer。Data Source不會在Header中攜帶STag,而是指定了隊列號,這樣Data Sink的RNIC收到數據后,就會從指定的隊列中取出一個Buffer,把數據放到其中。不同的隊列可以用于傳遞不同的信息,比如一個隊列用來接收ULP的數據,另一個隊列用來接收ULP的控制信息。

Untagged Buffer Model同樣面臨著分段后重組的問題,所以也需要在每個Segment中攜帶偏移信息,Untagged模型下的偏移信息被稱為MO(Message Offset)。但是跟Tagged Buffer Model不同,它最終數據放到哪里是由接收端決定的,而且一個接收隊列中有很多個Buffer。而同一組消息,是不可能放到不同的Buffer中的,因此需要將一個Message的不同Segment關聯起來。DDP設計采用了隊列號QN+消息序號MSN(Message Sequence Number)的方式來指定唯一的接收Buffer,這樣一個Message的不同Segment就可以被還原到同一個緩沖區中了。

除了上面的描述之外,RFC 5041還對DDP的這兩種模型做了另外的規定:

每個Untagged Buffer只能給一個DDP Message從0開始使用,而每個Tagged Buffer都可以給多個DDP Message共享使用,并且可以從任意位置開始存放數據。在上面兩張圖中,我也體現了這個規則。

我們來總結一下Tagged和Untagged Buffer Model的差異:

Tagged BufferUntagged
接收Buffer用Tag指定使用哪個接收Buffer(發送端指定)按照接收順序依次放到隊列的接收緩沖區中(接收端指定)
發送前準備接收端ULP需要通知發送端ULP緩沖區的信息不需要準備,可隨時發起(需要考慮流控)
偏移從tagged buffer的任意位置開始只能從0開始
多DDP消息允許使用同一個ULP Buffer需要為每個DDP消息準備一個ULP Buffer

報文格式

下面來看一下DDP協議的報文包含哪些字段,以及它們的含義和作用。本小節是RFC 5041第4章的翻譯和再整理,建議讀者先閱讀原文以獲得更精確的描述。

大家可以從Wireshark官網獲取抓好的報文:

https://gitlab.com/wireshark/wireshark/-/wikis/SampleCaptures#infiniband

建議選擇iwarp_rdma.tag.gz,因為里面包含了Tagged/Untagged Buffer Model兩種情況。

DDP Header

依據Buffer Mode的不同,DDP Header有兩種格式,但是這兩種格式有幾個公共域段:

前兩個字節是給MPA(Marker Protocol data unit Aligned framing)預留的,在iWARP協議棧中它是TCP和DDP的中間層。如果LLP是STCP,那么就不需要預留這兩個字節。我們會在以后的文章中介紹。

  • T - Tagged flag: 1bit
    這個標志位用來標識是哪種Buffer模型。值為1時表示Tagged Buffer Model,值為0時表示Untagged Buffer Model。硬件是依據這一個bit來決定如何解析后面的域段的。
  • L - Last flag: 1bit
    用于標識一個Message的最后一個Segment。上文中我們介紹過,一個DDP Message會被拆分成多個Segment,只有最后一個Segment的這個標志位會被置1。
    • 對于發送端來說,置了這個標志的Segment必須是在同屬于一個Message的Segment中的最后一個下發給LLP。
    • 對于接收端來說,如果收到了置了此標志位的Segment,必須在同屬于一個Message的Segment的Payload都已經完成Placement和所有之前的Message都處理完畢之后通知ULP數據已經可用(Delivery)。
  • Rsvd - Reserved: 4 bits
    保留域段,必須為0。
  • DV - DDP Version: 2 bits
    DDP版本。為以后的擴展性考慮,目前只有一個DDP版本,所以恒為1。

Tagged Buffer Model

Tagged Buffer Model的Header總長度為14個字節。

  • RsvdULP - Reserved for use by the ULP: 8 bits
    ULP保留域段。這個域段是由ULP定義的,DDP不關心其含義,只需要保證一個Message的每個Segment的該域段保持一致和不變就可以了。在Data Sink,該域段會被原封不動的傳遞給ULP。
  • STag - Steering Tag: 32 bits
    前文已經介紹過,用來指定一個Data Sink的Tagged Buffer。DDP需要保證一個Message的每個Segment的該域段保持一致和不變。
  • TO - Tagged Offset: 64 bits
    上文也已經介紹過,用來表示Payload在Tagged Buffer中從Buffer的起始地址到最終數據的存放地址的偏移。

Untagged Buffer Model

總長度為18字節。

  • RsvdULP - Reserved for use by the ULP: 40 bits
    雖然跟Tagged Buffer Model中的作用相同,但是這里擴展到了5個字節,并且RFC 5041中補充了一段:
Data Sink端的DDP實現不需要確認一個DDP Message的每個Segment的此域段是否都相同,并且可以選擇任何一個Segment的Rsvd ULP傳遞給ULP。

具體為什么加這句話還沒有想明白,可能跟上層有關系。

  • QN - Queue Number: 32 bits
    上文中介紹過,指的是Data Sink端的Untagged Buffer隊列的序號。
  • MSN - Message Sequence Number: 32 bits
    DDP Message的序列號。必須從1開始,每次遞增1。當到達0xFFFFFFFF之后,重新變為0。每個Message都只能對應一個Untagged Buffer,所以MSN+QN能夠唯一確定一個Untagged Buffer。
  • MO - Message Offset: 32 bits
    上文中介紹過,表示從QN和MSN確認的Untagged Buffer的起始位置到消息目的地址的偏移。不難想到,第一個Segment的MO一定為0。

DDP Payload

DDP Header后面緊跟的就是Payload,沒有什么需要特別注意的。

實驗

因為Wireshark提供的示例太簡單,都是不分段的DDP消息,建議大家使用支持iWARP的網卡或者使用虛擬機+Soft-iWARP跑一些更復雜的業務來做實驗。

本文接下來的實驗是通過虛擬機+Soft-iWARP實現的。iWARP和Soft-iWARP的詳情我將在以后的文章中介紹,目前僅給出簡單的配置過程。

環境配置請參考《RoCE & Soft-RoCE》這篇文章的“如何做實驗”這一章節。差異點僅在于rxe需要改為siw(Soft-iWARP)。

為了避免干擾,如果讀者的環境中已經配置了RXE,那么請使用下述命令刪除Soft-RoCE設備:

sudo rdma link delete rxe_0

然后加載siw驅動:

sudo modprobe siw

添加siw設備:

sudo rdma link add siw_0 type siw netdev ens33

此時我們用ibv_devices就能看到新添加的siw設備了:

虛擬機兩端都配置好了之后,就可以跑perftest測試了。執行之前請先在宿主機打開wireshark,并選擇對應的虛擬網卡。

因為RDMA Read的交互相對更復雜,所以我們在兩個虛擬機執行的是ibv_read_bw(ibv_send_bw執行會報錯,原因還未搞清楚):

ib_write_bw -d siw_0 -R -n 5 -s 1500 ib_write_bw -d siw_0 -R -n 5 -s 1500 192.168.217.128

其中,-R表示使用CM建鏈(Socket建鏈不通,原因未知);-n 5表示跑5輪測試,畢竟是個測試性能的工具,循環次數越多,結果越可信。因為我們只關心報文,所以取了perftest迭代次數的最小值5;-s是消息長度,也就是用戶數據的長度,取1500我是為了能夠演示把payload切成多個DDP的數據包,其他值亦可。

所以我們這次跑的測試的內容是:使用CM建鏈,client端從server端使用RDMA Read操作讀回長度為1500的數據,循環5次。

執行完畢后我們來看一下抓包結果,我們只關注其中的DDP/RDMA協議。

Send

取一個Send操作的DDP Segment,首先我們可以看到自上而下是從Ethernet層到DDP/RDMAP層的清晰的層次關系:

這個DDP消息是用來交換雙方的信息的,我們不關注具體內容,只看它的Header。從其中我們可以得到以下信息:

  • 這是一個Untagged Buffer Model的報文
  • 是整個DDP Message的最后一個Segment
  • DDP協議版本是1
  • 接收隊列的QN是0
  • 消息序列號是8,說明之前0號隊列已經接受了7個消息了
  • 消息偏移是0,說明數據會放到Buffer的頭部(也說明這個Message只有1個Segment)

RDMAP和MPA的內容我們會在以后的文章中講解,目前不用關心。

RDMA Read

首先來看Client端發給Server的RDMA Read Request的DDP Message:

還是只看DDP Header部分,發現這也使用了Untagged Buffer,并且只有一個Segment,就不每個字段都解釋了。Read Request本身不攜帶用戶數據,可以看到下面的RDMAP Header中攜帶的是兩端的Buffer的信息。

然后我們來看緊跟其后的RDMA Read Request的DDP Message:

首先比較明顯的是,這個Message包含兩個Segment:

Segment 1

Segment 2

它們使用的是Tagged Buffer Model,使用相同的STag,TO偏移相差0x594(1428)。

我們重點來看一下這個TO是怎么來的。

環境中兩端虛擬機網卡的MTU都是1500,說明Ethernet層之上的內容,需要切割成1500字節為單位的單元。因為要包含各層的Header以及校驗信息,所以最終的Payload肯定不能是1500。

只需要用1500減去各種控制信息,我們就可以知道負載的長度:

1500 - 20 - 32 - 2- 14 - 4 = 1428

這里的TCP Header中包含了可選項Timestamp,所以長度不是20字節,而是32字節。

所以第一個DDP Segment只能承載1428字節的Payload,剩余的72個字節要放到第二個Segment中。

另外我們從上面的抓包結果我們也可以看出,正如RFC 5042中指出的那樣,DDP Untagged Buffer Model通常都用于傳遞一些控制信息,數據讀寫更多的還是使用Tagged Buffer Model。

除了上述內容外,RFC 5041還介紹了DDP流的建立和銷毀、錯誤檢測和安全機制等內容。我將在RDMAP的文章中一并講解。

好了,本文就到這里,下一篇打算介紹iWARP和Soft-iWARP或者RDMAP。

參考資料

[1]?RFC 5041

[2]?RFC 5042

[3] Understanding iWARP.?https://www.intel.com/content/dam/support/us/en/documents/network/sb/understanding_iwarp_final.pdf

總結

以上是生活随笔為你收集整理的【RDMA】16. RDMA之DDP(Direct Data Placement)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产综合自拍 | 麻豆视频污 | 中文字幕一区二区三区人妻四季 | www.youjizz.com视频| 亚洲一区二区三区在线播放 | 人妻av一区二区三区 | 日韩视频在线观看一区 | 亚洲精品1区2区3区 国产丝袜网站 | av中字| www.亚洲高清 | 国产一区二区三区影院 | 日韩欧美成人网 | 光明影院手机版在线观看免费 | 色狠狠一区二区 | 高清不卡一区二区三区 | 手机看片1024国产 | 亚洲中文一区二区 | 手机在线一区 | 红猫大本营在线观看的 | 久久丫精品国产亚洲av不卡 | 韩日欧美 | 2025av在线播放| 一区二区三区高清在线 | 成人高清视频免费观看 | 黑人操亚洲女人 | 一级aaaa毛片 | 女生下面流水视频 | 99国产精品无码 | 六月色丁香 | 狠狠干狠狠搞 | 午夜在线观看视频18 | 亚洲精品久久久久久 | 久久青草热 | 麻豆影音先锋 | 国产乱淫av公 | 国产精品高潮呻吟久久aⅴ码 | 久久精品a亚洲国产v高清不卡 | 在线视频免费观看一区 | 天天做天天爱夜夜爽 | 伊人五月综合 | 神马午夜国产 | 国产三级国产精品国产专区50 | 最污网站在线观看 | 精品嫩模一区二区三区 | 久久中文字幕视频 | av在线播放器 | 久久成人一区 | 色妹子综合 | xxsm.com| 日本精品免费视频 | 国产精品一区无码 | 美景之屋电影免费高清完整韩剧 | 98久久| eeuss日韩 | 女女互慰吃奶互揉调教捆绑 | 一级黄色免费片 | 国精产品乱码一区一区三区四区 | 欧美日韩一区二区精品 | 人人澡超碰碰 | 国产乱码精品一区二区三区忘忧草 | 欧美亚洲国产成人 | 精品xxxx| 欧美亚洲免费 | 日韩一区精品 | 福利在线视频导航 | 国外成人性视频免费 | 精品国产露脸精彩对白 | 古风h啪肉h文 | 中国美女黄色 | 国产xxx69麻豆国语对白 | 91在线亚洲 | 亚洲综合精品一区 | 亚洲国产欧美视频 | 亚洲a网站 | 夜夜嗨aⅴ一区二区三区 | 懂色av色吟av夜夜嗨 | 国产黄色录像 | 日韩av在线一区二区 | 国产黄色大片 | 亚洲骚片| 欧美日韩一区在线播放 | 欧洲中文字幕日韩精品成人 | 香蕉网址 | 欧美永久精品 | 亚洲免费精品 | 国产麻豆剧传媒精品国产av | 午夜毛片电影 | 成人片在线视频 | 亚洲精品久久久中文字幕痴女 | 国产乱强伦一区二区三区 | 国产老头户外野战xxxxx | 婷婷网五月天 | 国产成人在线免费观看视频 | 中文字幕25页 | 国产精品国产三级国产专区53 | www视频在线观看免费 | 国产一区二区电影 | 日韩久久久久久 | 精品成人在线视频 |