青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

使用 SCTP 優化網絡

轉載自:http://www.ibm.com/developerworks/cn/linux/l-sctp/

SCTP 是在 IP 網絡上使用的一種可靠的通用傳輸層協議。盡管 SCTP 協議最初是為發送電話信號而設計的(RFC 2960),但帶來了一個意外的收獲:它通過借鑒 UDP 的優點解決了 TCP 的某些局限。SCTP 提供的特性使套接字初始化的可用性、可靠性和安全性都得以提高。(圖 1 給出了 IP 堆棧的層次化架構。)


圖 1. IP 棧的層次化架構
IP 棧的層次化架構 

本文簡要介紹了 Linux 2.6 內核中 SCTP 的概念,重點介紹了一些高級特性(例如多宿主和多流),并且給出了服務器和客戶機的部分代碼片斷(并給出了一個可以獲得更多代碼的 URL),從而展示了這種協議提供多流的能力。

下面讓我們開始介紹 IP 堆棧的內容。

IP 堆棧

Internet 協議套件被劃分成幾層;每層都提供特定功能,如圖 1 所示。

自下而上:

  • 鏈路層(link layer) 提供了通信介質的物理接口(例如以太網設備)。
  • 網絡層(network layer) 負責管理網絡中的報文移動,具體來說就是確保報文都到達自己的目標(也稱為路由)。
  • 傳輸層(transport layer) 為應用層控制了報文在兩臺主機之間的流動。它還代表通信的應用程序端點,稱為 端口(port)。
  • 最后,應用層(application layer) 對通過套接字傳遞數據具有深刻的意義。這些數據可能包括通過簡單郵件傳輸協議(Simple Mail Transport Protocol,SMTP)發送的 e-mail 消息,或通過超文本傳輸協議(Hypertext Transport Protocol,HTTP)呈現的 Web 頁面。

所有應用層協議都使用套接字層作為與傳輸層協議之間的接口。Sockets API 是由 UC Berkeley 在 BSD UNIX® 操作系統上開發的。

在深入鉆研 SCTP 之前,讓我們首先簡單回顧一下傳統的傳輸層協議。

傳輸層協議

兩種最流行的傳輸層協議是傳輸控制協議(TCP)和用戶數據報協議(UDP):

  • TCP 是一種可靠的協議,它可以確保有序地發送數據,并管理網絡中的擁塞問題。
  • UDP 是一種面向消息的協議,它不能確保有序地發送數據,也無法管理網絡擁塞的問題。

然而,UDP 是一種快速協議,可以保護自己傳輸的消息的邊界。

本文引出了另外一個選擇:SCTP。它提供了像 TCP 一樣可靠、有序地發送數據的功能,但卻以像 UDP 一樣面向消息的方式來進行操作,這可以保護消息邊界。SCTP 還提供了幾個高級特性:

  • 多宿主(Multi-homing)
  • 多流(Multi-streaming)
  • 初始化保護(Initiation protection)
  • 消息分幀(Message framing)
  • 可配置的無序發送(Configurable unordered delivery)
  • 平滑關閉(Graceful shutdown)

SCTP 的關鍵特性

SCTP 相對于傳統的傳輸層協議來說,兩個重要的增強是終端主機的多宿主和多流功能。

多宿主

多宿主 為應用程序提供了比 TCP 更高的可用性。多宿主主機就是一臺具有多個網絡接口的主機,因此可以通過多個 IP 地址來訪問這臺主機。在 TCP 中,連接(connection) 是指兩個端點之間的一個通道(在這種情況下,就是兩臺主機的網絡接口之間的一個套接字)。SCTP 引入了 聯合(association) 的概念,它也是存在于兩臺主機之間,但可以使用每臺主機上的多個接口進行協作。

圖 2 闡述了 TCP 連接與 SCTP 聯合之間的區別。


圖 2. TCP 連接與 SCTP 聯合
TCP 連接與 SCTP 聯合 

該圖的上面部分是 TCP 連接,每個主機都只包含一個網絡接口;連接是在每個客戶機和服務器之間的單個接口之間建立的。在建立連接時,就被綁定到了每個接口上。

在該圖的下面部分中,您可以看到這樣一個架構:每臺主機上都包含兩個網絡接口。通過獨立網絡提供了兩條路徑,一條是從接口 C0 到 S0,另外一條是從接口 C1 到 S1。在 SCTP 中,這兩條路徑可以合并到一個聯合中。

