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

還在為慢速數據傳輸苦惱?Linux 零拷貝技術來幫你!

系統(tǒng) Linux
今天這篇文章,我就用最通俗的語言講解零拷貝的工作原理、常見實現(xiàn)方式和實際應用,徹底幫你搞懂這項技術!

程序員的終極追求是什么?當系統(tǒng)流量大增,用戶體驗卻絲滑依舊?沒錯!然而,在大量文件傳輸、數據傳遞的場景中,傳統(tǒng)的“數據搬運”卻拖慢了性能。為了解決這一痛點,Linux 推出了 零拷貝 技術,讓數據高效傳輸幾乎無需 CPU 操心。今天,我就用最通俗的語言講解零拷貝的工作原理、常見實現(xiàn)方式和實際應用,徹底幫你搞懂這項技術!

一、傳統(tǒng)拷貝:數據搬運的“舊時代”

為了理解零拷貝,我們先看看傳統(tǒng)數據傳輸的工作方式。想象一下,我們需要把一個大文件從硬盤讀取后發(fā)送到網絡上。這聽起來很簡單,但實際上,傳統(tǒng)的數據傳輸涉及多個步驟并占用大量 CPU 資源。

1. 一個典型的文件傳輸過程(沒有 DMA 技術):

假設我們要將一個大文件從硬盤讀取后發(fā)送到網絡。以下是傳統(tǒng)拷貝方式的詳細步驟:

  • 讀取數據到內核緩沖區(qū):使用 read() 系統(tǒng)調用,數據從硬盤讀取到內核緩沖區(qū)。此時,CPU 需要協(xié)調和執(zhí)行相關指令來完成這一步。
  • 拷貝數據到用戶緩沖區(qū):數據從內核緩沖區(qū)被拷貝到用戶空間的緩沖區(qū)。這一步由 read() 調用觸發(fā),CPU 完全負責這次數據拷貝。
  • 寫入數據到內核緩沖區(qū):通過 write() 系統(tǒng)調用,數據從用戶緩沖區(qū)被再次拷貝回內核緩沖區(qū)。CPU 再次介入并負責數據拷貝。
  • 傳輸數據到網卡:最終,內核緩沖區(qū)的數據被傳輸到網卡,發(fā)送到網絡。如果沒有 DMA 技術,CPU 需要拷貝數據至網卡。

2. 來看個圖,更直觀點:

3. 數據傳輸的“四次拷貝”

在這個過程中,數據在系統(tǒng)中經歷了四次拷貝:

  • 硬盤 -> 內核緩沖區(qū)(CPU 參與,負責數據讀取和傳輸)
  • 內核緩沖區(qū) -> 用戶緩沖區(qū)(read() 調用觸發(fā),CPU 負責拷貝)
  • 用戶緩沖區(qū) -> 內核緩沖區(qū)(write() 調用觸發(fā),CPU 負責拷貝)
  • 內核緩沖區(qū) -> 網卡(最終發(fā)送數據,CPU 參與傳輸)

4. 性能瓶頸分析

這種傳統(tǒng)拷貝方式的問題顯而易見:

  • CPU 資源占用高:每次 read() 和 write() 調用都需要 CPU 進行多次數據拷貝,嚴重占用 CPU 資源,影響其他任務的執(zhí)行。
  • 內存占用:當數據量較大時,內存使用量明顯增加,可能導致系統(tǒng)性能下降。
  • 上下文切換開銷:每次 read() 和 write() 調用涉及用戶態(tài)和內核態(tài)的切換,加重了 CPU 的負擔。

這些問題在處理大文件或高頻率傳輸時尤為明顯,CPU 被迫充當“搬運工”,性能因此受到嚴重限制。那么, 有沒有一種方法能夠減少 CPU 的“搬運”工作?此時,DMA(Direct Memory Access,直接內存訪問)技術登場了。

二、DMA:零拷貝的前奏

DMA(Direct Memory Access,直接內存訪問) 是一種讓數據在硬盤和內存之間直接傳輸的技術,不需要 CPU 逐字節(jié)參與。簡單來說,DMA 是 CPU 的“好幫手”,減少了它的工作量。

1. DMA 如何幫 CPU?

