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

TCP源碼分析 - 三次握手之 Connect 過程

網(wǎng)絡(luò) 通信技術(shù)
本文主要分析 TCP 協(xié)議的實現(xiàn),但由于 TCP 協(xié)議比較復(fù)雜,所以分幾篇文章進(jìn)行分析,這篇主要介紹 TCP 協(xié)議建立連接時的三次握手過程。

[[386167]]

本文轉(zhuǎn)載自微信公眾號「Linux內(nèi)核那些事」,作者songsong001。轉(zhuǎn)載本文請聯(lián)系Linux內(nèi)核那些事公眾號。  

本文主要分析 TCP 協(xié)議的實現(xiàn),但由于 TCP 協(xié)議比較復(fù)雜,所以分幾篇文章進(jìn)行分析,這篇主要介紹 TCP 協(xié)議建立連接時的三次握手過程。

TCP 協(xié)議應(yīng)該是 TCP/IP 協(xié)議棧中最為復(fù)雜的一個協(xié)議(沒有之一),TCP 協(xié)議的復(fù)雜性來源于其面向連接和保證可靠傳輸。

如下圖所示,TCP 協(xié)議位于 TCP/IP 協(xié)議棧的第四層,也就是傳輸層,其建立在網(wǎng)絡(luò)層的 IP 協(xié)議。

但由于 IP 協(xié)議是一個無連接不可靠的協(xié)議,所以 TCP 協(xié)議要實現(xiàn)面向連接的可靠傳輸,就必須為每個 CS(Client - Server) 連接維護(hù)一個連接狀態(tài)。由此可知,TCP 協(xié)議的連接只是維護(hù)了一個連接狀態(tài),而非真正的連接。

由于本文主要介紹 Linux 內(nèi)核是怎么實現(xiàn) TCP 協(xié)議的,如果對 TCP 協(xié)議的原理不是很清楚的話,可以參考著名的《TCP/IP協(xié)議詳解》。

三次握手過程

我們知道,TCP 協(xié)議是建立在無連接的 IP 協(xié)議之上,而為了實現(xiàn)面向連接,TCP 協(xié)議使用了一種協(xié)商的方式來建立連接狀態(tài),稱為:三次握手。三次握手 的過程如下圖:

建立連接過程如下:

  • 客戶端需要發(fā)送一個 SYN包 到服務(wù)端(包含了客戶端初始化序列號),并且將連接狀態(tài)設(shè)置為 SYN_SENT。
  • 服務(wù)端接收到客戶端的 SYN包 后,需要回復(fù)一個 SYN+ACK包 給客戶端(包含了服務(wù)端初始化序列號),并且設(shè)置連接狀態(tài)為 SYN_RCVD。
  • 客戶端接收到服務(wù)端的 SYN+ACK包 后,設(shè)置連接狀態(tài)為 ESTABLISHED(表示連接已經(jīng)建立),并且回復(fù)一個 ACK包 給服務(wù)端。
  • 服務(wù)端接收到客戶端的 ACK包 后,將連接狀態(tài)設(shè)置為 ESTABLISHED(表示連接已經(jīng)建立)。

以上過程完成后,一個 TCP 連接就此建立完成。

TCP 頭部

要分析 TCP 協(xié)議就免不了要了解 TCP 協(xié)議頭部,我們通過下面的圖片來介紹 TCP 頭部的格式:

下面介紹一下 TCP 頭部各個字段的作用:

  • 源端口號:用于指定本地程序綁定的端口。
  • 目的端口號:用于指定遠(yuǎn)端程序綁定的端口。
  • 序列號:用于本地發(fā)送數(shù)據(jù)時所使用的序列號。
  • 確認(rèn)號:用于本地確認(rèn)接收到遠(yuǎn)端發(fā)送過來的數(shù)據(jù)序列號。
  • 首部長度:指示 TCP 頭部的長度。
  • 標(biāo)志位:用于指示 TCP 數(shù)據(jù)包的類型。
  • 窗口大小:用于流量控制,表示遠(yuǎn)端能夠接收數(shù)據(jù)的能力。
  • 校驗和:用于校驗數(shù)據(jù)包是否在傳輸時損壞了。
  • 緊急指針:一般比較少用,用于指定緊急數(shù)據(jù)的偏移量(URG 標(biāo)志位為1時有效)。
  • 可選項:TCP的選項部分。