SCTP 負責使用內嵌的 heartbeat 機制來監視聯合的路徑;在檢測到一條路徑失效時,協議就會通過另外一條路徑來發送通信數據。應用程序甚至都不必知道發生了故障恢復。

故障轉移也可以用于維護網絡應用程序的連通性。例如,讓我們來考慮一臺包含一個無線 802.11 接口和一個以太網接口的筆記本的例子。當筆記本放到固定的位置上時,我們傾向于使用高速的以太網接口(在 SCTP 中稱為 主地址(primary address));但是在這個連接丟失時(例如離開了固定位置),連接可遷移到無線接口上。在返回固定位置時,以太網連接會被重新檢測到,通信就可以在這個接口上恢復。這是一種能提供更高的可用性和可靠性的強大機制。

多流

從某種意義上來講,SCTP 連接與 TCP 連接類似,不同之處只是 SCTP 能夠在一個聯合中支持多流機制。一個聯合中的所有流都是獨立的,但均與該聯合相關(請參見圖 3)。


圖 3. SCTP 聯合與流之間的關系
SCTP 聯合與流之間的關系 

每個流都給定了一個流編號,它被編碼到 SCTP 報文中,通過聯合在網絡上傳送。多流非常重要,因為阻塞的流(例如等待重傳的流會導致報文的丟失)不會影響同一聯合中的其他流。這個問題統稱為 head-of-line blocking(對頭阻塞)。TCP 很容易出現這類阻塞問題。

多流如何在傳輸數據時提供更好的響應性呢?例如,HTTP 協議會在相同套接字上共享控制和數據。Web 客戶機從服務器上請求一個文件,服務器通過相同的連接將這個文件發回給客戶機。多流的 HTTP 服務器可以提供更好的交互能力,因為在聯合中各單獨的流上可以處理多個請求。這種功能可以并行化響應,盡管速度不一定會更快,但可以同時加載 HTML 和圖像映像,從而表現出更好的響應性。

多流處理是 SCTP 的一個重要特性,尤其是在協議的設計中考慮一些控制和數據的問題時更是如此。在 TCP 中,控制和數據通常都是通過相同的連接進行共享的,這可能會產生問題,因為控制報文可能會在數據報之后延時。如果控制和數據被劃分成單獨的流,控制數據就可以以一種更及時的方式進行處理,從而可以更好地利用可用資源。

初始化保護

TCP 和 SCTP 中對新連接的初始化是通過報文握手來完成的。在 TCP 中,這種機制稱為 三次握手(three-way handshake)。客戶機向服務器首先發送一個 SYN 報文(Synchronize 的簡寫),服務器使用一個 SYN-ACK 報文進行響應(Synchronize-Acknowledge)。最后,客戶機使用一個 ACK 報文確認已接收到報文(請參見圖 4)。


圖 4. TCP 和 STCP 握手使用的報文交換
TCP 和 STCP 握手使用的報文交換 

當惡意客戶機使用虛假的源地址來偽造一個 IP 報文時,TCP 就會出現問題了,這會大量 TCP SYN 報文攻擊服務器。服務器在接收SYN 報文之前,要為連接分配資源,但是在大量產生 SYN 報文的情況下,最終會耗盡自己的資源,從而無法處理新的請求。這種情況就稱為 服務拒絕(Denial of Service)(DoS)攻擊。

SCTP 可以通過一種 4 次握手的機制并引入了 cookie 的概念來有效地防止這種攻擊的產生。在 SCTP 中,客戶機使用一個 INIT 報文發起一個連接。服務器使用一個 INIT-ACK 報文進行響應,其中就包括了 cookie(標識這個連接的惟一上下文)。客戶機然后就使用一個 COOKIE-ECHO 報文進行響應,其中包含了服務器所發送的 cookie。現在,服務器要為這個連接分配資源,并通過向客戶機發送一個 COOKIE-ACK 報文對其進行響應。

要解決使用這種 4 次握手機制解決延時數據移動的問題,SCTP 允許把數據包含到 COOKIE-ECHO  COOKIE-ACK 報文中。

消息分幀

使用消息分幀機制,就可以保護消息只在一個邊界內通過 socket 進行通信;這意味著如果客戶機向服務器先發送 100 個字節,然后又發送 50 個字節。那么服務器就會在兩次讀取操作中分別讀取到 100 個字節和 50 個字節。UDP 也是這樣進行操作,這對于面向消息的協議非常有益。