在傳統(tǒng)的數據傳輸中,CPU 需要親自把數據從硬盤搬到內存,再送到網絡,這很耗費 CPU 資源。而 DMA 的出現(xiàn)讓 CPU 可以少干活:

  • 硬盤到內核緩沖區(qū):由 DMA 完成,CPU 只需要下指令,DMA 就自動將數據拷貝至內核緩沖區(qū)。
  • 內核緩沖區(qū)到網卡:DMA 也能處理這部分,把數據直接送到網卡,CPU 只需監(jiān)督整體流程。

有了 DMA,CPU 只需要說一句:“嘿,DMA,把數據從硬盤搬到內存去!” 然后 DMA 控制器就會接過這活,自動把數據從硬盤傳到內核緩沖區(qū),CPU 只需要在旁邊監(jiān)督一下。

2. 有了 DMA , 再來看看數據傳輸的過程:

為了更好地理解 DMA 在整個數據搬運中的角色,我們用圖來說明:

說明:

  • DMA 負責硬盤到內核緩沖區(qū)和內核到網卡的傳輸。
  • CPU 仍需處理內核和用戶緩沖區(qū)之間的數據傳輸。

3. 哪些步驟仍需 CPU 參與?

雖然 DMA 能幫 CPU 分擔一些任務,但它并不能全權代理所有數據拷貝工作。CPU 還是得負責以下兩件事:

  • 內核緩沖區(qū)到用戶緩沖區(qū):數據需要被 CPU 拷貝到用戶空間供程序使用。
  • 用戶緩沖區(qū)回到內核緩沖區(qū):程序處理完數據后,CPU 還得把數據拷回內核,準備進行后續(xù)傳輸。

就像請了一個幫手,但有些細致活兒還得自己干。所以,在高并發(fā)或大文件傳輸時,CPU 依舊會因為這些拷貝任務感到壓力。

4. 總結一下

總結來說,DMA 確實減輕了 CPU 在數據傳輸中的負擔,讓數據從硬盤傳輸到內核緩沖區(qū)和內核緩沖區(qū)到網卡時幾乎無需 CPU 的參與。然而,DMA 無法徹底解決數據在內核和用戶空間之間的拷貝問題。CPU 依然需要進行兩次數據搬運,特別是在高并發(fā)和大文件傳輸場景下,這個限制變得尤為突出。

三、零拷貝:讓數據“直達”

因此,為了進一步減少 CPU 的參與,提升傳輸效率,Linux 推出了 零拷貝 技術。這項技術的核心目標是:讓數據在內核空間內直接流轉,避免在用戶空間的冗余拷貝,從而最大限度減少 CPU 的內存拷貝操作,提高系統(tǒng)性能。

接下來,我們來詳細看看 Linux 中的幾種主要零拷貝實現(xiàn)方式:

注意:Linux 中零拷貝技術的實現(xiàn)需要硬件支持 DMA。

1. sendfile:最早的零拷貝方式

sendfile 是最早在 Linux 中引入的零拷貝方式,專為文件傳輸設計。

2. sendfile 的工作流程

  • DMA(直接內存訪問)直接將文件數據加載到內核緩沖區(qū)。
  • 數據從內核緩沖區(qū)直接進入網絡協(xié)議棧中的 socket 內核緩沖區(qū)。
  • 數據通過網絡協(xié)議棧處理后,通過網卡直接發(fā)往網絡。

通過 sendfile,整個傳輸過程 CPU 只需要一次數據拷貝,減少了 CPU 的使用。

3. 簡單圖解:

sendfile 圖解說明:

  • 從硬盤讀取數據:文件數據通過 DMA 從硬盤讀取,直接加載到內核緩沖區(qū),這個過程不需要 CPU 的參與。
  • 拷貝數據至網絡協(xié)議棧的 socket 緩沖區(qū):數據不進入用戶空間,而是從內核緩沖區(qū)直接進入網絡協(xié)議棧中的 socket 緩沖區(qū),在這里經過必要的協(xié)議處理(如 TCP/IP 封裝)。
  • 數據通過網卡發(fā)送:數據最終通過網卡直接發(fā)往網絡。

4. sendfile 接口說明

sendfile函數定義如下:

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
  • out_fd:目標文件描述符,一般是 socket 描述符,用于網絡發(fā)送。
  • in_fd:源文件描述符,通常是從硬盤讀取的文件。
  • offset:偏移量指針,用于指定從文件的哪個位置開始讀取。如果為 NULL,則從當前偏移位置開始讀取。
  • count:要傳輸的字節(jié)數。

