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

從Linux源碼看Socket的Close

系統(tǒng) Linux
筆者一直覺得如果能知道從應(yīng)用到框架再到操作系統(tǒng)的每一處代碼,是一件Exciting的事情。上篇博客講了socket的阻塞和非阻塞,這篇就開始談一談socket的close(以tcp為例且基于linux-2.6.24內(nèi)核版本)

[[411498]]

筆者一直覺得如果能知道從應(yīng)用到框架再到操作系統(tǒng)的每一處代碼,是一件Exciting的事情。上篇博客講了socket的阻塞和非阻塞,這篇就開始談一談socket的close(以tcp為例且基于linux-2.6.24內(nèi)核版本)

TCP關(guān)閉狀態(tài)轉(zhuǎn)移圖:

眾所周知,TCP的close過程是四次揮手,狀態(tài)機的變遷也逃不出TCP狀態(tài)轉(zhuǎn)移圖,如下圖所示:

tcp的關(guān)閉主要分主動關(guān)閉、被動關(guān)閉以及同時關(guān)閉(特殊情況,不做描述)

主動關(guān)閉

close(fd)的過程

以C語言為例,在我們關(guān)閉socket的時候,會使用close(fd)函數(shù):

  1. int    socket_fd; 
  2. socket_fd = socket(AF_INET, SOCK_STREAM, 0); 
  3. ... 
  4. // 此處通過文件描述符關(guān)閉對應(yīng)的socket 
  5. close(socket_fd) 

而close(int fd)又是通過系統(tǒng)調(diào)用sys_close來執(zhí)行的:

  1. asmlinkage long sys_close(unsigned int fd) 
  2.     // 清除(close_on_exec即退出進程時)的位圖標記 
  3.     FD_CLR(fd, fdt->close_on_exec); 
  4.     // 釋放文件描述符 
  5.     // 將fdt->open_fds即打開的fd位圖中對應(yīng)的位清除 
  6.     // 再將fd掛入下一個可使用的fd以便復(fù)用 
  7.     __put_unused_fd(files, fd); 
  8.     // 調(diào)用file_pointer的close方法真正清除 
  9.     retval = filp_close(filp, files); 

我們看到最終是調(diào)用的filp_close方法:

  1. int filp_close(struct file *filp, fl_owner_t id) 
  2.     // 如果存在flush方法則flush 
  3.     if (filp->f_op && filp->f_op->flush) 
  4.         filp->f_op->flush(filp, id); 
  5.     // 調(diào)用fput 
  6.     fput(filp); 
  7.     ...... 

緊接著我們進入fput:

  1. void fastcall fput(struct file *file) 
  2.     // 對應(yīng)file->count--,同時檢查是否還有關(guān)于此file的引用 
  3.     // 如果沒有,則調(diào)用_fput進行釋放 
  4.     if (atomic_dec_and_test(&file->f_count)) 
  5.         __fput(file); 

同一個file(socket)有多個引用的情況很常見,例如下面的例子:

所以在多進程的socket服務(wù)器編寫過程中,父進程也需要close(fd)一次,以免socket無法最終關(guān)閉

然后就是_fput函數(shù)了:

  1. void fastcall __fput(struct file *file) 
  2.     // 從eventpoll中釋放file 
  3.     eventpoll_release(file); 
  4.     // 如果是release方法,則調(diào)用release 
  5.     if (file->f_op && file->f_op->release) 
  6.         file->f_op->release(inode, file); 

由于我們討論的是socket的close,所以,我們現(xiàn)在探查下file->f_op->release在socket情況下的實現(xiàn):

f_op->release的賦值

我們跟蹤創(chuàng)建socket的代碼,即

  1. socket(AF_INET, SOCK_STREAM, 0); 
  2.     |-sock_create  // 創(chuàng)建sock 
  3.     |-sock_map_fd  // 將sock和fd關(guān)聯(lián) 
  4.             |-sock_attach_fd 
  5.                     |-init_file(file,...,&socket_file_ops); 
  6.                             |-file->f_op = fop; //fop賦值為socket_file_ops 

socket_file_ops的實現(xiàn)為:

  1. static const struct file_operations socket_file_ops = { 
  2.     .owner =    THIS_MODULE, 
  3.     ...... 
  4.     // 我們在這里只考慮sock_close 
  5.     .release =    sock_close, 
  6.     ...... 
  7. }; 

繼續(xù)跟蹤:

  1. sock_close 
  2.     |-sock_release 
  3.         |-sock->ops->release(sock); 