與此不同,TCP 是按照字節流的方式進行操作。如果沒有分幀機制,一端接收到的數據可能比另外一端發送的數據多或少(這會將一次寫操作劃分成多次操作,或者將多次寫操作合并到一個讀操作中)。這種行為需要在 TCP 之上進行操作的面向消息的協議可以在應用層中提供數據緩沖和消息分幀機制(這可能是一項復雜的任務)。

SCTP 在數據傳輸中提供了消息分幀功能。當一端對一個套接字執行寫操作時,可確保對等端讀出的數據大小與此相同(請參見圖 5)。


圖 5. UDP/SCTP 中的消息分幀與面向字節流協議的比較
UDP/SCTP 中的消息分幀與面向字節流協議的比較 

對于面向流的數據來說,例如音頻和視頻數據,可以沒有分幀機制。

可配置的無序發送

SCTP 中的消息的傳輸十分可靠,但未必是按照想要的次序來傳輸的。TCP 可以確保數據是按照次序發送的(考慮到 TCP 是一種流協議,這是一件好事)。UDP 無法確保有序地發送數據。但是如果需要,您也可以在 SCTP 中配置流來接受無序的消息。

這種特性在面向消息的協議中可能非常有用,因為其中的消息都是獨立的,次序并不重要。另外,您可以在一個聯合中按照逐個流配置無序發送。

平滑關閉

TCP 和 SCTP 都是基于連接的協議,而 UDP 則是一種無連接的協議。TCP 和 SCTP 都需要在對等的兩端建立和拆除連接。SCTP 與 TCP 中關閉連接的不同之處在于 TCP 中連接的刪除是半關閉(half-close) 的。

圖 6 給出了 TCP 和 SCTP 的關閉序列。


圖 6. TCP 和 SCTP 的連接結束序列
TCP 和 SCTP 的連接結束序列 

在 TCP 中,一端可以關閉自己這端的 socket(這樣會導致發送一個 FIN 報文),但是仍然可以繼續接收數據。FIN 說明這個端點不會再發送數據,但是在這一端關閉自己這端的套接字之前,它一直可以繼續傳輸數據。應用程序很少使用這種半關閉狀態,因此 SCTP 的設計者就選擇放棄這種狀態,并將其替換成了一個顯式的終結序列。當一端關閉自己的套接字時(導致產生一個 SHUTDOWN原語),對等的兩端全部需要關閉,將來任何一端都不允許再進行數據的移動了。

多流的展示

現在您已經了解了 SCTP 的基本特性了,接下來讓我們來看一下使用 C 編程語言編寫的一個樣例服務器和客戶機,并展示 SCTP 的多流特性。

這個例子開發了一個服務器,它實現了一種形式的日期查詢協議。這個傳統的服務器會在連接上來的客戶機上打印當前時間,但是對于 SCTP 來說,我們會在流 0 上打印本地時間,在流 1 上打印格林威治時間(GMT)。這個例子讓我們可以展示如何使用這些 API 來開發流通信。

圖 7 對整個過程進行了歸納,它不但從套接字 API 的角度展示了應用程序的流程,而且還從客戶機和服務器的角度介紹了它們之間的關系。


圖 7. 在多流日期查詢服務器和客戶機中使用的套接字函數
在多流日期查詢服務器和客戶機中使用的套接字函數 

這些應用程序是在 GNU/Linux 操作系統上開發的,其內核版本是 2.6.11,并且包含了 Linux Kernel SCTP 項目(lksctp)。其中非標準的 socket 函數是在 lksctp 工具包中提供的,這個工具包可以從 SourceForge 上獲得。請參看 參考資料 中的鏈接。

daytime 服務器

清單 1 給出了這個多流 daytime 服務器的代碼。為了可讀性更好,我們在清單 1 中忽略了所有的錯誤檢查,但是 這些展示錯誤檢查機制的代碼 與其他 SCTP 套接字擴展一樣都可以通過給出的鏈接下載到。