返回值是實際傳輸的字節(jié)數,出錯時返回 -1,并設置 errno 來指示錯誤原因。

5. 簡單代碼示例

#include <sys/sendfile.h>

int main() {
    int input_fd = open("input.txt", O_RDONLY);
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 3);
    int client_fd = accept(server_fd, NULL, NULL);

    sendfile(client_fd, input_fd, NULL, 1024);

    close(input_fd);
    close(client_fd);
    close(server_fd);

    return 0;
}

這個例子展示了如何使用 sendfile 將本地文件發(fā)送到一個通過網絡連接的客戶端。只需要調用 sendfile,數據就能從 input_fd 直接傳輸到 output_fd。

6. 適用場景

sendfile 主要用于將文件數據直接傳輸到網絡,非常適合需要高效傳輸大文件的情況,例如文件服務器、流媒體傳輸、備份系統(tǒng)等。

在傳統(tǒng)的數據傳輸方式中,數據需要經過多個步驟:

  • 首先,數據從硬盤讀取到內核空間。
  • 然后,數據從內核空間拷貝到用戶空間。
  • 最后,數據從用戶空間再拷貝回內核,送到網卡發(fā)出去。

總結來說: sendfile 可以讓數據傳輸更加高效,減少 CPU 的干預,特別適合簡單的大文件傳輸場景。然而,如果遇到更復雜的傳輸需求,比如要在多個不同類型的文件描述符之間移動數據,splice 則提供了一種更加靈活的方法。接下來我們來看看 splice 是如何實現(xiàn)這一點的。

四、splice :管道式零拷貝

splice 是 Linux 中另一種實現(xiàn)零拷貝的數據傳輸系統(tǒng)調用,專為在不同類型的文件描述符之間高效地移動數據而設計,適用于在內核中直接傳輸數據,減少不必要的拷貝。

1. splice 的工作流程

  • 從文件讀取數據:使用 splice 系統(tǒng)調用將數據從輸入文件描述符(例如硬盤文件)讀取,數據直接通過 DMA(直接內存訪問)進入內核緩沖區(qū)。
  • 傳輸到網絡 socket:隨后,splice 繼續(xù)將內核緩沖區(qū)中的數據直接傳輸到目標網絡 socket 的文件描述符中。

整個過程在內核空間內完成,避免了數據從內核空間到用戶空間的往返拷貝,大大減少了 CPU 的參與,提高了系統(tǒng)性能。

2. 簡單圖解:

和 sendfile 圖解類似,只是接口不一樣。

splice 圖解說明:

數據通過 splice 從文件描述符傳輸到網絡 socket。數據首先通過 DMA 進入內核緩沖區(qū),然后直接傳輸到網絡 socket,整個過程避免了用戶空間的介入,顯著減少了 CPU 的拷貝工作。

3. splice 接口說明

splice 函數的定義如下:

ssize_t splice(int fd_in, loff_t *off_in, int fd_out, loff_t *off_out, size_t len, unsigned int flags);
  • fd_in:源文件描述符,數據從這里讀取。
  • off_in:指向源偏移量的指針,如果為 NULL,則使用當前偏移量。
  • fd_out:目標文件描述符,數據將被寫入這里。
  • off_out:指向目標偏移量的指針,如果為 NULL,則使用當前偏移量。
  • len:要傳輸的字節(jié)數。
  • flags:控制行為的標志,例如 SPLICE_F_MOVE、SPLICE_F_MORE 等。

返回值是實際傳輸的字節(jié)數,出錯時返回 -1,并設置 errno 來指示錯誤原因。

4. 簡單代碼示例

int main() {
    int input_fd = open("input.txt", O_RDONLY);
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 3);
    int client_fd = accept(server_fd, NULL, NULL);

    splice(input_fd, NULL, client_fd, NULL, 1024, SPLICE_F_MORE);

    close(input_fd);
    close(client_fd);
    close(server_fd);

    return 0;
}

這個例子展示了如何使用 splice 將本地文件直接發(fā)送到網絡 socket,以實現(xiàn)高效的數據傳輸。

5. 適用場景

splice 適用于在文件描述符之間進行高效、直接的數據傳輸,例如從文件到網絡 socket 的傳輸,或在文件、管道和 socket 之間傳遞數據。在這種情況下,數據在內核空間內完成傳輸,無需進入用戶空間,從而顯著減少拷貝次數和 CPU 的參與。另外 splice 特別適合需要靈活數據流動和減少 CPU 負擔的場景,例如日志處理、實時數據流處理等。