在上一篇博客中,我們知道sock->ops為下圖所示:

即(在這里我們僅考慮tcp,即sk_prot=tcp_prot):

  1. inet_stream_ops->release 
  2.     |-inet_release 
  3.             |-sk->sk_prot->close(sk, timeout); 
  4.                 |-tcp_prot->close(sk, timeout); 
  5.                     |->tcp_prot.tcp_close 

關(guān)于fd與socket的關(guān)系如下圖所示:

上圖中紅色線標注的是close(fd)的調(diào)用鏈

tcp_close

  1. void tcp_close(struct sock *sk, long timeout) 
  2.     if (sk->sk_state == TCP_LISTEN) { 
  3.         // 如果是listen狀態(tài),則直接設(shè)為close狀態(tài) 
  4.         tcp_set_state(sk, TCP_CLOSE); 
  5.     } 
  6.     // 清空掉recv.buffer 
  7.     ...... 
  8.     // SOCK_LINGER選項的處理 
  9.     ...... 
  10.     else if (tcp_close_state(sk)){ 
  11.         // tcp_close_state會將sk從established狀態(tài)變?yōu)閒in_wait1 
  12.         // 發(fā)送fin包 
  13.         tcp_send_fin(sk); 
  14.     } 
  15.     ...... 

四次揮手

現(xiàn)在就是我們的四次揮手環(huán)節(jié)了,其中上半段的兩次揮手下圖所示:

首先,在tcp_close_state(sk)中已經(jīng)將狀態(tài)設(shè)置為fin_wait1,并調(diào)用tcp_send_fin

  1. void tcp_send_fin(struct sock *sk) 
  2.     ...... 
  3.     // 這邊設(shè)置flags為ack和fin 
  4.     TCP_SKB_CB(skb)->flags = (TCPCB_FLAG_ACK | TCPCB_FLAG_FIN); 
  5.     ...... 
  6.     // 發(fā)送fin包,同時關(guān)閉nagle 
  7.     __tcp_push_pending_frames(sk, mss_now, TCP_NAGLE_OFF); 

如上圖Step1所示。

接著,主動關(guān)閉的這一端等待對端的ACK,如果ACK回來了,就設(shè)置TCP狀態(tài)為FIN_WAIT2,如上圖Step2所示,具體代碼如下:

  1. tcp_v4_do_rcv 
  2.     |-tcp_rcv_state_process 
  3. int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, struct tcphdr *th, unsigned len) 
  4.     ...... 
  5.     /* step 5: check the ACK field */ 
  6.     if (th->ack) { 
  7.         ... 
  8.         case TCP_FIN_WAIT1: 
  9.             // 這處判斷是確認此ack是發(fā)送Fin包對應(yīng)的那個ack 
  10.             if (tp->snd_una == tp->write_seq) { 
  11.                 // 設(shè)置為FIN_WAIT2狀態(tài) 
  12.                 tcp_set_state(sk, TCP_FIN_WAIT2); 
  13.                 ...... 
  14.                 // 設(shè)定TCP_FIN_WAIT2定時器,將在tmo時間到期后將狀態(tài)變遷為TIME_WAIT 
  15.                 // 不過是這時候改的已經(jīng)是inet_timewait_sock了 
  16.                 tcp_time_wait(sk, TCP_FIN_WAIT2, tmo); 
  17.                 ...... 
  18.             } 
  19.     } 
  20.     /* step 7: process the segment text */ 
  21.     switch(sk->sk_state) { 
  22.     case TCP_FIN_WAIT1: 
  23.     case TCP_FIN_WAIT2: 
  24.         ...... 
  25.     case TCP_ESTABLISHED: 
  26.         tcp_data_queue(sk, skb); 
  27.         queued = 1; 
  28.         break; 
  29.     } 
  30.     ..... 

值的注意的是,從TCP_FIN_WAIT1變遷到TCP_FIN_WAIT2之后,還調(diào)用tcp_time_wait設(shè)置一個TCP_FIN_WAIT2定時器,在tmo+(2MSL或者基于RTO計算超時)超時后會直接變遷到closed狀態(tài)(不過此時已經(jīng)是inet_timewait_sock了)。這個超時時間可以配置,如果是ipv4的話,則可以按照下列配置:

  1. net.ipv4.tcp_fin_timeout 
  2. /sbin/sysctl -w net.ipv4.tcp_fin_timeout=30 

如下圖所示:

有這樣一步的原因是防止對端由于種種原因始終沒有發(fā)送fin,防止一直處于FIN_WAIT2狀態(tài)。

接著在FIN_WAIT2狀態(tài)等待對端的FIN,完成后面兩次揮手:

由Step1和Step2將狀態(tài)置為了FIN_WAIT_2,然后接收到對端發(fā)送的FIN之后,將會將狀態(tài)設(shè)置為time_wait,如下代碼所示:

  1. tcp_v4_do_rcv 
  2.     |-tcp_rcv_state_process 
  3.         |-tcp_data_queue 
  4.                 |-tcp_fin 
  5. static void tcp_fin(struct sk_buff *skb, struct sock *sk, struct tcphdr *th) 
  6.     switch (sk->sk_state) { 
  7.         ...... 
  8.         case TCP_FIN_WAIT1: 
  9.             // 這邊是處理同時關(guān)閉的情況 
  10.             tcp_send_ack(sk); 
  11.             tcp_set_state(sk, TCP_CLOSING); 
  12.             break; 
  13.         case TCP_FIN_WAIT2: 
  14.             /* Received a FIN -- send ACK and enter TIME_WAIT. */ 
  15.             // 收到FIN之后,發(fā)送ACK同時將狀態(tài)進入TIME_WAIT 
  16.             tcp_send_ack(sk); 
  17.             tcp_time_wait(sk, TCP_TIME_WAIT, 0); 
  18.     } 

time_wait狀態(tài)時,原socket會被destroy,然后新創(chuàng)建一個inet_timewait_sock,這樣就能及時的將原socket使用的資源回收。而inet_timewait_sock被掛入一個bucket中,由

inet_twdr_twcal_tick定時從bucket中將超過(2MSL或者基于RTO計算的時間)的time_wait的實例刪除。

我們來看下tcp_time_wait函數(shù)

  1. void tcp_time_wait(struct sock *sk, int state, int timeo) 
  2.     // 建立inet_timewait_sock 
  3.     tw = inet_twsk_alloc(sk, state); 
  4.     // 放到bucket的具體位置等待定時器刪除 
  5.     inet_twsk_schedule(tw, &tcp_death_row, time,TCP_TIMEWAIT_LEN); 
  6.     // 設(shè)置sk狀態(tài)為TCP_CLOSE,然后回收sk資源 
  7.     tcp_done(sk); 

具體的定時器操作函數(shù)為inet_twdr_twcal_tick,這邊就不做描述了

被動關(guān)閉

close_wait

在tcp的socket時候,如果是established狀態(tài),接收到了對端的FIN,則是被動關(guān)閉狀態(tài),會進入close_wait狀態(tài),如下圖Step1所示:

具體代碼如下所示:

  1. tcp_rcv_state_process 
  2.     |-tcp_data_queue 
  3. static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) 
  4.     ... 
  5.     if (th->fin) 
  6.         tcp_fin(skb, sk, th); 
  7.     ... 

我們再看下tcp_fin

  1. static void tcp_fin(struct sk_buff *skb, struct sock *sk, struct tcphdr *th) 
  2.     ...... 
  3.     // 這一句表明當(dāng)前socket有ack需要發(fā)送 
  4.     inet_csk_schedule_ack(sk); 
  5.     ...... 
  6.     switch (sk->sk_state) { 
  7.             case TCP_SYN_RECV: 
  8.             case TCP_ESTABLISHED: 
  9.                 /* Move to CLOSE_WAIT */ 
  10.                 // 狀態(tài)設(shè)置程close_wait狀態(tài) 
  11.                 tcp_set_state(sk, TCP_CLOSE_WAIT); 
  12.                 // 這一句表明,當(dāng)前fin可以延遲發(fā)送 
  13.                 // 即和后面的數(shù)據(jù)一起發(fā)送或者定時器到時后發(fā)送 
  14.                 inet_csk(sk)->icsk_ack.pingpong = 1; 
  15.                 break; 
  16.     } 
  17.     ...... 

這邊有意思的點是,收到對端的fin之后并不會立即發(fā)送ack告知對端收到了,而是等有數(shù)據(jù)攜帶一塊發(fā)送,或者等攜帶重傳定時器到期后發(fā)送ack。