我們來看看 Linux 內(nèi)核怎么定義 TCP 頭部的結(jié)構(gòu),如下:

  1. struct tcphdr { 
  2.     __u16   source;   // 源端口 
  3.     __u16   dest;     // 目的端口 
  4.     __u32   seq;      // 序列號 
  5.     __u32   ack_seq;  // 確認(rèn)號 
  6.     __u16   doff:4,   // 頭部長度 
  7.             res1:4,   // 保留 
  8.             res2:2,   // 保留 
  9.             urg:1,    // 是否包含緊急數(shù)據(jù) 
  10.             ack:1,    // 是否ACK包 
  11.             psh:1,    // 是否Push包 
  12.             rst:1,    // 是否Reset包 
  13.             syn:1,    // 是否SYN包 
  14.             fin:1;    // 是否FIN包 
  15.     __u16   window;   // 滑動窗口 
  16.     __u16   check;    // 校驗和 
  17.     __u16   urg_ptr;  // 緊急指針 
  18. }; 

從上面的定義可知,結(jié)構(gòu) tcphdr 的各個字段與 TCP 頭部的各個字段一一對應(yīng)。

客戶端連接過程

一個 TCP 連接是由客戶端發(fā)起的,當(dāng)客戶端程序調(diào)用 connect() 系統(tǒng)調(diào)用時,就會與服務(wù)端程序建立一個 TCP 連接。connect() 系統(tǒng)調(diào)用的原型如下:

  1. int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 

下面是 connect() 系統(tǒng)調(diào)用各個參數(shù)的作用:

  • sockfd:由 socket() 系統(tǒng)調(diào)用創(chuàng)建的文件句柄。
  • addr:指定要連接的遠(yuǎn)端 IP 地址和端口。
  • addrlen:指定參數(shù) addr 的長度。

當(dāng)客戶端調(diào)用 connect() 函數(shù)時,會觸發(fā)內(nèi)核調(diào)用 sys_connect() 內(nèi)核函數(shù),sys_connect() 函數(shù)實現(xiàn)如下:

  1. int sys_connect(int fd, struct sockaddr *uservaddr, int addrlen) 
  2.     struct socket *sock; 
  3.     char address[MAX_SOCK_ADDR]; 
  4.     int err; 
  5.     ... 
  6.     // 獲取文件句柄對應(yīng)的socket對象 
  7.     sock = sockfd_lookup(fd, &err); 
  8.     ... 
  9.     // 從用戶空間復(fù)制要連接的遠(yuǎn)端IP地址和端口信息 
  10.     err = move_addr_to_kernel(uservaddr, addrlen, address); 
  11.     ... 
  12.     // 調(diào)用 inet_stream_connect() 函數(shù)完成連接操作 
  13.     err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen, 
  14.                              sock->file->f_flags); 
  15.     ... 
  16.     return err; 

sys_connect() 內(nèi)核函數(shù)主要完成 3 個步驟:

  • 調(diào)用 sockfd_lookup() 函數(shù)獲取 fd 文件句柄對應(yīng)的 socket 對象。
  • 調(diào)用 move_addr_to_kernel() 函數(shù)從用戶空間復(fù)制要連接的遠(yuǎn)端 IP 地址和端口信息。
  • 調(diào)用 inet_stream_connect() 函數(shù)完成連接操作。

我們繼續(xù)分析 inet_stream_connect() 函數(shù)的實現(xiàn):

  1. int inet_stream_connect(struct socket *sock, struct sockaddr * uaddr, 
  2.                         int addr_len, int flags) 
  3.     struct sock *sk = sock->sk; 
  4.     int err; 
  5.     ... 
  6.     if (sock->state == SS_CONNECTING) { 
  7.         ... 
  8.     } else { 
  9.         // 嘗試自動綁定一個本地端口 
  10.         if (inet_autobind(sk) != 0)  
  11.             return(-EAGAIN); 
  12.         ... 
  13.         // 調(diào)用 tcp_v4_connect() 進(jìn)行連接操作 
  14.         err = sk->prot->connect(sk, uaddr, addr_len); 
  15.         if (err < 0) 
  16.             return(err); 
  17.         sock->state = SS_CONNECTING; 
  18.     } 
  19.     ... 
  20.     // 如果 socket 設(shè)置了非阻塞, 并且連接還沒建立, 那么返回 EINPROGRESS 錯誤 
  21.     if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK)) 
  22.         return (-EINPROGRESS); 
  23.  
  24.     // 等待連接過程完成 
  25.     if (sk->state == TCP_SYN_SENT || sk->state == TCP_SYN_RECV) { 
  26.         inet_wait_for_connect(sk); 
  27.         if (signal_pending(current)) 
  28.             return -ERESTARTSYS; 
  29.     } 
  30.     sock->state = SS_CONNECTED; // 設(shè)置socket的狀態(tài)為connected 
  31.     ... 
  32.     return(0); 