6. sendfile 與 splice 的區(qū)別

雖然 sendfile 和 splice 都是 Linux 提供的零拷貝技術,用于高效地在內核空間傳輸數據,但它們在應用場景和功能上存在一些顯著區(qū)別:

數據流動方式:

  • sendfile:直接將文件中的數據從內核緩沖區(qū)傳輸到 socket 緩沖區(qū),適合文件到網絡的傳輸。適合需要簡單高效的文件到網絡的傳輸場景。
  • splice:更靈活,可以在任意文件描述符之間進行數據傳輸,包括文件、管道、socket 等。因此,splice 可以在文件、管道和 socket 之間實現(xiàn)更復雜的數據流轉。

適用場景:

  • sendfile:主要用于文件到網絡的傳輸,非常適合文件服務器、流媒體等需要高效傳輸文件的場景。
  • splice:更適合復雜的數據流動場景,例如在文件、管道和網絡之間需要多步傳輸或靈活控制數據流向的情況。

靈活性:

  • sendfile:用于直接、高效地將文件發(fā)送到網絡,雖然操作單一,但性能非常高效。
  • splice:可以結合管道使用,實現(xiàn)更復雜的數據流向控制,例如先通過管道對數據進行處理,再發(fā)送到目標位置。

五、mmap + write:映射式零拷貝

除了以上兩種方式,mmap + write 也是一種常見的零拷貝實現(xiàn)方式。這種方式主要是通過內存映射來減少數據拷貝的步驟。

1. mmap + write 的工作流程

使用 mmap 系統(tǒng)調用將文件映射到進程的虛擬地址空間中,這樣數據就可以直接在內核空間和用戶空間共享,而不需要額外的拷貝操作。

使用 write 系統(tǒng)調用將映射的內存區(qū)域直接寫入到目標文件描述符中(比如網絡 socket),完成數據傳輸。

這種方式減少了數據拷貝,提高了效率,適合需要靈活操作數據后再發(fā)送的場景。通過這種方式,數據不需要顯式地從內核空間拷貝到用戶空間,而是通過映射的方式共享,從而減少了不必要的拷貝。

2. 簡單圖解:

mmap + write 圖解說明:

  • 使用 mmap 將文件數據映射到進程的虛擬地址空間,避免顯式的數據拷貝。
  • 通過 write 直接將映射的內存區(qū)域數據發(fā)送到目標文件描述符(如網絡 socket)。

3. mmap 接口說明

mmap 函數的定義如下:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  • addr:指定映射內存的起始地址,通常為 NULL 由系統(tǒng)決定。
  • length:要映射的內存區(qū)域的大小。
  • prot:映射區(qū)域的保護標志,例如 PROT_READ、PROT_WRITE。
  • flags:影響映射的屬性,例如 MAP_SHARED、MAP_PRIVATE。
  • fd:文件描述符,指向需要映射的文件。
  • offset:文件中的偏移量,表示從文件的哪個位置開始映射。

返回值為映射內存區(qū)域的指針,出錯時返回 MAP_FAILED,并設置 errno。

4. 簡單代碼示例

int main() {
    int input_fd = open("input.txt", O_RDONLY);
    struct stat file_stat;
    fstat(input_fd, &file_stat);

    char *mapped = mmap(NULL, file_stat.st_size, PROT_READ, MAP_PRIVATE, input_fd, 0);

    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 3);
    int client_fd = accept(server_fd, NULL, NULL);

    write(client_fd, mapped, file_stat.st_size);

    munmap(mapped, file_stat.st_size);
    close(input_fd);
    close(client_fd);
    close(server_fd);

    return 0;
}

這個例子展示了如何使用 mmap 將文件映射到內存,然后通過 write 將數據發(fā)送到網絡連接的客戶端。

5. 適用場景

mmap + write 適用于需要對文件數據進行靈活操作的場景,例如需要在發(fā)送數據前進行修改或部分處理。與 sendfile 相比,mmap + write 提供了更大的靈活性,因為它允許在用戶態(tài)訪問數據內容,這對于需要對文件進行預處理的應用場景非常有用,例如壓縮、加密或者數據轉換等。

然而,這種方式也帶來了更多的開銷,因為數據需要在用戶態(tài)和內核態(tài)之間進行交互,這會增加系統(tǒng)調用的成本。因此,mmap + write 更適合那些需要在數據傳輸前進行一些自定義處理的情況,而不太適合純粹的大文件高效傳輸。