如果對端關(guān)閉了,應(yīng)用端在read的時候得到的返回值是0,此時就應(yīng)該手動調(diào)用close去關(guān)閉連接

  1. if(recv(sockfd, buf, MAXLINE,0) == 0){ 
  2.     close(sockfd) 

我們看下recv是怎么處理fin包,從而返回0的,上一篇博客可知,recv最后調(diào)用tcp_rcvmsg,由于比較復(fù)雜,我們分兩段來看:

tcp_recvmsg第一段

  1. ...... 
  2.   // 從接收隊列里面獲取一個sk_buffer 
  3.   skb = skb_peek(&sk->sk_receive_queue); 
  4.   do { 
  5.       // 如果已經(jīng)沒有數(shù)據(jù),直接跳出讀取循環(huán),返回0 
  6.       if (!skb) 
  7.           break; 
  8.       ...... 
  9.       // *seq表示已經(jīng)讀到多少seq 
  10.       // TCP_SKB_CB(skb)->seq表示當(dāng)前sk_buffer的起始seq 
  11.       // offset即是在當(dāng)前sk_buffer中已經(jīng)讀取的長度 
  12.       offset = *seq - TCP_SKB_CB(skb)->seq; 
  13.       // syn處理 
  14.       if (tcp_hdr(skb)->syn) 
  15.           offset--; 
  16.       // 此處判斷表示,當(dāng)前skb還有數(shù)據(jù)可讀,跳轉(zhuǎn)found_ok_skb 
  17.       if (offset < skb->len) 
  18.           goto found_ok_skb; 
  19.       // 處理fin包的情況 
  20.       // offset == skb->len,跳轉(zhuǎn)到found_fin_ok然后跳出外面的大循環(huán) 
  21.       // 并返回0 
  22.       if (tcp_hdr(skb)->fin) 
  23.           goto found_fin_ok; 
  24.       BUG_TRAP(flags & MSG_PEEK); 
  25.       skb = skb->next
  26.   } while (skb != (struct sk_buff *)&sk->sk_receive_queue); 
  27.   ...... 

上面代碼的處理過程如下圖所示:

我們看下tcp_recmsg的第二段:

  1. found_ok_skb: 
  2.         // tcp已讀seq更新 
  3.         *seq += used; 
  4.         // 這次讀取的數(shù)量更新 
  5.         copied += used; 
  6.         // 如果還沒有讀到當(dāng)前sk_buffer的盡頭,則不檢測fin標識 
  7.         if (used + offset < skb->len) 
  8.             continue
  9.         // 如果發(fā)現(xiàn)當(dāng)前skb有fin標識,去found_fin_ok 
  10.         if (tcp_hdr(skb)->fin) 
  11.             goto found_fin_ok; 
  12.         ...... 
  13. found_fin_ok: 
  14.         /* Process the FIN. */ 
  15.         // tcp已讀seq++ 
  16.         ++*seq; 
  17.         ... 
  18.         break; 
  19. } while(len > 0); 

由上面代碼可知,一旦當(dāng)前skb讀完了而且攜帶有fin標識,則不管有沒有讀到用戶期望的字節(jié)數(shù)量都會返回已讀到的字節(jié)數(shù)。下一次再讀取的時候則在剛才描述的tcp_rcvmsg上半段直接不讀取任何數(shù)據(jù)再跳轉(zhuǎn)到found_fin_ok并返回0。這樣應(yīng)用就能感知到對端已經(jīng)關(guān)閉了。

如下圖所示:

last_ack

應(yīng)用層在發(fā)現(xiàn)對端關(guān)閉之后已經(jīng)是close_wait狀態(tài),這時候再調(diào)用close的話,會將狀態(tài)改為last_ack狀態(tài),并發(fā)送本端的fin,如下代碼所示:

  1. void tcp_close(struct sock *sk, long timeout) 
  2.     ...... 
  3.     else if (tcp_close_state(sk)){ 
  4.         // tcp_close_state會將sk從close_wait狀態(tài)變?yōu)閘ast_ack 
  5.         // 發(fā)送fin包 
  6.         tcp_send_fin(sk); 
  7.     } 

在接收到主動關(guān)閉端的last_ack之后,則調(diào)用tcp_done(sk)設(shè)置sk為tcp_closed狀態(tài),并回收sk的資源,如下代碼所示:

  1. tcp_v4_do_rcv 
  2.     |-tcp_rcv_state_process 
  3. int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, struct tcphdr *th, unsigned len) 
  4.     ...... 
  5.     /* step 5: check the ACK field */ 
  6.     if (th->ack) { 
  7.         ... 
  8.         case TCP_LAST_ACK: 
  9.             // 這處判斷是確認此ack是發(fā)送Fin包對應(yīng)的那個ack 
  10.             if (tp->snd_una == tp->write_seq) { 
  11.                     tcp_update_metrics(sk); 
  12.                     // 設(shè)置socket為closed,并回收socket的資源 
  13.                     tcp_done(sk); 
  14.                     goto discard; 
  15.             } 
  16.         ... 
  17.     } 