inet_stream_connect() 函數(shù)的主要操作有以下幾個步驟:

  • 調(diào)用 inet_autobind() 函數(shù)嘗試自動綁定一個本地端口。
  • 調(diào)用 tcp_v4_connect() 函數(shù)進(jìn)行 TCP 協(xié)議的連接操作。
  • 如果 socket 設(shè)置了非阻塞,并且連接還沒建立完成,那么返回 EINPROGRESS 錯誤。
  • 調(diào)用 inet_wait_for_connect() 函數(shù)等待連接服務(wù)端操作完成。
  • 設(shè)置 socket 的狀態(tài)為 SS_CONNECTED,表示連接已經(jīng)建立完成。

在上面的步驟中,最重要的是調(diào)用 tcp_v4_connect() 函數(shù)進(jìn)行連接操作,我們來分析一下 tcp_v4_connect() 函數(shù)的實現(xiàn):

  1. int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) 
  2.     struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); 
  3.     struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; 
  4.     struct sk_buff *buff; 
  5.     struct rtable *rt; 
  6.     u32 daddr, nexthop; 
  7.     int tmp; 
  8.     ... 
  9.     nexthop = daddr = usin->sin_addr.s_addr; 
  10.     ... 
  11.     // 1. 獲取發(fā)送數(shù)據(jù)的路由信息 
  12.     tmp = ip_route_connect(&rt, nexthop, sk->saddr, 
  13.                            RT_TOS(sk->ip_tos)|RTO_CONN|sk->localroute, 
  14.                            sk->bound_dev_if); 
  15.     ... 
  16.     dst_release(xchg(&sk->dst_cache, rt)); // 2. 設(shè)置sk的路由信息 
  17.  
  18.     // 3. 申請一個skb數(shù)據(jù)包對象 
  19.     buff = sock_wmalloc(sk, (MAX_HEADER + sk->prot->max_header), 0, GFP_KERNEL); 
  20.     ... 
  21.     sk->dport = usin->sin_port; // 4. 設(shè)置目的端口 
  22.     sk->daddr = rt->rt_dst;     // 5. 設(shè)置目的IP地址 
  23.     ... 
  24.     if (!sk->saddr) 
  25.         sk->saddr = rt->rt_src; // 6. 如果沒有指定源IP地址, 那么使用路由信息的源IP地址 
  26.     sk->rcv_saddr = sk->saddr; 
  27.     ... 
  28.     // 7. 初始化TCP序列號 
  29.     tp->write_seq = secure_tcp_sequence_number(sk->saddr, sk->daddr, sk->sport, 
  30.                                                usin->sin_port); 
  31.     ... 
  32.     // 8. 重置TCP最大報文段大小 
  33.     tp->mss_clamp = ~0; 
  34.     ... 
  35.     // 9. 調(diào)用 tcp_connect() 函數(shù)繼續(xù)進(jìn)行連接操作 
  36.     tcp_connect(sk, buff, rt->u.dst.pmtu); 
  37.     return 0; 

tcp_v4_connect() 函數(shù)只是做一些連接前的準(zhǔn)備工作,如下:

  • 調(diào)用 ip_route_connect() 函數(shù)獲取發(fā)送數(shù)據(jù)的路由信息,并且將路由信息保存到 socket 對象的路由緩存中。
  • 調(diào)用 sock_wmalloc() 函數(shù)申請一個 skb 數(shù)據(jù)包對象。
  • 設(shè)置 目的端口 和 目的 IP 地址。
  • 如果沒有指定 源 IP 地址,那么使用路由信息中的 源 IP 地址。
  • 調(diào)用 secure_tcp_sequence_number() 函數(shù)初始化 TCP 序列號。
  • 重置 TCP 協(xié)議最大報文段的大小。
  • 調(diào)用 tcp_connect() 函數(shù)發(fā)送 SYN包 給服務(wù)端程序。