清單 1. 使用多流機制為 SCTP 編寫的日期查詢服務器
int main()
{
  int listenSock, connSock, ret;
  struct sockaddr_in servaddr;
  char buffer[MAX_BUFFER+1];
  time_t currentTime;
  /* Create SCTP TCP-Style Socket */
  listenSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );
  /* Accept connections from any interface */
  bzero( (void *)&servaddr, sizeof(servaddr) );
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
  servaddr.sin_port = htons(MY_PORT_NUM);
  /* Bind to the wildcard address (all) and MY_PORT_NUM */
  ret = bind( listenSock,
               (struct sockaddr *)&servaddr, sizeof(servaddr) );
  /* Place the server socket into the listening state */
  listen( listenSock, 5 );
  /* Server loop... */
  while( 1 ) {
    /* Await a new client connection */
    connSock = accept( listenSock,
                        (struct sockaddr *)NULL, (int *)NULL );
    /* New client socket has connected */
    /* Grab the current time */
    currentTime = time(NULL);
    /* Send local time on stream 0 (local time stream) */
    snprintf( buffer, MAX_BUFFER, "%s\n", ctime(&currentTime) );
    ret = sctp_sendmsg( connSock,
                          (void *)buffer, (size_t)strlen(buffer),
                          NULL, 0, 0, 0, LOCALTIME_STREAM, 0, 0 );
    /* Send GMT on stream 1 (GMT stream) */
    snprintf( buffer, MAX_BUFFER, "%s\n",
               asctime( gmtime( &currentTime ) ) );
    ret = sctp_sendmsg( connSock,
                          (void *)buffer, (size_t)strlen(buffer),
                          NULL, 0, 0, 0, GMT_STREAM, 0, 0 );
    /* Close the client connection */
    close( connSock );
  }
  return 0;
}

清單 1 中的服務器首先創建服務器的套接字(使用 IPPROTO_SCTP 來創建一個 SCTP 的一對一的套接字)。然后創建一個 sockaddr 結構,指定這個連接可以從任何本地接口上創建(使用通配符地址 INADDR_ANY)。我們使用 bind 調用將這個 sockaddr 結構綁定到 socket 上,然后將服務器套接字設置成監聽狀態。現在就可以接收到達的連接了。

注意 SCTP 使用了很多與 TCP 和 UDP 相同的套接字 API。在 lksctp 開發工具中還提供了其他一些 API 函數(請參看 參考資料)。

在服務器的循環中,一直等待新客戶機的連接請求。在從 accept 函數返回時,會使用 connSock socket 標識新客戶機的連接。我們使用 time 函數來獲取當前時間,然后使用 snprintf 將其轉換成字符串。使用 sctp_sendmsg 函數(一個非標準的 socket 調用),可以通過指定特定的流程(LOCALTIME_STREAM,將這個字符串發送給客戶機。當發送本地時間字符串之后,我們將使用 GMT 表示的當前時間轉換成一個字符串,然后將其發送到流 GMT_STREAM 上。

現在,日期查詢服務器已經完成了自己的職責,因此我們就可以關閉這個 socket,然后等待一個新的客戶機連接。一切都非常簡單,對嗎?現在讓我們來看一下日期查詢客戶機是如何處理多流的。

日期查詢客戶機

多流客戶機如清單 2 所示。


清單 2. 使用多流機制為 SCTP 編寫的日期查詢客戶機
int main()
{
  int connSock, in, i, flags;
  struct sockaddr_in servaddr;
  struct sctp_sndrcvinfo sndrcvinfo;
  struct sctp_event_subscribe events;
  char buffer[MAX_BUFFER+1];
  /* Create an SCTP TCP-Style Socket */
  connSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );
  /* Specify the peer endpoint to which we'll connect */
  bzero( (void *)&servaddr, sizeof(servaddr) );
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(MY_PORT_NUM);
  servaddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
  /* Connect to the server */
  connect( connSock, (struct sockaddr *)&servaddr, sizeof(servaddr) );
  /* Enable receipt of SCTP Snd/Rcv Data via sctp_recvmsg */
  memset( (void *)&events, 0, sizeof(events) );
  events.sctp_data_io_event = 1;
  setsockopt( connSock, SOL_SCTP, SCTP_EVENTS,
               (const void *)&events, sizeof(events) );
  /* Expect two messages from the peer */
  for (i = 0 ; i < 2 ; i++) {
    in = sctp_recvmsg( connSock, (void *)buffer, sizeof(buffer),
                        (struct sockaddr *)NULL, 0,
                        &sndrcvinfo, &flags );
    /* Null terminate the incoming string */
    buffer[in] = 0;
    if        (sndrcvinfo.sinfo_stream == LOCALTIME_STREAM) {
      printf("(Local) %s\n", buffer);
    } else if (sndrcvinfo.sinfo_stream == GMT_STREAM) {
      printf("(GMT  ) %s\n", buffer);
    }
  }
  /* Close our socket and exit */
  close(connSock);
  return 0;
}

在客戶機中,我們首先創建了一個 SCTP 套接字,然后創建了一個 sockaddr 結構,其中包含了將要連接的端點。connect 函數然后建立一個到服務器的連接。要獲取消息的流編號,SCTP 需要啟用套接字選項 sctp_data_io_event