上述代碼就是被動關(guān)閉端的后兩次揮手了,如下圖所示:

出現(xiàn)大量close_wait的情況

linux中出現(xiàn)大量close_wait的情況一般是應(yīng)用在檢測到對端fin時沒有及時close當(dāng)前連接。有一種可能如下圖所示:

當(dāng)出現(xiàn)這種情況,通常是minIdle之類參數(shù)的配置不對(如果連接池有定時收縮連接功能的話)。給連接池加上心跳也可以解決這種問題。

如果應(yīng)用close的時間過晚,對端已經(jīng)將連接給銷毀。則應(yīng)用發(fā)送給fin給對端,對端會由于找不到對應(yīng)的連接而發(fā)送一個RST(Reset)報文。

操作系統(tǒng)何時回收close_wait

如果應(yīng)用遲遲沒有調(diào)用close_wait,那么操作系統(tǒng)有沒有一個回收機制呢,答案是有的。

tcp本身有一個包活(keep alive)定時器,在(keep alive)定時器超時之后,會強行將此連接關(guān)閉。可以設(shè)置tcp keep alive的時間

  1. /etc/sysctl.conf 
  2. net.ipv4.tcp_keepalive_intvl = 75 
  3. net.ipv4.tcp_keepalive_probes = 9 
  4. net.ipv4.tcp_keepalive_time = 7200 

默認值如上面所示,設(shè)置的很大,7200s后超時,如果想快速回收close_wait可以設(shè)置小一點。但最終解決方案還是得從應(yīng)用程序著手。

關(guān)于tcp keepalive包活定時器可見筆者另一篇博客:

https://my.oschina.net/alchemystar/blog/833981

進程關(guān)閉時清理socket資源

進程在退出時候(無論kill,kill -9 或是正常退出)都會關(guān)閉當(dāng)前進程中所有的fd(文件描述符)

  1. do_exit 
  2.     |-exit_files 
  3.         |-__exit_files 
  4.             |-close_files 
  5.                     |-filp_close 

這樣我們又回到了博客伊始的filp_close函數(shù),對每一個是socket的fd發(fā)送send_fin

Java GC時清理socket資源

Java的socket最終關(guān)聯(lián)到AbstractPlainSocketImpl,且其重寫了object的finalize方法

  1. abstract class AbstractPlainSocketImpl extends SocketImpl 
  2.     ...... 
  3.     /** 
  4.      * Cleans up if the user forgets to close it. 
  5.      */ 
  6.     protected void finalize() throws IOException { 
  7.         close() 
  8.     } 
  9.     ...... 

所以Java會在GC時刻會關(guān)閉沒有被引用的socket,但是切記不要寄希望于Java的GC,因為GC時刻并不是以未引用的socket數(shù)量來判斷的,所以有可能泄露了一堆socket,但仍舊沒有觸發(fā)GC。

總結(jié)

linux內(nèi)核源代碼博大精深,閱讀其代碼很費周折。之前讀\<\>的時候由于有先輩引導(dǎo)和梳理,所以看書中所使用的BSD源碼并不覺得十分費勁。直到現(xiàn)在自己帶著問題獨立看linux源碼的時候,盡管有之前的基礎(chǔ),仍舊被其中的各種細節(jié)所迷惑。希望筆者這篇文章能幫助到閱讀linux網(wǎng)絡(luò)協(xié)議棧代碼的人。

原文鏈接

https://my.oschina.net/alchemystar/blog/1821680

本文轉(zhuǎn)載自微信公眾號「解Bug之路」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系解Bug之路公眾號。

 

責(zé)任編輯:武曉燕 來源: 解Bug之路
相關(guān)推薦

2020-10-10 07:00:16

LinuxSocketTCP

2021-06-10 09:52:33

LinuxTCPAccept

2020-10-14 14:31:37

LinuxTCP連接

2021-07-14 09:48:15

Linux源碼Epoll

2021-03-10 08:20:54

設(shè)計模式OkHttp

2017-04-05 20:00:32

ChromeObjectJS代碼

2018-02-02 15:48:47

ChromeDNS解析

2009-08-28 14:15:19

SocketVisual C#.N

2017-02-09 15:15:54