由于 TCP三次握手 的第一步是由客戶端發(fā)送 SYN包 給服務(wù)端,所以我們主要關(guān)注 tcp_connect() 函數(shù)的實現(xiàn),其代碼如下:

  1. void tcp_connect(struct sock *sk, struct sk_buff *buff, int mtu) 
  2.     struct dst_entry *dst = sk->dst_cache; 
  3.     struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); 
  4.  
  5.     skb_reserve(buff, MAX_HEADER + sk->prot->max_header); // 保留所有的協(xié)議頭部空間 
  6.  
  7.     tp->snd_wnd = 0; 
  8.     tp->snd_wl1 = 0; 
  9.     tp->snd_wl2 = tp->write_seq; 
  10.     tp->snd_una = tp->write_seq; 
  11.     tp->rcv_nxt = 0; 
  12.     sk->err = 0; 
  13.     // 設(shè)置TCP頭部長度 
  14.     tp->tcp_header_len = sizeof(struct tcphdr) + 
  15.                            (sysctl_tcp_timestamps ? TCPOLEN_TSTAMP_ALIGNED : 0); 
  16.     ... 
  17.     tcp_sync_mss(sk, mtu); // 設(shè)置TCP報文段最大長度 
  18.     ... 
  19.     TCP_SKB_CB(buff)->flags = TCPCB_FLAG_SYN; // 設(shè)置SYN標(biāo)志為1(表示這是一個SYN包) 
  20.     TCP_SKB_CB(buff)->sacked = 0; 
  21.     TCP_SKB_CB(buff)->urg_ptr = 0; 
  22.     buff->csum = 0; 
  23.     TCP_SKB_CB(buff)->seq = tp->write_seq++;   // 設(shè)置序列號 
  24.     TCP_SKB_CB(buff)->end_seq = tp->write_seq; // 設(shè)置確認(rèn)號 
  25.     tp->snd_nxt = TCP_SKB_CB(buff)->end_seq; 
  26.  
  27.     // 初始化滑動窗口的大小 
  28.     tp->window_clamp = dst->window; 
  29.     tcp_select_initial_window(sock_rspace(sk)/2, tp->mss_clamp, 
  30.                               &tp->rcv_wnd, &tp->window_clamp, 
  31.                               sysctl_tcp_window_scaling, &tp->rcv_wscale); 
  32.     ... 
  33.     tcp_set_state(sk, TCP_SYN_SENT); // 設(shè)置 socket 的狀態(tài)為 SYN_SENT 
  34.  
  35.     // 調(diào)用 tcp_v4_hash() 函數(shù)把 socket 添加到 tcp_established_hash 哈希表中 
  36.     sk->prot->hash(sk); 
  37.  
  38.     tp->rto = dst->rtt; 
  39.     tcp_init_xmit_timers(sk); // 設(shè)置超時重傳定時器 
  40.     ... 
  41.     // 把 skb 添加到 write_queue 隊列中, 用于重傳時使用 
  42.     __skb_queue_tail(&sk->write_queue, buff); 
  43.     TCP_SKB_CB(buff)->when = jiffies; 
  44.     ... 
  45.     // 調(diào)用 tcp_transmit_skb() 函數(shù)構(gòu)建 SYN 包發(fā)送給服務(wù)端程序 
  46.     tcp_transmit_skb(sk, skb_clone(buff, GFP_KERNEL)); 
  47.     ... 

tcp_connect() 函數(shù)的實現(xiàn)雖然比較長,但是邏輯相對簡單,就是設(shè)置 TCP 頭部各個字段的值,然后把數(shù)據(jù)包發(fā)送給服務(wù)端。下面列出 tcp_connect() 函數(shù)主要的工作:

  • 設(shè)置 TCP 頭部的 SYN 標(biāo)志位 為 1 (表示這是一個 SYN包)。
  • 設(shè)置 TCP 頭部的序列號和確認(rèn)號。
  • 初始化滑動窗口的大小。
  • 設(shè)置 socket 的狀態(tài)為 SYN_SENT,可參考上面三次握手的狀態(tài)圖。
  • 調(diào)用 tcp_v4_hash() 函數(shù)把 socket 添加到 tcp_established_hash 哈希表中,用于通過 IP 地址和端口快速查找到對應(yīng)的 socket 對象。
  • 設(shè)置超時重傳定時器。
  • 把 skb 添加到 write_queue 隊列中, 用于超時重傳。
  • 調(diào)用 tcp_transmit_skb() 函數(shù)構(gòu)建 SYN包 發(fā)送給服務(wù)端程序。