六、tee:數據復制的零拷貝方式

tee 是 Linux 中的一種零拷貝方式,它可以把一個管道中的數據復制到另一個管道,同時保留原管道中的數據。這意味著數據可以同時被發(fā)送到多個目標,而不影響原來的數據流,非常適合日志記錄和實時數據分析等需要把同樣的數據送往不同地方的場景。

1. tee 的工作流程

數據復制到另一個管道:tee 系統(tǒng)調用可以將一個管道中的數據復制到另一個管道,而不改變原有的數據。這意味著數據可以在內核空間中被同時用于不同的目的,而無需經過用戶空間的拷貝。

2. tee 接口說明

tee 函數的定義如下:

ssize_t tee(int fd_in, int fd_out, size_t len, unsigned int flags);
  • fd_in:源管道文件描述符,數據從這里讀取。
  • fd_out:目標管道文件描述符,數據將被寫入這里。
  • len:要復制的字節(jié)數。
  • flags:控制行為的標志,例如 SPLICE_F_NONBLOCK 等。

返回值是實際復制的字節(jié)數,出錯時返回 -1,并設置 errno 來指示錯誤原因。

3. 簡單代碼示例

int main() {
    int pipe_fd[2];
    pipe(pipe_fd);

    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    bind(server_fd, (struct sockaddr *)&address, sizeof(address));
    listen(server_fd, 3);
    int client_fd = accept(server_fd, NULL, NULL);

    // 使用 tee 復制數據
    tee(pipe_fd[0], pipe_fd[1], 1024, 0);
    splice(pipe_fd[0], NULL, client_fd, NULL, 1024, SPLICE_F_MORE);

    close(pipe_fd[0]);
    close(pipe_fd[1]);
    close(client_fd);
    close(server_fd);

    return 0;
}

這個例子展示了如何使用 tee 將管道中的數據復制,并通過 splice 將數據發(fā)送到網絡 socket,從而實現(xiàn)高效的數據傳輸和復制。

4. 適用場景

tee 非常適合需要將數據同時發(fā)送到多個目標的場景,比如實時數據處理、日志記錄等。通過 tee,可以在內核空間內實現(xiàn)多目標數據復制,提高系統(tǒng)性能,減少 CPU 負擔。

總結對比:

下面我將 Linux 的幾種零拷貝方式做了總結,方便大家對比學習:

方法

描述

零拷貝類型

CPU 參與度

適用場景

sendfile

直接將文件數據發(fā)送到套接字,無需拷貝到用戶空間。

完全零拷貝

極少,數據直接傳輸。

文件服務器、視頻流傳輸等大文件場景。

splice

在內核空間內高效地在文件描述符之間傳輸數據。

完全零拷貝

極少,完全在內核內。

文件、管道與 socket 之間的復雜傳輸場景。

mmap + write

將文件映射到內存并使用 write 發(fā)送數據,靈活處理數據

部分零拷貝

中等,需要映射和寫入。

數據需要處理或修改的場景,如壓縮加密。

tee

將管道中的數據復制到另一個管道,無需消耗原始數據。

完全零拷貝

極少,數據復制在內核。

日志處理、實時數據監(jiān)控等多目標場景。

最后

希望這篇文章讓你對 Linux 的零拷貝技術有了更全面、更清晰的了解!這些技術看起來可能有些復雜,但一旦掌握后,你會發(fā)現(xiàn)它們非常簡單, 并且在實際項目中非常實用。

責任編輯:趙寧寧 來源: 跟著小康學編程
相關推薦

2022-02-24 07:03:13

JavaScrip語言

2020-06-12 07:50:15

大數據

2020-05-20 14:38:35

傳輸距離網絡布線

2013-01-17 14:03:32

英特爾光纖數據傳輸

2010-04-07 14:54:38

2023-09-14 08:46:27

零拷貝I/O異步

2013-12-10 10:21:52

光纜數據傳輸脈沖

2020-08-06 08:06:46

物聯(lián)網數據技術

2013-11-26 15:51:45

Android編程藍牙數據傳輸

2015-10-14 09:44:55

TCP網絡協(xié)議數據傳輸

2010-07-13 15:55:12

FTP數據傳輸模式

2023-04-12 16:20:00