Chrome瀏覽器

2020-09-23 12:32:18

網(wǎng)絡(luò)IOMySQL

2015-05-28 11:24:27

Socket調(diào)用套接口問題

2022-03-08 11:29:06

Linux進程系統(tǒng)

2021-05-06 14:46:18

LinuxIcmpudp

2020-09-07 14:30:37

JUC源碼CAS

2022-03-25 10:16:40

CentOSLinux開源

2023-03-13 07:43:51

PHP類型轉(zhuǎn)換

2017-02-28 10:05:56

Chrome源碼

2017-11-21 14:56:59

2021-12-30 08:55:41

Log4j2FastJson漏洞

2025-11-05 03:00:00

Linux內(nèi)核TCP粘包
點贊
收藏

51CTO技術(shù)棧公眾號

国产日韩换脸av一区在线观看| 9国产精品视频| 欧美在线一区二区三区| 国产91热爆ts人妖在线| 91欧美视频在线| 亚洲av无码乱码国产麻豆 | 国产乱论精品| 91在线精品一区二区三区| 亚洲乱码一区av黑人高潮| 欧美日韩在线一二三| 成人18视频免费69| 欧美gv在线观看| 免费人成在线不卡| 欧美成人aa大片| 久久av一区二区三区漫画| 玖玖爱免费视频| 欧美综合影院| 国产精品综合网| 亚洲精品一区在线观看香蕉| 成人亚洲视频在线观看| 粉嫩av一区二区夜夜嗨| 免费精品国产| 1000精品久久久久久久久| 欧美一级电影免费在线观看| 性生活在线视频| 韩国福利在线| 国模无码大尺度一区二区三区| 欧美高清激情视频| 在线观看亚洲大片短视频| 亚洲wwwww| 精品一区二区三区在线视频| 亚洲精品一区二区三区不| 欧美婷婷精品激情| 日本精品专区| 国产一区在线精品| 久久久黄色av| 亚洲中文字幕无码av| www.欧美国产| 中文不卡在线| 精品视频在线看| 国产一区二区不卡视频| www.av免费| 国内精品视频| 欧美性受极品xxxx喷水| 品久久久久久久久久96高清| 国产又黄又猛又粗又爽| 老司机成人在线| 亚洲资源在线观看| 99久久99久久| 在线观看免费视频a| 欧美黄色网视频| 中文字幕精品三区| 国产精品国语对白| 国产精成人品免费观看| 亚洲成a人片| 91久色porny| ts人妖另类在线| 97人妻人人澡人人爽人人精品| sdde在线播放一区二区| 偷窥国产亚洲免费视频| 国产一区国产精品| 在线视频免费观看一区| 午夜在线一区二区| 欧美高清性猛交| 小嫩苞一区二区三区| 久久91精品| 亚洲国产精久久久久久| 激情视频小说图片| 最新97超碰在线| 免费观看日韩电影| 国产精品av免费在线观看| 瑟瑟视频在线观看| 欧美成人精品三级网站| 国产亚洲欧美色| 国产精品av免费在线观看| 亚洲欧美一区二区三区在线观看 | 99在线观看免费视频精品观看| 美女av一区二区三区| 99国产精品免费视频| 少妇淫片在线影院| 亚洲成在人线免费| 性欧美大战久久久久久久免费观看 | 久久精品影视伊人网| 日本黄色激情视频| 亚洲男人在线| 亚洲五码中文字幕| 日韩精品无码一区二区三区| 一区二区三区免费观看视频| 亚洲青色在线| 亚洲视频在线免费看| 丁香啪啪综合成人亚洲| 午夜精品久久久久久久久久蜜桃| 欧美日韩中文字幕| 成年在线观看视频| 男人天堂网在线| 国产伦精一区二区三区| 91精品国产高清久久久久久91裸体| 亚洲熟女www一区二区三区| 免费久久精品| 亚洲精品国精品久久99热| 色噜噜狠狠一区二区三区狼国成人| 波多野结衣中文在线| 欧美日韩国产中文精品字幕自在自线| 成年人视频观看| 99re66热这里只有精品4| 欧美日韩国产一区| 又色又爽又黄18网站| 噜噜噜狠狠夜夜躁精品仙踪林| 亚洲欧美精品一区| 国产黄色录像片| 在线不卡视频| 国产精品久久色| 成人h动漫精品一区二区无码 | 日韩精品无码一区二区三区免费| 精品自拍视频| 精品久久在线播放| 午夜激情在线观看视频| 国产一区二区三区视频在线| 亚洲大尺度美女在线| 变态另类ts人妖一区二区| 婷婷六月综合| 热久久免费视频精品| 青青青在线视频| 亚洲欧美日韩国产综合精品二区 | 一个色妞综合视频在线观看| 久久亚洲中文字幕无码| 91精彩在线视频| 亚洲在线视频网站| 另类小说色综合| 欧美日韩一区二区三区在线电影 | 香港成人在线视频| 亚洲久久中文字幕| 亚洲欧洲色图| 欧美日韩第一视频| 911国产在线| 一区二区日韩免费看| 国产精品激情自拍| 国产综合无码一区二区色蜜蜜| 中文字幕国产一区| 大陆极品少妇内射aaaaa| 国产午夜久久av| 一区二区三区视频观看| 日本一二三区不卡| 国产精品亚洲综合久久| 91九色蝌蚪成人| 五月婷婷在线观看| 色婷婷久久久久swag精品| 久久无码人妻一区二区三区| 久久国产成人精品| 国产成人一区二区三区电影| 四虎影视精品成人| 久久色在线视频| 免费看成人av| а√中文在线8| 欧美日本一区二区| 中文字幕在线观看免费高清| 亚洲一区免费| 精品久久久久久一区二区里番| 午夜av在线播放| 欧美一区二区久久久| 精品人妻无码一区二区三区换脸| 清纯唯美激情亚洲| 免费97视频在线精品国自产拍| 亚洲天堂中文在线| 国产精品看片你懂得| 性生交免费视频| 欧美日韩有码| 国产精品久久国产精品99gif| 免费在线黄色影片| 日本韩国欧美一区| 国产区二区三区| 国产日产精品一区二区三区四区的观看方式 | 久久久久久久久中文字幕| 久久精品视频9| 国产成人精品一区二区三区网站观看| 伊人久久大香线蕉av一区| 日韩一区二区三区四区五区 | 91黄视频在线| 久久亚洲AV无码专区成人国产| 亚洲综合国产| 日韩av电影在线观看| 成人国产激情在线| 在线播放国产精品二区一二区四区 | 亚州一区二区三区| 在线观看亚洲区| 夜夜狠狠擅视频| 亚洲免费观看高清在线观看| 欧美人成在线观看| 日本在线视频一区二区| 这里只有精品在线播放| 日韩黄色a级片| 国产a精品视频| 97国产精东麻豆人妻电影| 台湾色综合娱乐中文网| 国产精品久久久久久久av大片 | 日韩精品一区二区亚洲av| 久久精品夜色噜噜亚洲aⅴ| 污版视频在线观看| 国产精品videosex极品| 国产在线精品日韩| 欧洲av一区二区| 美女av一区二区| 婷婷色在线观看| 国产色爱av资源综合区| 欧美激情国内自拍| 136国产福利精品导航网址| 欧美另类一区| 国模私拍国内精品国内av| 欧美成人精品三级在线观看| 污视频网站在线播放| 欧美色综合影院| 日韩精品国产一区二区| 欧美激情一区二区三区蜜桃视频| 亚洲三级在线视频| 性8sex亚洲区入口| 久久最新免费视频| 岛国精品在线| 97在线视频免费播放| av电影在线播放高清免费观看| 7777精品伊人久久久大香线蕉超级流畅| 欧美毛片在线观看| 久久女同性恋中文字幕| 伊人成人222| 精品视频久久| 国产91精品一区二区绿帽| 中文字幕资源网在线观看| 欧美理论片在线| 国内自拍视频在线播放| 一区二区三区在线免费播放| 久久久久久国产免费a片| 成人自拍视频在线| 亚洲美女性囗交| 久久精品日产第一区二区| 免费在线黄网站| 久久福利影院| 日韩精品最新在线观看| 成人黄色av网址| 九九热最新视频//这里只有精品| 国内精品一区视频| 日韩成人小视频| 亚洲欧美激情国产综合久久久| 欧美区视频在线观看| 免费一级片在线观看| 国产精品国产三级国产aⅴ入口 | 丁香五六月婷婷久久激情| 亚洲欧美精品久久| 国产日韩欧美一区二区三区乱码| 日本黄色录像片| 成人污污视频在线观看| 波多野结衣在线免费观看| 美女爽到高潮91| 天天影视综合色| 天使萌一区二区三区免费观看| 国产真人做爰毛片视频直播| 欧美成人日韩| 一级特黄录像免费播放全99| 九色精品国产蝌蚪| 久久综合九九| 国内精品偷拍| 国产精品10p综合二区| aaa国产精品视频| 亚洲综合在线做性| 中文字幕av一区二区三区四区| 91亚洲精品在线| 国产一区二区三区| 亚洲综合在线中文字幕| 66精品视频在线观看| 999精品视频一区二区三区| 亚洲日本va| 91久久久久久久| 亚洲日本va午夜在线电影| 国产精品v欧美精品∨日韩| 66精品视频在线观看| 精品国产aⅴ麻豆| 亚洲美女15p| 日韩欧美第二区在线观看| 久久av资源| 色姑娘综合网| 中文字幕一区二区三区久久网站| 大片在线观看网站免费收看| 欧美 日韩 国产一区二区在线视频| 成人毛片100部免费看| 影音先锋亚洲一区| 久久国产精品网| 蜜桃伊人久久| 中国黄色片免费看| 国产乱子轮精品视频| wwwxxxx在线观看| 91视频xxxx| 成年人网站免费在线观看| 国产午夜精品久久| 卡通动漫亚洲综合| 婷婷一区二区三区| 欧美性受xxx黑人xyx性爽| 911国产精品| 国产 欧美 精品| 亚洲人成网站色ww在线| 色的视频在线免费看| 欧美黑人巨大xxx极品| 欧美黑人疯狂性受xxxxx野外| 国产裸体写真av一区二区| 亚洲国产综合在线观看| 99视频在线播放| 亚州综合一区| 丰满女人性猛交| 激情婷婷综合| 成年丰满熟妇午夜免费视频| 亚洲一区欧美二区| 亚洲理论中文字幕| 久久综合av免费| 青青青在线免费观看| 高潮白浆女日韩av免费看| 91丨porny丨在线中文| 日韩成人在线视频观看| 免费观看在线黄色网| 97精品视频在线| 在线观看欧美| 青青影院一区二区三区四区| 欧美日韩ab| 国产又大又硬又粗| 粉嫩绯色av一区二区在线观看 | 熟女视频一区二区三区| 一本一本久久| 四川一级毛毛片| 中文成人av在线| 久久久久久久极品| 欧美一区二区三区播放老司机| 青青青免费视频在线2| 欧美久久精品午夜青青大伊人| 欧美xxx性| 国产日韩二区| 欧美日韩国产一区精品一区| 又色又爽又高潮免费视频国产| 麻豆精品在线观看| 久热精品在线播放| 2024国产精品| 国产精品18p| 欧美一级高清大全免费观看| sese一区| 奇米一区二区三区四区久久| 国产ts一区| www.欧美黄色| 国产精品一二三四| 国产又粗又硬又长又爽| 精品人伦一区二区三区蜜桃网站 | 蜜桃久久精品成人无码av| 天天综合日日夜夜精品| 成人黄色免费视频| 久久久久久久国产精品视频| 精品国产午夜肉伦伦影院| 成人免费观看cn| 2020日本不卡一区二区视频| 波多野结衣大片| 最近2019中文字幕一页二页| 欧美男男gaygay1069| 日本丰满少妇黄大片在线观看| 国产麻豆精品久久一二三| 免费在线观看亚洲| 亚洲精品电影久久久| 亚洲最大网站| 亚洲国产一区在线| 精品一区二区三区免费播放| 少妇久久久久久被弄高潮| 亚洲第五色综合网| 澳门成人av网| 亚洲精品人成| 国产传媒久久文化传媒| 成年人视频在线免费看| 一区二区三区精品99久久 | 亚洲韩国日本中文字幕| 国产精品专区免费| 亚洲一区三区| 波多野结衣中文一区| 日韩欧美国产另类| 久热国产精品视频| 电影网一区二区| 亚洲日本无吗高清不卡| 国产成人在线影院| www五月天com| 欧美xxxx18性欧美| 天堂资源在线亚洲| 亚洲18在线看污www麻豆| 亚洲一区二区欧美| 中文字幕在线播放| 99视频在线| 蜜桃免费网站一区二区三区| 国产大片中文字幕在线观看| 中文字幕国产亚洲| 国产精品videossex| 蜜桃免费在线视频| 亚洲最大成人网4388xx| 成人免费在线观看| 国产精品12| 九九视频精品免费| 国产伦精品一区二区三区视频我| 萌白酱国产一区二区| 国产99久久| 理论片大全免费理伦片| 亚洲精品中文在线影院| 欧美在线一卡|