注意:Linux 內(nèi)核通過 tcp_established_hash 哈希表來保存所有的 TCP 連接 socket 對象,而哈希表的鍵值就是連接的 IP 和端口,所以可以通過連接的 IP 和端口從 tcp_established_hash 哈希表中快速找到對應(yīng)的 socket 連接。如下圖所示:

通過上面的分析,構(gòu)建 SYN包 并且發(fā)送給服務(wù)端是通過 tcp_transmit_skb() 函數(shù)完成的,所以我們來分析一下 tcp_transmit_skb() 函數(shù)的實現(xiàn):

  1. void tcp_transmit_skb(struct sock *sk, struct sk_buff *skb) 
  2.     if (skb != NULL) { 
  3.         struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); 
  4.         struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); 
  5.         int tcp_header_size = tp->tcp_header_len; 
  6.         struct tcphdr *th; 
  7.         ... 
  8.         // TCP頭部指針 
  9.         th = (struct tcphdr *)skb_push(skb, tcp_header_size); 
  10.         skb->h.th = th; 
  11.  
  12.         skb_set_owner_w(skb, sk); 
  13.  
  14.         // 構(gòu)建 TCP 協(xié)議頭部 
  15.         th->source = sk->sport;                // 源端口 
  16.         th->dest = sk->dport;                  // 目標(biāo)端口 
  17.         th->seq = htonl(TCP_SKB_CB(skb)->seq); // 請求序列號 
  18.         th->ack_seq = htonl(tp->rcv_nxt);      // 應(yīng)答序列號 
  19.         th->doff = (tcp_header_size >> 2);     // 頭部長度 
  20.         th->res1 = 0; 
  21.         *(((__u8 *)th) + 13) = tcb->flags;     // 設(shè)置TCP頭部的標(biāo)志位 
  22.  
  23.         if (!(tcb->flags & TCPCB_FLAG_SYN)) 
  24.             th->window = htons(tcp_select_window(sk)); // 滑動窗口大小 
  25.  
  26.         th->check = 0;                                 // 校驗和 
  27.         th->urg_ptr = ntohs(tcb->urg_ptr);             // 緊急指針 
  28.         ... 
  29.         // 計算TCP頭部的校驗和 
  30.         tp->af_specific->send_check(sk, th, skb->len, skb); 
  31.         ... 
  32.         tp->af_specific->queue_xmit(skb); // 調(diào)用 ip_queue_xmit() 函數(shù)發(fā)送數(shù)據(jù)包 
  33.     } 

tcp_transmit_skb() 函數(shù)的實現(xiàn)相對簡單,就是構(gòu)建 TCP 協(xié)議頭部,然后調(diào)用 ip_queue_xmit() 函數(shù)將數(shù)據(jù)包交由 IP 協(xié)議發(fā)送出去。

至此,客戶端就發(fā)送了一個 SYN包 給服務(wù)端,也就是說,TCP 三次握手 的第一步已經(jīng)完成。

 

責(zé)任編輯:武曉燕 來源: Linux內(nèi)核那些事
相關(guān)推薦

2023-03-06 15:43:56

2023-09-07 16:46:54

TCP數(shù)據(jù)傳遞

2017-09-25 21:27:07

TCP協(xié)議數(shù)據(jù)鏈

2023-10-24 15:22:09

TCPUDP

2022-10-10 07:34:36

TCP三次握手區(qū)塊鏈

2020-12-08 06:34:16

TCP握手SYN 報文

2019-06-12 11:26:37

TCP三次握手四次揮手

2015-10-13 09:42:52

TCP網(wǎng)絡(luò)協(xié)議

2024-01-12 08:23:11

TCPACK服務(wù)器

2024-10-09 20:54:16

2022-07-25 07:07:35

TCP客戶端服務(wù)器

2022-07-07 09:00:17

TCP 連接HTTP 協(xié)議

2018-10-15 08:06:33

TCP握手原理

2020-08-27 07:41:28

TCP協(xié)議數(shù)據(jù)