同步數據異步數據傳輸

2021-10-08 08:37:38

數據傳輸數據調用網絡協(xié)議

2024-08-05 09:31:00

MySQLDTS數據

2011-03-02 11:23:48

2019-09-06 09:11:36

以太網數據二層交換

2017-05-04 12:48:18

WOT網易NDC

2022-03-30 15:06:25

數據傳輸Harmony源碼分析

2021-12-14 11:01:44

TCPUDP網絡協(xié)議

2021-06-09 11:28:06

加密數據Jsencrypt
點贊
收藏

51CTO技術棧公眾號

91亚洲精品国产| 91精品视频在线免费观看| 小毛片在线观看| 久久夜夜操妹子| 国产精品成人网| 国产综合 伊人色| 波多野结衣一区二区在线 | 欧美日韩国产影片| 国内精品国产三级国产99| 天天av综合网| 韩国av一区二区| 午夜精品一区二区三区在线 | 久久婷婷国产91天堂综合精品| 黄网站免费在线播放| 99精品一区二区三区| 国产精品欧美日韩| 日韩精品一区二区三| 天天射综合网视频| 亚洲欧洲日产国产网站| 亚洲 自拍 另类 欧美 丝袜| 朝桐光一区二区| 亚洲高清免费视频| 综合视频免费看| 国产在线日本| 99久久99久久精品国产片果冻 | 麻豆国产精品va在线观看不卡| a视频免费观看| 天堂精品在线视频| 欧美日韩色综合| 熟女性饥渴一区二区三区| 欧美野外wwwxxx| 中文字幕在线免费不卡| 日韩av高清| 亚洲 欧美 激情 另类| 国产精品亚洲第一 | 视频精品二区| 69堂国产成人免费视频| 手机在线免费观看毛片| 午夜激情在线播放| 亚洲h在线观看| 黄网站色视频免费观看| 欧美激情黑人| 亚洲视频一二三| 亚洲欧美日韩在线综合| 国产福利电影在线| 国产婷婷精品av在线| 精品无人区一区二区三区| 午夜精品久久久久久久99| 国产综合久久久久久鬼色| 91精品久久久久久| 亚洲在线观看av| 久久精品99国产精品| 国产精品老女人视频| 久久久久久无码精品大片| 欧美专区在线| 国产成人avxxxxx在线看| 久久久免费高清视频| 欧美亚洲一区二区三区| 欧美一区二区色| 中文字幕国产在线观看| 日韩精品五月天| 国产精品高清网站| 中文在线最新版天堂| 日本免费在线视频不卡一不卡二| 国产精品久久久久久久午夜| 中文字幕av网站| 精品系列免费在线观看| 91gao视频| 日本高清视频免费观看| 91在线看国产| 日韩三级电影免费观看| 亚洲s色大片| 亚洲欧美国产三级| 久久这里只有精品18| 女人高潮被爽到呻吟在线观看| 日韩欧美在线观看视频| 超碰影院在线观看| 欧洲亚洲精品久久久久| 日韩免费性生活视频播放| 污污免费在线观看| 国产精品自拍区| 北条麻妃久久精品| 激情综合网五月婷婷| 亚洲专区一区| 成人黄色片在线| 日本人妻丰满熟妇久久久久久| 2021国产精品久久精品| 视频一区二区在线| 性欧美猛交videos| 欧美性xxxx在线播放| 亚洲污视频在线观看| aiss精品大尺度系列| 亚洲网站在线播放| 青娱乐在线视频免费观看| 亚洲欧美日韩国产一区| 国产日韩欧美中文在线播放| 粉嫩av一区二区夜夜嗨| 国产亚洲人成网站| 黄色成人在线免费观看| 欧美特黄aaaaaaaa大片| 日韩一级免费一区| 人人妻人人澡人人爽| 国产精品v欧美精品v日本精品动漫| 欧洲一区二区视频| a级片在线视频| 久久精品视频一区二区三区| 警花观音坐莲激情销魂小说 | 日本精品视频在线观看| 精品国自产在线观看| 日本一区免费视频| 五十路熟女丰满大屁股| 亚洲成人a级片| 日韩乱码在线视频| 免费又黄又爽又色的视频| 日本午夜精品一区二区三区电影| 国产精品免费一区二区三区观看| eeuss影院www在线播放| 欧美午夜片欧美片在线观看| 男生和女生一起差差差视频| 亚洲色图丝袜| 久久久久久久久网站| 国产精品一级视频| 欧美激情一区二区三区不卡| 久久国产成人精品国产成人亚洲| 日本综合精品一区| 日韩视频中文字幕| 亚洲免费视频二区| 26uuu另类欧美亚洲曰本| 妞干网在线播放| 免费看日产一区二区三区| 亚洲国产美女搞黄色| 国内精品久久久久伊人av| 丰满熟女人妻一区二区三| 精品麻豆一区二区三区| 一区二区三区伦理| 625成人欧美午夜电影| 欧美天堂在线| 国产高清视频在线| 亚洲天堂一区二区三区四区| 国产91在线播放精品91| 免费国产精品视频| 亚洲你懂的在线视频| 亚洲精品视频导航| 思热99re视热频这里只精品| 久久久久久久久久久亚洲| av手机免费看| 亚洲黄一区二区三区| 激情图片中文字幕| 首页国产精品| 国产综合福利在线| 免费在线观看av片| 欧美日韩国产免费一区二区| 女人黄色一级片| 日韩av午夜在线观看| 日韩欧美一区二区在线观看| 69堂免费精品视频在线播放| 亚洲视频在线看| 中文在线观看免费高清| 国产精品麻豆久久久| 国产一区二区在线观看免费视频| 欧美大黑bbbbbbbbb在线| 国产欧美日韩免费| 欧美一级二级三级区| 777色狠狠一区二区三区| 亚洲二区在线播放| 国产麻豆成人传媒免费观看| 大西瓜av在线| 美女福利一区| 国产成人精品优优av| 亚洲成人影院麻豆| 欧美一区二区三区四区在线观看| 欧美 日韩 国产 一区二区三区| 国产伦精品一区二区三区在线观看| 日韩国产小视频| 婷婷精品在线观看| 国产精品露脸自拍| 污影院在线观看| 亚洲精品在线观看www| 中文字幕+乱码+中文乱码www | 国产精品s色| 国产欧美日韩一区| 高清不卡亚洲| www.日韩视频| 亚洲免费国产视频| 在线精品观看国产| 日韩精品123区| 成人精品gif动图一区| 黄色国产精品视频| 亚洲v在线看| 久久久久高清| 97精品资源在线观看| 久久欧美在线电影| 日本a级在线| 亚洲精品美女久久久| 在线免费av网| 亚洲h精品动漫在线观看| 久久精品三级视频| 成人午夜免费电影| 在线免费观看视频黄| 黄色日韩在线| 欧洲精品久久| 久久97精品| 91精品国产综合久久香蕉922| 2018av在线| 日韩亚洲欧美成人| 日韩精品系列| 日韩一区二区三区三四区视频在线观看 | 在线观看黄色国产| 天天影视涩香欲综合网| 在线观看天堂av| 91丨porny丨最新| 日韩欧美中文视频| 免费人成在线不卡| 久久无码高潮喷水| 国产精品s色| 裸体大乳女做爰69| 不卡av一区二区| 久久久久天天天天| 超碰一区二区三区| 亚洲va久久久噜噜噜久久天堂| 国产精品一区二区av影院萌芽| 欧美第一淫aaasss性| 日本中文字幕视频在线| 亚洲人成电影网站色www| 黄色aaa大片| 91精品国产综合久久福利软件| 久草视频在线免费| 精品久久久久久| 久久久久99精品成人片毛片| 国产精品成人午夜| 日本黄色激情视频| 久久精品欧美一区二区三区麻豆| 久久久久亚洲AV成人无码国产| 国产揄拍国内精品对白| 亚洲欧美日韩精品一区| 男人操女人的视频在线观看欧美| 女人和拘做爰正片视频| 在线欧美一区| av女优在线播放| 国产精品mv在线观看| 激情五月六月婷婷| 欧美影视一区| av动漫在线播放| 欧美精品导航| 日韩精品久久一区二区| 国产精品久久| 欧美精品久久久久久久自慰| 亚洲网站在线| 99在线免费视频观看| 好吊视频一区二区三区四区| 800av在线免费观看| 极品av少妇一区二区| 免费无码毛片一区二三区| 亚洲精品乱码| 夫妻免费无码v看片| 久久成人一区| 国产精品人人爽人人爽| 久久99蜜桃精品| 自拍一级黄色片| 国产不卡视频在线观看| 韩国三级视频在线观看| 处破女av一区二区| 免费成人蒂法网站| 久久九九久精品国产免费直播| 一道本在线观看| 国产精品久久久久婷婷| 国产人妻精品一区二区三区不卡| 亚洲卡通动漫在线| 国产无遮挡又黄又爽又色| 亚洲不卡在线观看| 日本视频在线观看免费| 欧美日韩情趣电影| 国产毛片在线视频| 精品国产一区二区三区av性色| 亚洲av激情无码专区在线播放| 亚洲欧美在线免费观看| 91在线直播| 欧美另类高清videos| 国产精选在线| 国产精品啪视频| 久久伦理中文字幕| 极品日韩久久| 日韩av有码| 国产肉体ⅹxxx137大胆| 久久久久久9| 色婷婷综合在线观看| 成人av免费网站| 91精品国自产在线| 一区二区三区中文字幕精品精品| 国产精品黄色大片| 精品视频1区2区| 亚洲成a人片在线| 亚洲欧美视频在线| 老司机免费在线视频| 欧美交受高潮1| 99精品国自产在线| 成人女人免费毛片| 欧美伦理影院| 日韩欧美猛交xxxxx无码| 六月天综合网| 女王人厕视频2ⅴk| 久久久久久99久久久精品网站| 国产大屁股喷水视频在线观看| 久久亚洲精精品中文字幕早川悠里| 久久久久久免费精品| 国产黄在线观看免费观看不卡| 欧美成人免费小视频| 亚洲一级少妇| 97超碰资源| 精品日本12videosex| 国产精品无码电影在线观看 | 熟妇人妻va精品中文字幕| 国内精品久久久久影院一蜜桃| 人妻大战黑人白浆狂泄| 亚洲蜜臀av乱码久久精品| 中文字幕国产在线观看| 欧美成人vr18sexvr| 午夜小视频在线| 欧美一级在线播放| 一区二区三区视频免费视频观看网站| 性高潮久久久久久久久| 亚洲综合日韩| 日韩成人av影院| 亚洲欧美乱综合| 一级黄色大毛片| 国产亚洲欧美视频| 午夜影院在线播放| 国产在线播放一区二区| 欧美成人国产| 五月天视频在线观看| 久久精品一区蜜桃臀影院| 国产福利拍拍拍| 精品成人私密视频| 免费污视频在线观看| 亚洲一区亚洲二区| 999视频精品| 国产九九在线视频| 日本一区二区三区dvd视频在线 | 性猛交ⅹxxx富婆video | av动漫在线看| www.亚洲国产| 日韩少妇高潮抽搐| 精品国产一二三区| 色a资源在线| 99视频国产精品免费观看| 围产精品久久久久久久| 欧美视频亚洲图片| 亚洲男人电影天堂| a网站在线观看| 色中色综合影院手机版在线观看 | 日韩黄色在线观看| 国产精品一二三区在线观看| 色婷婷综合久色| 福利成人在线观看| 国产欧美一区二区三区视频 | 91美女在线视频| 午夜精品久久久久久久久久久久久蜜桃 | 欧美富婆性猛交| 97久久综合区小说区图片区| 日韩人妻无码精品久久久不卡| 成人黄色综合网站| 97免费在线观看视频| 日韩久久免费视频| 成人日韩精品| 伊人久久99| 国产精品一区二区免费不卡| 久草视频免费在线| 亚洲成人激情在线观看| 亚洲女同志freevdieo| 日本一区免费观看| 久久er精品视频| 久久久久久久久久久97| 日韩极品精品视频免费观看| 性欧美18一19sex性欧美| 一本一道久久a久久综合精品| 激情综合色播五月| 精品一区在线视频| 亚洲精品一区久久久久久| 青青热久免费精品视频在线18| 樱花www成人免费视频| 成人中文字幕电影| 亚洲 欧美 中文字幕| 久久精品国产96久久久香蕉| 97青娱国产盛宴精品视频| 人妻无码视频一区二区三区| 亚洲视频一区在线观看| 少妇av一区二区| 国产经典一区二区| 真实国产乱子伦精品一区二区三区| 午夜视频在线观看国产| 欧美图片一区二区三区| 第一中文字幕在线| 色姑娘综合网| 粉嫩av一区二区三区| 神马久久久久久久| 欧美精品生活片| 成人精品久久| 精品人妻一区二区三区日产| 欧美日韩中文字幕一区二区| heyzo在线|