通過啟用這個選項,我們就可以通過 sctp_recvmsg API 函數接收一條消息,我們還接收到一個包含流編號的 sctp_sndrcvinfo 結構。這個編號讓我們可以區分開流 0(本地時間)和流 1(GMT)的消息。

SCTP 的未來發展

SCTP 是一個相當新的協議,它在 2000 年 10 月份才成為一個 RFC 規范。從那以后,它開始進入所有的主流操作系統,包括 GNU/Linux、BSD 和 Solaris。在 Microsoft® Windows® 操作系統上也有第三方的商業包可以使用。

在獲得高可用性的同時,應用程序也已經開始使用 SCTP 作為自己的主要傳輸機制。諸如 FTP 和 HTTP 之類的傳統應用程序已經在 SCTP 的特性基礎上進行了構建。其他一些協議也正在開始使用 SCTP,例如會話初始化協議(Session Initiation Protocol,SIP)和通用通道信號系統 7(SS7)。在商業領域中,您可以在 Cisco 的 IOS 中找到 SCTP 的影子。

隨著 SCTP 被吸納到 2.6 版本的 Linux 內核中,現在我們可以構建并部署高可用性、高可靠性的網絡應用程序。作為一種基于 IP 的協議,SCTP 不但可以無縫地替換 TCP 和 UDP,而且擴展了很多新服務,例如多宿主、多流,并且對安全性也有了很大的提高。現在您已經了解了 SCTP 的一些高級特性,并且探索了它的一些其他功能。Linux Kernel SCTP 項目(lksctp)提供了可以為您提供輔助的 API 擴展和文檔。


下載

描述 名字 大小 下載方法
Multi-streaming demo source code l-sctp-msdemo.zip 74KB HTTP

關于下載方法的信息


參考資料

學習

獲得產品和技術

討論

關于作者

M. Tim Jones

M. Tim Jones 是一名嵌入式軟件工程師,他是 GNU/Linux Application ProgrammingAI Application Programming BSD Sockets Programming from a Multilanguage Perspective 等書的作者。他的工程背景非常廣泛,從同步宇宙飛船的內核開發到嵌入式架構設計,再到網絡協議的開發。Tim 是 Emulex Corp. 的一名資深軟件工程師。