2018-07-05 14:25:01

TCP握手原理

2023-09-02 21:57:52

網(wǎng)絡(luò)TCP協(xié)議

2019-12-12 10:36:43

TCPSYNIP

2021-07-03 17:47:25

TCP控制協(xié)議

2023-11-01 08:04:08

WiresharkTCP協(xié)議

2021-01-29 06:11:08

TCP通信三次握手
點贊
收藏

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

91精品国产综合久久久久久久久久 | 成全电影大全在线观看| 久久99热99| 欧美日本中文字幕| 熟妇高潮精品一区二区三区| 日韩三级影视| 一区二区三区在线免费观看| 精品日产一区2区三区黄免费| 一女三黑人理论片在线| 少妇精品视频一区二区免费看| 中文字幕中文字幕一区| 欧美洲成人男女午夜视频| 欧美一级免费在线| 123区在线| 国产激情精品久久久第一区二区| 久久久这里只有精品视频| 麻豆精品免费视频| www.欧美| 1区2区3区欧美| 国产高清一区视频| 中文字幕有码无码人妻av蜜桃| 欧美日韩伊人| 正在播放欧美一区| 挪威xxxx性hd极品| 97caopron在线视频| 99精品视频中文字幕| 国产日韩欧美夫妻视频在线观看| 成人片黄网站色大片免费毛片| 日韩亚洲国产免费| 色偷偷久久人人79超碰人人澡 | 免费在线超碰| 国产成人aaa| 91精品久久久久久久久不口人| 欧美亚洲精品天堂| 国产精品草草| 伦理中文字幕亚洲| www亚洲色图| 欧美人与拘性视交免费看| 欧美videofree性高清杂交| 91女神在线观看| 外国成人直播| 日韩欧美中文免费| 国产精品久久中文字幕| 亚洲精品白浆| 夜夜嗨av一区二区三区| 9191国产视频| 影音先锋在线播放| 亚洲女子a中天字幕| 在线观看免费91| 中文字幕 视频一区| 香蕉久久夜色精品国产| 97久久久久久| 中文字幕一区二区三区精品| 欧美日韩理论| 久久久久久久久久久免费| 2021亚洲天堂| 黑人一区二区三区四区五区| 久久91亚洲精品中文字幕奶水 | 天堂av中文字幕| 粉嫩aⅴ一区二区三区四区| 51成人做爰www免费看网站| 国产免费不卡视频| 国产一区二区免费看| 91久久精品在线| 国产一级特黄视频| 国产精品va| 国产+人+亚洲| www亚洲视频| wwwxxx在线观看| 亚洲综合伊人| 欧美日韩一区三区| 色网站在线视频| 66精品视频在线观看| 欧美精品一区二区在线观看| 熟妇人妻久久中文字幕| 香蕉一区二区| 中文字幕亚洲一区二区三区五十路 | 国产香蕉久久| 欧美精品高清视频| 午夜性福利视频| 久久久久97| 亚洲片国产一区一级在线观看| www久久久久久久| 婷婷伊人综合| 欧美激情视频一区二区三区不卡 | 欧美在线制服丝袜| 亚洲美女爱爱视频| 97色成人综合网站| 亚洲品质视频自拍网| 国产一区在线观看免费| 狠狠久久婷婷| 国产97在线|日韩| 国产黄色大片网站| 久久香蕉国产线看观看99| 国产精品日韩精品| www.黄色国产| 国产午夜亚洲精品午夜鲁丝片 | 日本黄色免费观看| 欧美一区二区三区激情视频| 精品中文字幕在线| 成人免费视频国产免费| 国产精品一级黄| 久久亚洲综合网| 99福利在线| 在线精品亚洲一区二区不卡| 亚洲国产欧美日韩在线| 日韩电影免费观看高清完整版| 欧美日韩在线不卡| 黄色性视频网站| 日韩免费在线| 91精品国产电影| 久久97人妻无码一区二区三区| 国产一区二区你懂的| 成人a视频在线观看| 亚洲av成人精品日韩在线播放| 成人一区二区在线观看| 日韩精品一区二区三区丰满| 免费污视频在线| 欧美另类变人与禽xxxxx| 国产伦精品一区二区三区妓女 | 亚洲无码精品一区二区三区| 国产精品一区久久久久| 亚欧洲精品在线视频免费观看| a√中文在线观看| 3d动漫精品啪啪一区二区竹菊| 中文人妻一区二区三区| 亚洲网站视频| 亚洲综合精品伊人久久| 2021av在线| 色视频成人在线观看免| 日韩av手机在线播放| 亚洲精品中文字幕乱码| 国产精品视频网址| 国产色在线 com| 婷婷国产在线综合| 免费看91视频| 综合激情婷婷| 91精品中文在线| 中文字幕在线播放| 日本精品一区二区三区四区的功能| www.四虎在线| 伊人久久综合| 99精品99久久久久久宅男| 国产高潮在线观看| 国产精品国产a级| www.久久久精品| av在线不卡免费观看| 一区二区欧美在线| 国产美女高潮视频| 蜜臀av一区二区在线免费观看| 成人免费视频a| av在线首页| 欧美一a一片一级一片| 国产色视频一区二区三区qq号| 99riav1国产精品视频| 国产成人高潮免费观看精品| 天堂网www中文在线| 中文字幕第一页久久| 国产极品美女高潮无套久久久| 要久久电视剧全集免费| 久久精品亚洲94久久精品| 久久久久久天堂| 噜噜噜久久亚洲精品国产品小说| 激情伦成人综合小说| 国产777精品精品热热热一区二区| 精品av久久707| 五月天综合激情| 久久尤物电影视频在线观看| 日本新janpanese乱熟| 清纯唯美亚洲综合一区| 成人免费网站在线| 日韩av激情| 国产视频久久网| 中文字幕一区二区三区四区欧美| 国产精品萝li| 欧美色图校园春色| 亚洲免费激情| 日韩欧美视频第二区| 四虎影视国产精品| 久久久久久久国产精品视频| 伦理片一区二区三区| 欧美日韩五月天| 久久网一区二区| 久久先锋影音av| 日本高清久久久| 1024日韩| 97超碰资源| 成人黄色动漫| 在线视频欧美日韩| 亚洲国产成人精品一区二区三区| 激情久久av一区av二区av三区| 国产精品欧美在线| 亚洲国产精品成人综合久久久| 亚洲女人av| 在线精品日韩| 欧美日韩看看2015永久免费| 国产精品看片资源| 久久av色综合| 中文字幕欧美亚洲| 懂色av一区二区三区四区| 色综合久久久久综合体| 天天综合天天做| 石原莉奈在线亚洲二区| 痴汉一区二区三区| 欧美大片1688| 美乳少妇欧美精品| 九色国产在线观看| 日韩欧美高清一区| 国产情侣小视频| 亚洲国产裸拍裸体视频在线观看乱了| 公肉吊粗大爽色翁浪妇视频| youjizz国产精品| 97视频在线免费| 日本激情一区| 精品久久久久久亚洲| 96视频在线观看欧美| 欧美亚洲国产视频| 欧洲黄色一区| 久久精品中文字幕一区| 狠狠狠综合7777久夜色撩人| 精品电影一区二区三区| 亚洲自拍第二页| 日本久久电影网| 国产免费观看av| 亚洲午夜久久久久中文字幕久| 成年人视频软件| 久久美女艺术照精彩视频福利播放| 女人扒开双腿让男人捅| 精品一区二区三区影院在线午夜| 可以免费观看av毛片| 亚洲激情婷婷| 欧美日韩激情四射| 亚洲一区在线| 亚洲一区二区三区乱码| 国产精品一区二区三区av麻| 久久精品二区| 欧美日韩视频网站| 国内精品久久久久影院优| av在线网址观看| 中文字幕一区二区三区电影| 黄色在线视频观看网站| 亚洲国产精品一区二区三区| 亚洲精品成人电影| 日韩欧美国产高清| 精品人妻无码一区二区| 91麻豆精品国产无毒不卡在线观看 | wwwwww.色| 免费视频一区| 国产精品天天av精麻传媒| 日韩国产精品久久| 人人干人人视频| 青青草原综合久久大伊人精品优势| 亚洲欧美日韩国产yyy| 精品产国自在拍| 亚洲成人一区二区三区| 凹凸成人精品亚洲精品密奴| 日韩国产欧美精品| 久久婷婷蜜乳一本欲蜜臀| 99久久精品无码一区二区毛片| 成人在线视频国产| 91免费看片网站| 欧美国产中文高清| 国产精品久久久一区二区三区| 国产精品极品在线观看| 国产精品女视频| 麻豆久久久久| 成人性生交大片免费观看嘿嘿视频 | 亚洲国产精品精华液网站| 国产精品第72页| 粉嫩av一区二区三区免费野| 99超碰在线观看| 精品视频在线免费观看| 国产又色又爽又黄又免费| 日韩一区二区三| 午夜在线视频免费| 亚洲日韩中文字幕在线播放| 欧美日本高清| 欧美国产在线电影| 中文字幕乱码中文乱码51精品 | 国产一区二区| 岛国视频一区| 国产传媒欧美日韩成人精品大片| 一区二区视频在线播放| 国产一区日韩欧美| 国产成人无码一二三区视频| 久久99精品久久久久久国产越南| 美女扒开腿免费视频| 久久精品欧美一区二区三区不卡| 2014亚洲天堂| 午夜伦理一区二区| 中文字幕第31页| 欧美r级电影在线观看| 免费一级在线观看| 欧美第一淫aaasss性| 亚洲四虎影院| 国产精品免费一区二区| 欧洲专线二区三区| 国产精品日韩三级| 日本中文一区二区三区| 亚洲午夜久久久久久久久| 中文幕一区二区三区久久蜜桃| 久久久精品人妻一区二区三区四 | 99久久精品国产一区二区成人| 亚洲国产中文字幕在线观看| 免费大片黄在线| 91成人在线观看国产| 国产亚洲精aa在线看| 日韩免费毛片| 亚洲欧洲综合在线| 国产精品三级电影| 国产精品99精品无码视| 欧美久久久久久久久久| 日本在线一二三| 欧美俄罗斯乱妇| 成人豆花视频| 亚洲人成77777| 亚洲欧美日韩国产| 国产无套精品一区二区三区| 国产精品国产自产拍在线| 成人在线免费看视频| 精品乱人伦一区二区三区| 日本免费在线视频| 国产精品久久久久久久久免费看 | 99re6在线精品视频免费播放| 成人黄色片网站| 国产真实有声精品录音| 欧美激情 国产精品| 国产精品91一区二区| www.4hu95.com四虎| 色综合天天做天天爱| 午夜影院免费体验区| 国产69精品久久久久9| 日韩在线成人| 男女激烈动态图| 精品在线亚洲视频| 国产探花视频在线播放| 色久综合一二码| 日本一卡二卡四卡精品| 97超级碰碰碰久久久| 国产精品丝袜在线播放| 国产一区 在线播放| 久久99最新地址| 多男操一女视频| 欧美一区二区在线免费播放| 日本天堂在线观看| 国产在线日韩在线| 久久久久国产精品| www激情五月| 亚洲欧美国产毛片在线| 99国产精品欲| 九九久久久久久久久激情| 看亚洲a级一级毛片| 狠狠噜天天噜日日噜| 成人黄色777网| 免费在线不卡视频| 精品偷拍一区二区三区在线看| 国产伦子伦对白在线播放观看| 久草精品电影| 久久精品日产第一区二区| 日韩丰满少妇无码内射| 欧美视频一区二区三区在线观看| 日韩在线观看www| 91在线免费观看网站| 国产精品99一区二区三区| 亚洲色图欧美自拍| 亚洲高清在线视频| 日夜干在线视频| 国产精品久久中文| 亚洲一区欧美| 变态另类丨国产精品| 日本韩国视频一区二区| 日本三级视频在线观看| 超碰在线观看97| 裸体素人女欧美日韩| 五月天免费网站| 成人免费网站视频| 久久资源免费视频| 欧美日韩午夜电影网| 蜜臀av色欲a片无码精品一区 | 欧美猛烈性xbxbxbxb| 91视频最新| 久久都是精品| 内射毛片内射国产夫妻| 欧美一卡2卡3卡4卡| 高清在线视频不卡| 亚洲午夜精品久久久久久浪潮| 国产美女精品人人做人人爽| 日韩av男人天堂| 一区二区三区四区视频| 久久国产精品免费一区二区三区| 妺妺窝人体色777777| 欧美激情一区二区在线| 精品人妻一区二区三区含羞草| 91福利视频网| 小处雏高清一区二区三区| 亚洲天堂2024| 欧美日韩一级视频| 99re6在线精品视频免费播放| 亚洲一区二区三区涩| 9色porny自拍视频一区二区|