成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 從Linux源碼看Socket(TCP)Client端的Connect的示例詳解

從Linux源碼看Socket(TCP)Client端的Connect的示例詳解

熱門標(biāo)簽:工廠位置地圖標(biāo)注 企業(yè)400電話辦理哪正規(guī) 地圖標(biāo)注企業(yè)名稱侵權(quán)案件 地圖標(biāo)注需要現(xiàn)場嗎 400電話辦理哪家好廠商 繽客網(wǎng)注冊時地圖標(biāo)注出不來 網(wǎng)站上插入地圖標(biāo)注內(nèi)容 重慶營銷外呼系統(tǒng)排名 鶴壁電銷外呼系統(tǒng)怎么安裝

前言

筆者一直覺得如果能知道從應(yīng)用到框架再到操作系統(tǒng)的每一處代碼,是一件Exciting的事情。
今天筆者就來從Linux源碼的角度看下Client端的Socket在進(jìn)行Connect的時候到底做了哪些事情。由于篇幅原因,關(guān)于Server端的Accept源碼講解留給下次給大家介紹。
(基于Linux 3.10內(nèi)核)

一個最簡單的Connect例子

int clientSocket;
if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
	// 創(chuàng)建socket失敗失敗
 	return -1;
}
......
if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
	// connect 失敗
	return -1;
}
.......

首先我們通過socket系統(tǒng)調(diào)用創(chuàng)建了一個socket,其中指定了SOCK_STREAM,而且最后一個參數(shù)為0,也就是建立了一個通常所有的TCP Socket。在這里,我們直接給出TCP Socket所對應(yīng)的ops也就是操作函數(shù)。

如果你想知道上圖中的結(jié)構(gòu)是怎么來的,可以看下筆者以前的文章:

https://www.jb51.net/article/106563.htm

值得注意的是,由于socket系統(tǒng)調(diào)用操作做了如下兩個代碼的判斷

sock_map_fd
	|->get_unused_fd_flags
			|->alloc_fd
				|->expand_files (ulimit)
	|->sock_alloc_file	
		|->alloc_file
			|->get_empty_filp (/proc/sys/fs/max_files)

第一個判斷,ulmit超限:

int expand_files(struct files_struct *files, int nr
{
	......
	if (nr >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
		return -EMFILE;
	......
}

這邊的判斷即是ulimit的限制!在這里返回-EMFILE對應(yīng)的描述就是
"Too many open files"

第二個判斷max_files超限

struct file *get_empty_filp(void)
{
 ......
	/*
	 * 由此可見,特權(quán)用戶可以無視文件數(shù)最大大小的限制!
	 */
	if (get_nr_files() >= files_stat.max_files && !capable(CAP_SYS_ADMIN)) {
		/*
		 * percpu_counters are inaccurate. Do an expensive check before
		 * we go and fail.
		 */
		if (percpu_counter_sum_positive(&nr_files) >= files_stat.max_files)
			goto over;
	}
	
 ......
}

所以在文件描述符超過所有進(jìn)程能打開的最大文件數(shù)量限制(/proc/sys/fs/file-max)的時候會返回-ENFILE,對應(yīng)的描述就是"Too many open files in system",但是特權(quán)用戶確可以無視這一限制,如下圖所示:

connect系統(tǒng)調(diào)用

我們再來看一下connect系統(tǒng)調(diào)用:

int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen)

這個系統(tǒng)調(diào)用有三個參數(shù),那么依據(jù)規(guī)則,它肯定在內(nèi)核中的源碼長下面這個樣子

SYSCALL_DEFINE3(connect, ......

筆者全文搜索了下,就找到了具體的實現(xiàn):

socket.c
SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
		int, addrlen)
{
 ......
	err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen,
				 sock->file->f_flags);
	......
}

前面圖給出了在TCP下的sock->ops == inet_stream_ops,然后再陷入到更進(jìn)一步的調(diào)用棧中,即下面的:

SYSCALL_DEFINE3(connect
	|->inet_stream_ops
		|->inet_stream_connect
			|->tcp_v4_connect
				|->tcp_set_state(sk, TCP_SYN_SENT);設(shè)置狀態(tài)為TCP_SYN_SENT
			 	|->inet_hash_connect
				|->tcp_connect

首先,我們來看一下inet_hash_connect這個函數(shù),里面有一個端口號的搜索過程,搜索不到可用端口號就會導(dǎo)致創(chuàng)建連接失?。?nèi)核能夠建立一個連接也是跋涉了千山萬水的!我們先看一下搜索端口號的邏輯,如下圖所示:

獲取端口號范圍

首先,我們從內(nèi)核中獲取connect能夠使用的端口號范圍,在這里采用了Linux中的順序鎖(seqlock)

void inet_get_local_port_range(int *low, int *high)
{
	unsigned int seq;

	do {
		// 順序鎖
		seq = read_seqbegin(&sysctl_local_ports.lock);

		*low = sysctl_local_ports.range[0];
		*high = sysctl_local_ports.range[1];
	} while (read_seqretry(&sysctl_local_ports.lock, seq));
}

順序鎖事實上就是結(jié)合內(nèi)存屏障等機(jī)制的一種樂觀鎖,主要依靠一個序列計數(shù)器。在讀取數(shù)據(jù)之前和之后,序列號都被讀取,如果兩者的序列號相同,說明在讀操作的時候沒有被寫操作打斷過。
這也保證了上面的讀取變量都是一致的,也即low和high不會出現(xiàn)low是改前值而high是改后值得情況。low和high要么都是改之前的,要么都是改之后的!內(nèi)核中修改的地方為:

cat /proc/sys/net/ipv4/ip_local_port_range 
32768 61000 

通過hash決定端口號起始搜索范圍

在Linux上進(jìn)行connect,內(nèi)核給其分配的端口號并不是線性增長的,但是也符合一定的規(guī)律。
先來看下代碼:

int __inet_hash_connect(...)
{
		// 注意,這邊是static變量
		static u32 hint;
		// 這邊的port_offset是用對端ip:port hash的一個值
		// 也就是說對端ip:port固定,port_offset固定
		u32 offset = hint + port_offset;
		for (i = 1; i <= remaining; i++) {
			port = low + (i + offset) % remaining;
			/* port是否占用check */
			....
			goto ok;
		}
		.......
ok:
		hint += i;
		......
}

這里面有幾個小細(xì)節(jié),為了安全原因,Linux本身用對端ip:port做了一次hash作為搜索的初始o(jì)ffset,所以不同遠(yuǎn)端ip:port初始搜索范圍可以基本是不同的!但同樣的對端ip:port初始搜索范圍是相同的!

在筆者機(jī)器上,一個完全干凈的內(nèi)核里面,不停的對同一個遠(yuǎn)端ip:port,其以2進(jìn)行穩(wěn)定增長,也即38742->38744->38746,如果有其它的干擾,就會打破這個規(guī)律。

端口號范圍限制

由于我們指定了端口號返回ip_local_port_range是不是就意味著我們最多創(chuàng)建high-low+1個連接呢?當(dāng)然不是,由于檢查端口號是否重復(fù)是將(網(wǎng)絡(luò)命名空間,對端ip,對端port,本端port,Socket綁定的dev)當(dāng)做唯一鍵進(jìn)行重復(fù)校驗,所以限制僅僅是在同一個網(wǎng)絡(luò)命名空間下,連接同一個對端ip:port的最大可用端口號數(shù)為high-low+1,當(dāng)然可能還要減去ip_local_reserved_ports。如下圖所示:

檢查端口號是否被占用

端口號的占用搜索分為兩個階段,一個是處于TIME_WAIT狀態(tài)的端口號搜索,另一個是其它狀態(tài)端口號搜索。

TIME_WAIT狀態(tài)端口號搜索

眾所周知,TIME_WAIT階段是TCP主動close必經(jīng)的一個階段。如果Client采用短連接的方式和Server端進(jìn)行交互,就會產(chǎn)生大量的TIME_WAIT狀態(tài)的Socket。而這些Socket由占用端口號,所以當(dāng)TIME_WAIT過多,打爆上面的端口號范圍之后,新的connect就會返回錯誤碼:

C語言connect返回錯誤碼為
-EADDRNOTAVAIL,對應(yīng)描述為Cannot assign requested address 
對應(yīng)Java的異常為
java.net.NoRouteToHostException: Cannot assign requested address (Address not available)

ip_local_reserved_ports。如下圖所示:

由于TIME_WAIT大概一分鐘左右才能消失,如果在一分鐘內(nèi)Client端和Server建立大量的短連接請求就容易導(dǎo)致端口號耗盡。而這個一分鐘(TIME_WAIT的最大存活時間)是在內(nèi)核(3.10)編譯階段就確定了的,無法通過內(nèi)核參數(shù)調(diào)整。 如下代碼所示:

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
				 * state, about 60 seconds	*/

Linux自然也考慮到了這種情況,所以提供了一個tcp_tw_reuse參數(shù)使得在搜索端口號時可以在某些情況下重用TIME_WAIT。代碼如下:

__inet_hash_connect
	|->__inet_check_established
static int __inet_check_established(......)
{
	......	
	/* Check TIME-WAIT sockets first. */
	sk_nulls_for_each(sk2, node, &head->twchain) {
		tw = inet_twsk(sk2);
		// 如果在time_wait中找到一個match的port,就判斷是否可重用
		if (INET_TW_MATCH(sk2, net, hash, acookie,
					saddr, daddr, ports, dif)) {
			if (twsk_unique(sk, sk2, twp))
				goto unique;
			else
				goto not_unique;
		}
	}
	......
}

如上面代碼中寫的那樣,如果在一堆TIME-WAIT狀態(tài)的Socket里面能夠有當(dāng)前要搜索的port,則判斷是否這個port可以重復(fù)利用。如果是TCP的話這個twsk_unique的實現(xiàn)函數(shù)是:

int tcp_twsk_unique(......)
{
	......
	if (tcptw->tw_ts_recent_stamp &&
	 (twp == NULL || (sysctl_tcp_tw_reuse &&
			 get_seconds() - tcptw->tw_ts_recent_stamp > 1))) {
		tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2
		......
		return 1;
	}
	return 0;	
}

上面這段代碼邏輯如下所示:

在開啟了tcp_timestamp以及tcp_tw_reuse的情況下,在Connect搜索port時只要比之前用這個port的TIME_WAIT狀態(tài)的Socket記錄的最近時間戳>1s,就可以重用此port,即將之前的1分鐘縮短到1s。同時為了防止?jié)撛诘男蛄刑枦_突,直接將write_seq加上在65537,這樣,在單Socket傳輸速率小于80Mbit/s的情況下,不會造成序列號沖突。
同時這個tw_ts_recent_stamp設(shè)置的時機(jī)如下圖所示:

所以如果Socket進(jìn)入TIME_WAIT狀態(tài)后,如果一直有對應(yīng)的包發(fā)過來,那么會影響此TIME_WAIT對應(yīng)的port是否可用的時間。我們可以通過下面命令開始tcp_tw_reuse:

echo '1' > /proc/sys/net/ipv4/tcp_tw_reuse

ESTABLISHED狀態(tài)端口號搜索

ESTABLISHED的端口號搜索就簡單了許多

/* And established part... */
	sk_nulls_for_each(sk2, node, &head->chain) {
		if (INET_MATCH(sk2, net, hash, acookie,
					saddr, daddr, ports, dif))
			goto not_unique;
	}

以(網(wǎng)絡(luò)命名空間,對端ip,對端port,本端port,Socket綁定的dev)當(dāng)做唯一鍵進(jìn)行匹配,如果匹配成功,表明此端口無法重用。

端口號迭代搜索

Linux內(nèi)核在[low,high]范圍按照上述邏輯進(jìn)行port的搜索,如果沒有搜索到port,即port耗盡,就會返回-EADDRNOTAVAIL,也即Cannot assign requested address。但還有一個細(xì)節(jié),如果是重用TIME_WAIT狀態(tài)的Socket的端口的話,就會將對應(yīng)的TIME_WAIT狀態(tài)的Socket給銷毀。