posted on 2013-09-02 05:06 楊粼波 閱讀(1064) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品免费在线播放| 久久精品人人做人人爽电影蜜月| 亚洲综合色激情五月| 日韩视频亚洲视频| 日韩性生活视频| 亚洲免费视频在线观看| 欧美一进一出视频| 久久久久一本一区二区青青蜜月| 久久一区中文字幕| 亚洲精品一区二区三区四区高清| 中文日韩在线| 久久久午夜电影| 欧美日韩在线精品| 国产在线不卡| 日韩视频不卡| 午夜宅男久久久| 亚洲第一综合天堂另类专| 亚洲精品美女91| 久久激情久久| 国产精品v欧美精品v日本精品动漫 | 亚洲特色特黄| 久久超碰97人人做人人爱| 欧美国产激情二区三区| 亚洲资源av| 欧美日韩国产综合新一区| 国产午夜精品视频免费不卡69堂| 亚洲毛片一区| 免费看亚洲片| 香蕉乱码成人久久天堂爱免费| 欧美激情亚洲精品| 黄色国产精品| 香蕉亚洲视频| 亚洲精一区二区三区| 久久久久久亚洲精品不卡4k岛国| 欧美视频在线免费| 91久久精品国产91久久性色tv | 亚洲欧美中日韩| 亚洲国产精品久久久| 欧美中文字幕视频| 国产精品乱子久久久久| 夜夜爽99久久国产综合精品女不卡| 久久久噜噜噜久噜久久| 一本一本久久a久久精品综合妖精| 久久综合九色九九| 国产中文一区| 欧美一区二区免费| 亚洲影视在线播放| 国产精品久久久久久久久果冻传媒 | 99ri日韩精品视频| 久久久另类综合| 国产亚洲人成a一在线v站| 亚洲一区在线观看视频| 亚洲电影第1页| 久久天堂国产精品| 在线观看视频亚洲| 免费视频最近日韩| 老司机亚洲精品| 亚洲国产精品久久精品怡红院| 久久国产直播| 久久精品99无色码中文字幕| 国产一区二区欧美| 久久av在线看| 欧美在线视频二区| 在线精品亚洲| 欧美成人免费在线| 欧美成人免费网| 日韩视频在线一区二区| 亚洲三级网站| 国产精品免费看片| 久久激情综合| 久久久青草婷婷精品综合日韩| 91久久国产综合久久| 亚洲人久久久| 欧美日韩在线视频一区二区| 亚洲欧美日韩直播| 欧美与欧洲交xxxx免费观看 | 亚洲一区二区三区色| 一区二区三区精密机械公司| 欧美视频一区在线观看| 欧美一区二区三区免费大片| 午夜影视日本亚洲欧洲精品| 国内精品久久久久久久影视麻豆| 欧美 日韩 国产精品免费观看| 免费亚洲一区二区| 亚洲一区二区免费| 性色av香蕉一区二区| 亚洲国产精品va在线看黑人动漫 | 一区二区毛片| 先锋a资源在线看亚洲| 在线观看精品| 亚洲免费观看高清完整版在线观看| 国产精品三区www17con| 毛片基地黄久久久久久天堂| 欧美日本中文| 久久国产精品亚洲77777| 欧美xxxx在线观看| 一卡二卡3卡四卡高清精品视频| 亚洲日本理论电影| 亚洲夜晚福利在线观看| 精品成人一区二区三区| 国产精品女人网站| 国产精品美女黄网| 欧美激情 亚洲a∨综合| 国产精品欧美日韩一区| 亚洲东热激情| 国产一区二区成人| 亚洲精品一区二区在线观看| 国产综合色精品一区二区三区| 亚洲精品美女在线| 在线观看一区二区视频| 亚洲五月六月| 一区二区三区免费在线观看| 久久综合九色综合欧美狠狠| 亚洲欧美资源在线| 欧美日韩国产精品| 欧美粗暴jizz性欧美20| 国产日韩欧美二区| 亚洲视频网站在线观看| 欧美成人亚洲| 久久影院亚洲| 国产亚洲人成a一在线v站| 亚洲一区在线播放| 亚洲影院高清在线| 欧美日韩一区二区精品| 最新中文字幕一区二区三区| 伊大人香蕉综合8在线视| 欧美一区二区三区啪啪| 亚洲欧美日韩一区二区| 欧美日韩91| 亚洲国产精品ⅴa在线观看| 一区二区三区亚洲| 久久精品夜色噜噜亚洲a∨| 欧美一区二区三区在线看| 欧美日韩一区二区三区四区在线观看 | 在线成人激情黄色| 久久米奇亚洲| 欧美承认网站| 亚洲日本va午夜在线电影| 欧美ed2k| 亚洲经典在线| 亚洲色诱最新| 国产精品久久久久一区| 亚洲免费视频网站| 久久精品91久久香蕉加勒比| 国产一区二区中文字幕免费看| 亚洲欧美在线免费| 狂野欧美激情性xxxx| 亚洲人在线视频| 欧美日韩1234| 亚洲欧美成人精品| 久久视频在线看| 亚洲黄色av一区| 欧美日一区二区三区在线观看国产免| 亚洲精品视频在线观看免费| 亚洲一区3d动漫同人无遮挡| 国产精品热久久久久夜色精品三区| 亚洲欧洲av一区二区| 久久一区中文字幕| 亚洲精品一区二区三区av| 欧美日本精品在线| 亚洲女人天堂成人av在线| 久久只精品国产| 99国产一区| 国产婷婷色综合av蜜臀av| 久久这里有精品15一区二区三区| 亚洲黄色小视频| 狠狠色狠狠色综合| 欧美成年视频| 一区二区欧美在线| 麻豆精品视频在线观看| 99视频精品| 国产综合精品一区| 欧美日韩成人综合在线一区二区| 亚洲一区久久久| 欧美国产一区视频在线观看| 亚洲欧美久久久久一区二区三区| 一区二区视频在线观看| 欧美亚男人的天堂| 久热这里只精品99re8久| 一本一本大道香蕉久在线精品| 久久亚洲图片| 亚洲综合不卡| 亚洲靠逼com| 黑人中文字幕一区二区三区| 欧美视频在线看| 欧美国产激情二区三区| 欧美一区二区三区在线观看视频| 亚洲美女尤物影院| 农夫在线精品视频免费观看| 羞羞漫画18久久大片| 日韩亚洲精品电影| 在线播放亚洲| 国产中文一区二区| 国产精品乱子乱xxxx| 欧美日韩福利视频| 麻豆成人小视频| 久久一综合视频| 久久精品国产v日韩v亚洲| 亚洲影院色在线观看免费| 99精品视频免费|