__inet_hash_connect(......)
{
		......
		if (tw) {
			inet_twsk_deschedule(tw, death_row);
			inet_twsk_put(tw);
		}
		......
}

尋找路由表

在我們找到一個可用端口號port后,就會進(jìn)入搜尋路由階段:

ip_route_newports
	|->ip_route_output_flow
			|->__ip_route_output_key
				|->ip_route_output_slow
					|->fib_lookup

這也是一個非常復(fù)雜的過程,限于篇幅,就不做詳細(xì)闡述了。如果搜索不到路由信息的話,會返回。

-ENETUNREACH,對應(yīng)描述為Network is unreachable

Client端的三次握手

在前面一大堆前置條件就緒后,才進(jìn)入到真正的三次握手階段。

tcp_connect
 |->tcp_connect_init 初始化tcp socket
 |->tcp_transmit_skb 發(fā)送SYN包
 |->inet_csk_reset_xmit_timer 設(shè)置SYN重傳定時器

tcp_connect_init初始化了一大堆TCP相關(guān)的設(shè)置,例如mss_cache/rcv_mss等一大堆。而且如果開啟了TCP窗口擴(kuò)大選項的話,其窗口擴(kuò)大因子也在此函數(shù)里進(jìn)行計算:

tcp_connect_init
	|->tcp_select_initial_window
int tcp_select_initial_window(...)
{
	......
	(*rcv_wscale) = 0;
	if (wscale_ok) {
		/* Set window scaling on max possible window
		 * See RFC1323 for an explanation of the limit to 14
		 */
		space = max_t(u32, sysctl_tcp_rmem[2], sysctl_rmem_max);
		space = min_t(u32, space, *window_clamp);
		while (space > 65535 && (*rcv_wscale) < 14) {
			space >>= 1;
			(*rcv_wscale)++;
		}
	}
	......
}	

如上面代碼所示,窗口擴(kuò)大因子取決于Socket最大可允許的讀緩沖大小和window_clamp(最大允許滑動窗口大小,動態(tài)調(diào)整)。搞完了一票初始信息設(shè)置后,才開始真正的三次握手。
在tcp_transmit_skb中才真正發(fā)送SYN包,同時在緊接著的inet_csk_reset_xmit_timer里設(shè)置了SYN超時定時器。如果對端一直不發(fā)送SYN_ACK,將會返回-ETIMEDOUT。

重傳的超時時間和

/proc/sys/net/ipv4/tcp_syn_retries

息息相關(guān),Linux默認(rèn)設(shè)置為5,建議設(shè)置成3,下面是不同設(shè)置的超時時間參照圖。

在設(shè)置了SYN超時重傳定時器后,tcp_connnect就返回,并一路返回到最初始的inet_stream_connect。在這里我們就等待對端返回SYN_ACK或者SYN定時器超時。

int __inet_stream_connect(struct socket *sock,...,)
{
	// 如果設(shè)置了O_NONBLOCK則timeo為0
	timeo = sock_sndtimeo(sk, flags & O_NONBLOCK);
	......
	// 如果timeo=0即O_NONBLOCK會立刻返回
	// 否則等待timeo時間
	if (!timeo || !inet_wait_for_connect(sk, timeo, writebias))
		goto out;
}

Linux本身提供一個SO_SNDTIMEO來控制對connect的超時,不過Java并沒有采用這個選項。而是采用別的方式進(jìn)行connect的超時控制。僅僅就C語言的connect系統(tǒng)調(diào)用而言,不設(shè)置SO_SNDTIMEO,就會將對應(yīng)用戶進(jìn)程進(jìn)行睡眠,直到SYN_ACK到達(dá)或者超時定時器超時才將次用戶進(jìn)程喚醒。

如果是NON_BLOCK的話,則是通過select/epoll等多路復(fù)用機(jī)制去捕獲超時或者連接成功事件。

對端SYN_ACK到達(dá)

在Server端SYN_ACK到達(dá)之后會按照下面的代碼路徑傳遞,并喚醒用戶態(tài)進(jìn)程:

tcp_v4_rcv
	|->tcp_v4_do_rcv
		|->tcp_rcv_state_process
			|->tcp_rcv_synsent_state_process
				|->tcp_finish_connect
					|->tcp_init_metrics 初始化度量統(tǒng)計
					|->tcp_init_congestion_control 初始化擁塞控制
					|->tcp_init_buffer_space 初始化buffer空間
					|->inet_csk_reset_keepalive_timer 開啟包活定時器
					|->sk_state_change(sock_def_wakeup) 喚醒用戶態(tài)進(jìn)程
				|->tcp_send_ack 發(fā)送三次握手的最后一次握手給Server端
			|->tcp_set_state(sk, TCP_ESTABLISHED) 設(shè)置為ESTABLISHED狀態(tài)

總結(jié)

Client(TCP)端進(jìn)行Connect的過程真是跋山涉水,從一開始文件描述符的限制到端口號的搜索再到路由表的搜索再到最后的三次握手,任何一個環(huán)節(jié)有問題就會導(dǎo)致創(chuàng)建連接失敗,筆者詳細(xì)的描述了這些機(jī)制的源碼實現(xiàn)。希望本篇文章可以對讀者在以后遇到Connect失敗問題時候有所幫助。

到此這篇關(guān)于從Linux源碼看Socket(TCP)Client端的Connect的文章就介紹到這了,更多相關(guān)Linux源碼看Socket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:日照 東莞 克拉瑪依 棗莊 鹽城 96 渭南 常州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《從Linux源碼看Socket(TCP)Client端的Connect的示例詳解》,本文關(guān)鍵詞  從,Linux,源碼,看,Socket,TCP,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《從Linux源碼看Socket(TCP)Client端的Connect的示例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于從Linux源碼看Socket(TCP)Client端的Connect的示例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    中文字幕av手机在线| 91精品国产乱码久久久久久久| 亚洲综合激情另类专区老铁性| 99久久婷婷国产综合精品电影| 国精产品一区二区| 鲁鲁狠狠狠7777一区二区| 欧美理论电影大全| 影音先锋中文在线视频| 91精品欧美福利在线观看| 免费日韩视频| 在线免费观看污| 欧美综合在线第二页| 国产精品视频福利| 日韩成人免费在线视频| 欧美精品人人做人人爱视频| 久久亚洲精品成人| 精品久久久久久久久久久久久| 91深夜福利| 久久久精品国产免大香伊| 九九视频在线免费观看| 亚洲国产mv| 成人午夜福利视频| 欧美成人精品xxx| 亚州欧美日韩中文视频| 久久久久久久综合色一本| 亚洲视频一二三| 性做久久久久久免费观看| 国产aⅴ精品一区二区三区久久| 男人和女人做事情在线视频网站免费观看| 亚州av中文字幕在线免费观看| 精品国产伦一区二区三区观看方式| 亚洲国产成人91porn| 国产激情视频一区二区三区欧美| yiren22综合网成人| 欧美 日韩 国产 成人 在线 91| 久久99精品久久久久久青青91| 波多野结衣视频一区| 国产人成高清视频观看| 欧美国产综合一区二区| 国产色产综合色产在线视频| 色婷婷综合在线| 中文字幕亚洲影院| 一二三四区在线| 波多野结衣一本| 免费毛片大全| 欧美精品一区三区在线观看| 国产大片精品免费永久看nba| 亚洲最大成人免费视频| 99久久伊人网影院| 国产精品一区二区资源| 麻豆网站免费在线观看| 亚洲自拍小视频免费观看| 午夜视频福利在线| 麻豆av一区| av不卡在线看| 欧美精品v国产精品v日韩精品| 亚洲欧美日韩中文播放| 亚洲免费伊人电影在线观看av| 狠狠久久五月精品中文字幕| 日本少妇裸体做爰| 色哟哟在线观看一区二区三区| 欧美在线影院一区二区| 久久久久久久久久久久网站| 另类国产ts人妖高潮视频| 欧美超强性xxxxx| 亚洲一区二区三区在线看| 韩国三级电影久久久久久| 五福影院新址进入www1378| a级免费观看| 黄色免费福利视频| 久久影院一区二区三区| 亚洲国产精品成人久久蜜臀| 久久精品国产第一区二区三区| 精品国产乱码久久久久久蜜臀网站| 黄色成人羞羞视频| 日本一区二区在线免费播放| 日本中文字幕二区| 亚洲乱码国产乱码精品精天堂| 色爱av美腿丝袜综合粉嫩av| 成人激情动漫在线观看| 国产精品免费网站| 高清在线观看日韩| ass极品国模人体欣赏| 亚洲va欧美va国产综合久久| wwwww在线观看免费视频| 中文字幕av一区二区三区| 亚洲久草在线视频| 动漫一区二区在线| 欧美日韩在线国产| 亚洲精品美国一| 欧美不卡在线| 精品无码在线视频| 东方av正在进入| 国产欧美日韩精品一区二区免费| 国产片侵犯亲女视频播放| 日韩经典中文字幕在线观看| 夜夜夜夜夜夜操| 日韩黄色动漫| 亚洲视频手机在线观看| 亚洲午夜精品17c| 一区二区精品免费| 午夜av不卡| 91在线一区二区三区| 国产日韩成人精品| 久久av日韩| av777777| 生活片a∨在线观看| 午夜精品久久久久久久第一页按摩| 午夜亚洲国产au精品一区二区| 黄污视频在线看| 成年人网站91| 综合欧美亚洲| 麻豆精品精品国产自在97香蕉| 福利视频一区二区三区| 麻豆精品99| 亚洲国产精品成人综合| 成人全视频免费观看在线看| 日本一道高清亚洲日美韩| 日本久久久久久| 97久精品国产片一区二区三区| 成 人片 黄 色 大 片| 7777奇米亚洲综合久久| 蜜桃视频欧美| 日本h片在线观看| 欧美xxxx少妇| 99色这里只有精品| 精品国产乱码一区二区三区| 亚洲免费在线| 亚洲国产精品精华液ab| 永久免费无码av网站在线观看| 欧美日韩成人免费观看| 久久99国产成人小视频| 国产精品久久久久久久久久久久久| 91麻豆成人久久精品二区三区| 国产美女被草| 影音先锋男士资源站| 欧美色欧美亚洲另类七区| 在线不卡免费欧美| 中文一区一区三区高中清不卡免费| 一本一本久久a久久精品综合麻豆| 欧美精品 国产精品| 午夜欧美大片免费观看| 日韩av电影中文字幕| 亚洲永久免费精品| 久久精品国产精品亚洲精品| 美国三级日本三级久久99| 香港三日本8a三级少妇三级99| 黄色片在线观看免费| 丰满少妇被猛烈进入一区二区| 欧美乱妇高清无乱码免费| 国产蜜臀一区二区打屁股调教| 国产超级va在线视频| 欧美日韩在线综合| 国产手机精品在线| av免费观看国产| 成人av在线网| 夜夜躁日日躁狠狠久久av| 久久久国产精品一区| 97视频人免费观看| 色婷婷综合久色| 亚洲 精品 综合 精品 自拍| 欧美福利在线播放| 色播色播色播色播色播在线| 久久亚洲综合av| 国产又粗又长又大的视频| av动漫精品一区二区| 亚洲美女视频在线观看| 国产91精品久| 日韩天堂在线观看| 激情五月少妇a| 天天躁夜夜躁狠狠是什么心态| 精品少妇爆乳无码av无码专区| 亚洲三级电影全部在线观看高清| 日本中文字幕在线2020| www91在线观看| 小小的日本在线观看免费色网| 欧美肉大捧一进一出免费视频| 91精品专区| 国产喷水吹潮视频www| 色中文字幕在线观看| 国产经典三级在线| 国产精品亚洲lv粉色| 中文字幕第五页| 国产精品亚洲一区二区在线观看| 能看的毛片网站| 5252色成人免费视频| 播金莲一级淫片aaaaaaa| av一级在线观看| 国产无遮挡裸体视频在线观看| 亚洲一级黄色大片| 九九热这里只有| 国产玖玖精品视频| 国产欧美一区二区三区另类精品| 老汉色老汉首页av亚洲| 91大神在线资源观看无广告| 国产午夜精品久久久久久久久| 国产成人福利片| 国产精品视频一区二区三区,| 成人无号精品一区二区三区| 欧美a一区二区| 精品国产乱码91久久久久久网站| 超碰激情在线| 91精品国产乱码久久久张津瑜| 一区二区三区不卡在线视频| 男人在线观看视频| 欧美系列日韩一区| 欧美做爰猛烈大尺度视频| a√中文在线观看| 欧美成人精品影院| 亚洲国产精品第一页| 亚洲图片在线播放| 久久综合网导航| 欧美成人合集magnet| 日韩欧美网站| 亚洲中文字幕一区二区| 色大师av一区二区三区| 国产精品第10页| 伊人久久亚洲| 成人性生生活性生交12| 无码人妻丰满熟妇区毛片| **女人18毛片一区二区| 久久精品人妻一区二区三区| 无人在线观看的免费高清视频| 久久久久久女乱国产| 亚洲精品国产系列| 国产精品成人播放| 99精品在线免费观看| 在线免费观看h| 欧美日韩最好看的视频| 午夜亚洲国产au精品一区二区| 久久精品国产精品国产精品污| 黄网在线观看网址入口| 国产一二三四五| 国产精品对白交换视频| 成人在线观看一区| av大全在线观看| 韩国日本在线视频| 欧美日韩亚洲精品内裤| 玩弄japan白嫩少妇hd| 日韩精品极品在线观看| 国精品无码一区二区三区| 国产激情第一页| 久久国产成人午夜av影院| 免费久久久久久久久| 久久国产天堂福利天堂| 青青草在线免费观看| 红桃视频成人在线观看| 亚洲中文字幕无码一区二区三区| 久久99久久精品欧美| 免费看91的网站| 亚洲女人小视频在线观看| 粗大的内捧猛烈进出视频| 久久久精品日韩| 高清日韩av电影| 黄色欧美日韩| 国产大片中文字幕在线观看| 国产又粗又猛又爽又黄| 看国产成人h片视频| 亚洲精品成人久久久| 男女免费网站| 亚洲视频精选在线| 成人免费视频在线观看| 日本午夜大片a在线观看| 一色道久久88加勒比一| 欧洲毛片在线| 国产乱理伦片在线观看夜一区| 国产草草浮力影院| 亚洲一级在线播放| 欧美日韩国产美| 六月丁香婷婷综合| 亚洲免费av网站| 清纯唯美综合亚洲| 欧美日韩不卡在线| 91精品国产欧美一区二区| 91九色网站| 久久五月精品中文字幕| 天天干天天爽天天射| 真不卡电影网| 99久久精品无免国产免费| 国产午夜福利一区二区| 亚洲在线网站| 中文字幕在线影视资源| 日韩欧美在线网址| 台湾成人免费视频| 亚洲天堂日韩av| 日日干夜夜草| 亚洲人av在线影院| 青青青免费在线视频| 欧美蜜桃一区二区三区| 国产精品日韩一区| 一呦二呦三呦精品国产| 高清欧美性猛交xxxx黑人猛交| 亚洲精品影视在线| 国产区欧美区日韩区| 久久国产一区二区| 草民电影神马电影一区二区| 国产综合久久久久| 91精品国产调教在线观看| 色哟哟欧美精品| 免费a级人成a大片在线观看| 久久人人97超碰人人澡爱香蕉| 欧美三级电影在线看| 欧美精品videosex性欧美| 欧美激情在线一区二区三区| 日本色护士高潮视频在线观看| 国产精品成人观看视频国产奇米| 欧美色图自拍| 国产熟妇久久777777| www.亚洲一区二区三区| 精品麻豆剧传媒av国产九九九| 成人在线免费公开观看视频| xxxxxx国产精品视频| 午夜天堂在线视频| 日韩性xxxx| 高清日韩欧美| 国产精品日日摸夜夜爽| 日本一区二区免费视频| 国产乱人乱偷精品视频a人人澡| av播放在线观看| 中文字幕一区二区三区免费视频| 欧美黄网免费在线观看| 99热精品在线观看| 中文字幕视频网站| 成人黄色免费电影| 国产综合色视频| 在线观看毛片av| 久久男人av资源站| 国产精品二线|