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

Socket是并發安全的嗎

網絡 網絡管理
多線程并發讀/寫同一個TCP socket是線程安全的,因為TCP socket的讀/寫操作都上鎖了。雖然線程安全,但依然不建議你這么做,因為TCP本身是基于數據流的協議,一份完整的消息數據可能會分開多次去寫/讀,內核的鎖只保證單次讀/寫socket是線程安全,鎖的粒度并不覆蓋整個完整消息。因此建議用一個線程去讀/寫TCP socket。

 為了更好的聊今天的話題,我們先假設一個場景。

我相信我讀者大部分都是做互聯網應用開發的,可能對游戲的架構不太了解。

我們想象中的游戲架構是下面這樣的。

圖片

想象中的游戲架構

也就是用戶客戶端直接連接游戲核心邏輯服務器,下面簡稱GameServer。GameServer主要負責實現各種玩法邏輯。

這當然是能跑起來,實現也很簡單。

但這樣會有個問題,因為游戲這塊蛋糕很大,所以總會遇到很多挺刑的事情。

如果讓用戶直連GameServer,那相當于把GameServer的ip暴露給了所有人。

不賺錢還好,一旦游戲賺錢,就會遇到各種攻擊。

你猜《羊了個羊》最火的時候為啥老是崩潰?

假設一個游戲服務器能承載4k玩家,一旦服務器遭受直接攻擊,那4k玩家都會被影響。

這攻擊的是服務器嗎?這明明攻擊的是老板的錢包。

所以很多時候不會讓用戶直連GameServer。

而是在前面加入一層網關層,下面簡稱gateway。類似這樣。

圖片

實際的某些游戲架構

GameServer就躲在了gateway背后,用戶只能得到gateway的IP。

然后將大概每100個用戶放在一個gateway里,這樣如果真被攻擊,就算gateway崩了,受影響的也就那100個玩家。

由于大部分游戲都使用TCP做開發,所以下面提到的連接,如果沒有特別說明,那都是指TCP連接。

那么問題來了。

假設有100個用戶連gateway,那gateway跟GameServer之間也會是 100個連接嗎?

當然不會,gateway跟GameServer之間的連接數會遠小于100。

因為這100個用戶不會一直需要收發消息,總有空閑的時候,完全可以讓多個用戶復用同一條連接,將數據打包一起發送給GameServer,這樣單個連接的利用率也高了,GameServer 也不再需要同時維持太多連接,可以節省了不少資源,這樣就可以多服務幾個大怨種金主。

我們知道,要對網絡連接寫數據,就要執行 send(socket_fd, data)。

于是問題就來了。

已知多個用戶共用同一條連接。

現在多個用戶要發數據,也就是多個用戶線程需要寫同一個socket_fd。

那么,socket是并發安全的嗎?能讓這多個線程同時并發寫嗎?

圖片

并發讀寫socket

寫TCP Socket是線程安全的嗎?

對于TCP,我們一般使用下面的方式創建socket。

sockfd=socket(AF_INET,SOCK_STREAM, 0))

返回的sockfd是socket的句柄id,用于在整個操作系統中唯一標識你的socket是哪個,可以理解為socket的身份證id。

創建socket時,操作系統內核會順帶為socket創建一個發送緩沖區和一個接收緩沖區。分別用于在發送和接收數據的時候給暫存一下數據。

寫socket的方式有很多,既可以是send,也可以是write。

但不管哪個,最后在內核里都會走到 tcp_sendmsg() 函數下。

// net/ipv4/tcp.c
int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t size)
{
// 加鎖
lock_sock(sk);


// ... 拷貝到發送緩沖區的相關操作


// 解鎖
release_sock(sk);
}

在tcp_sendmsg的目的就是將要發送的數據放入到TCP的發送緩沖區中,此時并沒有所謂的發送數據出去,函數就返回了,內核后續再根據實際情況異步發送。關于這點,我在之前寫過的 《動圖圖解 | 代碼執行send成功后,數據就發出去了嗎?》有更詳細的介紹。

圖片

tcp_sendmsg 邏輯

從tcp_sendmsg的代碼中可以看到,在對socket的緩沖區執行寫操作的時候,linux內核已經自動幫我們加好了鎖,也就是說,是線程安全的。

所以可以多線程不加鎖并發寫入數據嗎?

不能。

問題的關鍵在于鎖的粒度。

但我們知道TCP有三大特點,面向連接,可靠的,基于字節流的協議。

圖片

TCP是什么

問題就出在這個"基于字節流",它是個源源不斷的二進制數據流,無邊界。來多少就發多少,但是能發多少,得看你的發送緩沖區還剩多少空間。

舉個例子,假設A線程想發123數據包,B線程想發456數據包。

A和B線程同時執行send(),A先搶到鎖,此時發送緩沖區就剩1個數據包的位置,那發了"1",然后發送緩沖區滿了,A線程退出(非阻塞),當發送緩沖區騰出位置后,此時AB再次同時爭搶,這次被B先搶到了,B發了"4"之后緩沖區又滿了,不得不退出。

重復這樣多次爭搶之后,原本的數據內容都被打亂了,變成了142356。因為數據123是個整體,456又是個整體,像現在這樣數據被打亂的話,接收方就算收到了數據也沒辦法正常解析。

圖片

并發寫socket_fd導致數據異常

也就是說鎖的粒度其實是每次"寫操作",但每次寫操作并不保證能把消息寫完整。

那么問題就來了,那是不是我在寫整個完整消息之前加個鎖,整個消息都寫完之后再解鎖,這樣就好了?

類似下面這樣。

// 偽代碼
int safe_send(msg string)
{
target_len = length(msg)
have_send_len = 0
// 加鎖
lock();

// 不斷循環直到發完整個完整消息
do {
send_len := send(sockfd,msg)
have_send_len = have_send_len + send_len
} while(have_send_len < target_len)


// 解鎖
unlock();

}

這也不行,我們知道加鎖這個事情是影響性能的,鎖的粒度越小,性能就越好。反之性能就越差。

當我們搶到了鎖,使用 send(sockfd,msg) 發送完整數據的時候,如果此時發送緩沖區正好一寫就滿了,那這個線程就得一直占著這個鎖直到整個消息寫完。其他線程都在旁邊等它解鎖,啥事也干不了,焦急難耐想著搶鎖。

但凡某個消息體稍微大點,這樣的問題就會變得更嚴重。整個服務的性能也會被這波神仙操作給拖垮。

歸根結底還是因為鎖的粒度太大了。

有沒有更好的方式呢?

其實多個線程搶鎖,最后搶到鎖的線程才能進行寫操作,從本質上來看,就是將所有用戶發給GameServer邏輯服務器的消息給串行化了,

那既然是串行化,我完全可以在在業務代碼里為每個socket_fd配一個隊列來做,將數據在用戶態加鎖后塞到這個隊列里,再單獨開一個線程,這個線程的工作就是發送消息給socket_fd。

于是上面的場景就變成了下面這樣。

圖片

并發寫到加鎖隊列后由一個線程處理

于是在gateway層,多個用戶線程同時寫消息時,會去爭搶某個socket_fd對應的隊列,搶到鎖之后就寫數據到隊列。而真正執行 send(sockfd,msg) 的線程其實只有一個。它會從這個隊列中取數據,然后不加鎖的批量發送數據到 GameServer。

由于加鎖后要做的事情很簡單,也就塞個隊列而已,因此非???。并且由于執行發送數據的只有單個線程,因此也不會有消息體亂序的問題。

讀TCP Socket是線程安全的嗎?

在前面有了寫socket是線程安全的結論,我們稍微翻一下源碼就能發現,讀socket其實也是加鎖了的,所以并發多線程讀socket這件事是線程安全的。

// net/ipv4/tcp.c
int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
size_t len, int nonblock, int flags, int *addr_len)
{

// 加鎖
lock_sock(sk);

// ... 將數據從接收緩沖區拷貝到用戶緩沖區

// 釋放鎖
release_sock(sk);

}

但就算是線程安全,也不代表你可以用多個線程并發去讀。

因為這個鎖,只保證你在讀socket 接收緩沖區時,只有一個線程在讀,但并不能保證你每次的時候,都能正好讀到完整消息體后才返回。

所以雖然并發讀不報錯,但每個線程拿到的消息肯定都不全,因為鎖的粒度并不保證能讀完完整消息。

TCP是基于數據流的協議,數據流會源源不斷從網卡那送到接收緩沖區。

如果此時接收緩沖區里有兩條完整消息,比如 "我是小白"和"點贊在看走一波"。

有兩個線程A和B同時并發去讀的話,A線程就可能讀到“我是 點贊走一波", B線程就可能讀到”小白 在看"

兩條消息都變得不完整了。

圖片

并發讀socket_fd導致的數據異常

解決方案還是跟讀的時候一樣,讀socket的只能有一個線程,讀到了消息之后塞到加鎖隊列中,再將消息分開給到GameServer的多線程用戶邏輯模塊中去做處理。

圖片

單線程讀socket_fd后寫入加鎖隊列

讀寫UDP Socket是線程安全的嗎?

聊完TCP,我們很自然就能想到另外一個傳輸層協議UDP,那么它是線程安全的嗎?

我們平時寫代碼的時候如果要使用udp發送消息,一般會像下面這樣操作。

ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);

而執行到底層,會到linux內核的udp_sendmsg函數中。

int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, size_t len) {
if (用到了MSG_MORE的功能) {
lock_sock(sk);
// 加入到發送緩沖區中
release_sock(sk);
} else {
// 不加鎖,直接發送消息
}
}

這里我用偽代碼改了下,大概的含義就是用到MSG_MORE就加鎖,否則不加鎖將傳入的msg作為一整個數據包直接發送。

首先需要搞清楚,MSG_MORE 是啥。它可以通過上面提到的sendto函數最右邊的flags字段進行設置。大概的意思是告訴內核,待會還有其他更多消息要一起發,先別著急發出去。此時內核就會把這份數據先用發送緩沖區緩存起來,待會應用層說ok了,再一起發。

但是,我們一般也用不到 MSG_MORE。

所以我們直接關注另外一個分支,也就是不加鎖直接發消息。

那是不是說明走了不加鎖的分支時,udp發消息并不是線程安全的?

其實。還是線程安全的,不用lock_sock(sk)加鎖,單純是因為沒必要。

開啟MSG_MORE時多個線程會同時寫到同一個socket_fd對應的發送緩沖區中,然后再統一一起發送到IP層,因此需要有個鎖防止出現多個線程將對方寫的數據給覆蓋掉的問題。而不開啟MSG_MORE時,數據則會直接發送給IP層,就沒有了上面的煩惱。

再看下udp的接收函數udp_recvmsg,會發現情況也類似,這里就不再贅述。

能否多線程同時并發讀或寫同一個UDP socket?

在TCP中,線程安全不代表你可以并發地讀寫同一個socket_fd,因為哪怕內核態中加了lock_sock(sk),這個鎖的粒度并不覆蓋整個完整消息的多次分批發送,它只保證單次發送的線程安全,所以建議只用一個線程去讀寫一個socket_fd。

那么問題又來了,那UDP呢?會有一樣的問題嗎?

我們跟TCP對比下,大家就知道了。

TCP不能用多線程同時讀和同時寫,是因為它是基于數據流的協議。

那UDP呢?它是基于數據報的協議。

圖片

UDP是什么

基于數據流和基于數據報有什么區別呢?

基于數據流,意味著發給內核底層的數據就跟水進入水管一樣,內核根本不知道什么時候是個頭,沒有明確的邊界。

而基于數據報,可以類比為一件件快遞進入傳送管道一樣,內核很清楚拿到的是幾件快遞,快遞和快遞之間邊界分明。

圖片

水滴和快遞的差異

那從我們使用的方式來看,應用層通過TCP去發數據,TCP就先把它放到緩沖區中,然后就返回。至于什么時候發數據,發多少數據,發的數據是剛剛應用層傳進去的一半還是全部都是不確定的,全看內核的心情。在接收端收的時候也一樣。

但UDP就不同,UDP 對應用層交下來的報文,既不合并,也不拆分,而是保留這些報文的邊界。

無論應用層交給 UDP 多長的報文,UDP 都照樣發送,即一次發送一個報文。至于數據包太長,需要分片,那也是IP層的事情,跟UDP沒啥關系,大不了效率低一些。而接收方在接收數據報的時候,一次取一個完整的包,不存在TCP常見的半包和粘包問題。

正因為基于數據報和基于字節流的差異,TCP 發送端發 10 次字節流數據,接收端可以分 100 次去取數據,每次取數據的長度可以根據處理能力作調整;但 UDP 發送端發了 10 次數據報,那接收端就要在 10 次收完,且發了多少次,就取多少次,確保每次都是一個完整的數據報。

所以從這個角度來說,UDP寫數據報的行為是"原子"的,不存在發一半包或收一半包的問題,要么整個包成功,要么整個包失敗。因此多個線程同時讀寫,也就不會有TCP的問題。

所以,可以多個線程同時讀寫同一個udp socket。

但就算可以,我依然不建議大家這么做。

為什么不建議使用多線程同時讀寫同一個UDP socket

udp本身是不可靠的協議,多線程高并發執行發送時,會對系統造成較大壓力,這時候丟包是常見的事情。雖然這時候應用層能實現重傳邏輯,但重傳這件事畢竟是越少越好。因此通常還會希望能有個應用層流量控制的功能,如果是單線程讀寫的話,就可以在同一個地方對流量實現調控。類似的,實現其他插件功能也會更加方便,比如給某些vip等級的老板更快速的游戲體驗啥的(我瞎說的)。

所以正確的做法,還是跟TCP一樣,不管外面有多少個線程,還是并發加鎖寫到一個隊列里,然后起一個單獨的線程去做發送操作。

圖片

udp并發寫加鎖隊列后再寫socket_fd

總結

1. 多線程并發讀/寫同一個TCP socket是線程安全的,因為TCP socket的讀/寫操作都上鎖了。雖然線程安全,但依然不建議你這么做,因為TCP本身是基于數據流的協議,一份完整的消息數據可能會分開多次去寫/讀,內核的鎖只保證單次讀/寫socket是線程安全,鎖的粒度并不覆蓋整個完整消息。因此建議用一個線程去讀/寫TCP socket。

2. 多線程并發讀/寫同一個UDP socket也是線程安全的,因為UDP socket的讀/寫操作也都上鎖了。UDP寫數據報的行為是"原子"的,不存在發一半包或收一半包的問題,要么整個包成功,要么整個包失敗。因此多個線程同時讀寫,也就不會有TCP的問題。雖然如此,但還是建議用一個線程去讀/寫UDP socket。

最后

上面文章里提到,建議用單線程的方式去讀/寫socket,但每個socket都配一個線程這件事情,顯然有些奢侈,比如線程切換的代價也不小,那這種情況有什么好的解決辦法嗎?

責任編輯:武曉燕 來源: 小白debug
相關推薦

2021-06-08 11:15:10

Redis數據庫命令

2023-05-15 08:01:16

Go語言

2024-12-31 11:40:05

2012-06-13 16:37:50

2014-06-10 09:19:01

2022-07-01 16:02:36

開源安全

2022-02-17 15:52:08

區塊鏈安全技術

2014-11-11 10:39:13

2022-03-22 09:16:24

HTTPS數據安全網絡協議

2021-02-14 00:45:08

區塊鏈加密貨幣安全令牌

2024-11-26 17:43:51

2023-07-28 08:04:56

StringHeaatomic線程

2020-09-03 06:42:12

線程安全CPU

2011-03-01 09:07:40

2021-08-09 08:40:33

零知識證明零信任網絡安全

2016-09-29 15:43:33

2020-10-26 07:07:50

線程安全框架

2024-02-26 15:58:25

2022-02-16 14:31:47

區塊鏈網絡安全風險

2022-02-08 08:14:07

Context數據線程
點贊
收藏

51CTO技術棧公眾號

亚洲日本久久| 成人自拍在线| 亚洲麻豆国产自偷在线| 国产精品三区www17con| 亚洲天堂一区在线| 日韩激情免费| 亚洲成avwww人| 任你操这里只有精品| 精品国产丝袜高跟鞋| 成人小视频在线| 国产成人精品一区| 91插插插插插插| 粉嫩小泬无遮挡久久久久久| 亚洲经典三级| 久久精品国产欧美亚洲人人爽| 日本女人性视频| 亚洲人免费短视频| 亚洲图片有声小说| 亚洲精品一区二区三区樱花 | 日韩电影在线观看电影| 欧美精品午夜视频| 人人妻人人澡人人爽| youjizzjizz亚洲| 欧美日韩国产片| 欧美在线观看成人| 人妖欧美1区| 国产精品的网站| 久久综合伊人77777麻豆| 国产片在线播放| 日韩一区精品视频| 2019中文字幕在线观看| 久操视频免费在线观看| 日韩伦理视频| 亚洲欧美中文字幕在线一区| 久久久久国产免费| 国产麻豆一区二区三区| 欧美撒尿777hd撒尿| 亚洲 自拍 另类小说综合图区| 黄色网页在线播放| 国产精品情趣视频| 日本一区二区在线视频| 99精品久久久久| 综合亚洲自拍| 日韩精品视频在线播放| 国产综合内射日韩久| 视频一区视频二区欧美| 91麻豆精品国产91久久久久| www.com黄色片| 欧美不卡高清一区二区三区| 精品久久香蕉国产线看观看gif| www.18av.com| 日本三级在线观看网站| 亚洲精品大片www| 无码毛片aaa在线| 老司机在线视频二区| 久久蜜桃av一区精品变态类天堂| 国产一区二区三区四区hd| 亚洲欧美激情国产综合久久久| 国产精品综合二区| 99在线视频首页| 丰满人妻一区二区三区无码av| 国产伦精品一区二区三区视频青涩 | 精品国产成人亚洲午夜福利| 亚洲裸色大胆大尺寸艺术写真| 亚洲精品国产成人| 一区二区三区少妇| 最新国产一区| 最近2019年日本中文免费字幕| 免费看裸体网站| 午夜激情久久| 欧美猛少妇色xxxxx| 久久一二三四区| 亚洲麻豆av| 国产91九色视频| 中文字幕乱码人妻二区三区| 久久国内精品自在自线400部| 91九色国产在线| 性欧美videos另类hd| 99综合视频| 97人人做人人爱| 台湾佬中文在线| 日韩成人精品在线观看| 国产在线视频2019最新视频| 99热这里只有精品在线| kk眼镜猥琐国模调教系列一区二区| 精品久久蜜桃| 国产大学生校花援交在线播放| 中文字幕在线不卡国产视频| 青青草视频国产| 午夜欧美巨大性欧美巨大| 欧美撒尿777hd撒尿| 天堂va欧美va亚洲va老司机| 亚洲黄色录像| 日韩小视频在线| 国产一级性生活| 丝袜美腿一区二区三区| 91亚洲精品在线| 午夜福利视频一区二区| 国产精品视频免费| 91午夜在线观看| 日本精品网站| 精品国产乱码久久久久久夜甘婷婷 | 成人精品国产福利| 视频一区不卡| 毛片在线网站| 欧美一卡二卡在线| a毛片毛片av永久免费| 中文字幕免费一区二区三区| 欧美亚洲成人精品| 99热这里只有精品66| 久久这里只有精品6| 一区二区精品国产| 性欧美freesex顶级少妇| 555www色欧美视频| 亚洲精品国产一区黑色丝袜| 国产一区清纯| 成人黄色大片在线免费观看| 日韩私人影院| 亚洲国产综合91精品麻豆| 鲁一鲁一鲁一鲁一av| 久久婷婷国产| 欧美国产日韩一区| 亚洲影视一区二区| 久久精品亚洲麻豆av一区二区| 91午夜在线观看| 国产精品白丝久久av网站| 亚洲欧洲国产精品| 99久在线精品99re8热| 国产精品一区在线| 手机成人av在线| 日韩电影免费观| 日韩av影视综合网| 精品在线免费观看视频| 精品一二三四区| 伊人色综合久久天天五月婷| 日韩成人动漫| 亚洲欧美一区二区激情| 国产污污视频在线观看| 波多野结衣一区二区三区| 欧美日韩午夜爽爽| 欧美成人毛片| 色偷偷9999www| 亚洲天堂免费av| 亚洲国产精品成人综合色在线婷婷| 国产主播在线看| 色先锋久久影院av| 午夜精品一区二区三区在线视频| 午夜精品在线播放| 亚洲综合在线五月| caopor在线| 亚洲高清久久| 久久精品ww人人做人人爽| av中文在线资源| 亚洲精品美女网站| 69成人免费视频| 久久久三级国产网站| 成人在线观看黄| 精品久久精品| 成人网在线免费看| av网站在线看| 欧美mv日韩mv国产| 亚洲国产成人精品激情在线| 99精品欧美一区二区蜜桃免费| 男人添女荫道口图片| 日本天堂一区| 国产福利精品在线| 在线观看黄av| 日韩一二三四区| 国产午夜小视频| 久久久天堂av| 中文字幕永久有效| 欧美高清不卡| 久久99影院| av一区在线| 日韩有码在线视频| 超碰在线人人干| 精品久久久精品| 国产又大又粗又爽的毛片| 麻豆精品在线视频| 国产日本在线播放| 神马影视一区二区| 91中文在线视频| 欧美大胆a人体大胆做受| 亚洲日本欧美日韩高观看| 亚洲一级片免费看| 一区二区激情视频| 免费看黄色的视频| 国产综合久久久久久鬼色| www.国产在线播放| 日韩三级在线| 国产视频一区二区三区四区| 97欧美成人| 欧美极品少妇xxxxⅹ裸体艺术| 日本成人一区二区三区| 51精品秘密在线观看| 日韩伦人妻无码| 青草久久伊人| 亚洲欧洲国产日韩| 91丝袜在线观看| 久久国产尿小便嘘嘘| 91九色丨porny丨国产jk| 成人毛片在线| 国产精品伊人日日| 99热这里有精品| 欧美一级淫片videoshd| www.久久ai| 一区二区亚洲欧洲国产日韩| 性中国xxx极品hd| 欧美日韩一区二区在线观看视频| 久久久久亚洲天堂| 国产精品天干天干在线综合| 四季av综合网站| 激情深爱一区二区| 91淫黄看大片| 亚洲深夜影院| 欧美一区二区三区综合| 色婷婷色综合| 欧美少妇一区| 成人av激情人伦小说| 成人xxxxx| yiren22亚洲综合| 欧美一级大胆视频| japanese色国产在线看视频| 久久资源免费视频| www.亚洲视频| 亚洲网站在线观看| 色视频在线观看福利| 精品日韩在线观看| 国产美女自慰在线观看| 欧美日韩一区二区欧美激情| 天堂网视频在线| 精品高清一区二区三区| 国产大片中文字幕在线观看| 亚洲免费av高清| www.com.av| 中文字幕一区日韩精品欧美| 中文字幕av久久爽一区| 91蜜桃传媒精品久久久一区二区| 美女黄色一级视频| 国产成人午夜视频| xxx中文字幕| 国产一区二区三区久久久| 精品亚洲一区二区三区四区| 美腿丝袜亚洲综合| 久久久精品麻豆| 日韩激情一二三区| 久久久国产欧美| 日韩av一二三| 色综合色综合色综合色综合| 久久成人麻豆午夜电影| 日本高清久久久| 国内不卡的二区三区中文字幕| 青青草原国产在线视频| 精东粉嫩av免费一区二区三区| 怡红院亚洲色图| 韩国v欧美v日本v亚洲v| 永久免费黄色片| 成人午夜私人影院| 91精品国产自产| 欧美国产综合色视频| 国产精品理论在线| 1区2区3区欧美| 久草成人在线视频| 精品国产乱码久久久久久天美| 久久99精品波多结衣一区| 日韩欧美国产中文字幕| 老熟妇一区二区三区啪啪| 欧美区在线观看| 亚洲av综合色区无码一二三区| 欧美mv日韩mv| 毛片在线播放网址| 日韩中文字幕不卡视频| 成人无遮挡免费网站视频在线观看| 欧美成人免费网| 在线视频超级| 国产综合在线观看视频| 一区二区三区国产好| 久久久综合亚洲91久久98| 欧美日韩激情在线一区二区三区| 日日噜噜噜夜夜爽爽| 亚洲小说欧美另类社区| 日韩免费毛片视频| 久久99国产精品成人| 无码人妻aⅴ一区二区三区玉蒲团| 国产sm精品调教视频网站| 精品人妻一区二区三区香蕉| 中文一区二区在线观看| 国产在线视频卡一卡二| 色欧美日韩亚洲| www.av导航| 国产午夜精品全部视频在线播放| 老司机免费在线视频| 欧美中文字幕视频| 国产成人免费视频网站视频社区| 国产一区二区免费电影| 久久精品国产www456c0m| 日韩黄色短视频| 精品一区二区成人精品| 欧美亚一区二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 久久久无码精品亚洲国产| 欧美视频三区在线播放| www.国产欧美| 正在播放欧美一区| 91超碰在线播放| 亚洲www永久成人夜色| 亚洲免费专区| 成人一级生活片| 久久精品99久久久| 爱爱的免费视频| 亚洲国产一二三| 国产精品人妻一区二区三区| 精品中文视频在线| 狂野欧美性猛交xxxxx视频| 国产精品三级在线| 一区二区美女| 玩弄中年熟妇正在播放| 国产精品一二二区| 欧日韩不卡视频| 色菇凉天天综合网| 天堂在线资源网| 久久久中精品2020中文| 久久的色偷偷| 中国一区二区三区| 日本不卡的三区四区五区| 老司机福利av| 午夜视频久久久久久| 污污视频网站在线免费观看| 亚洲国产成人高清精品| 国产av一区二区三区| 久久在精品线影院精品国产| 福利精品一区| 亚洲ai欧洲av| 欧美aaaaa成人免费观看视频| 黄色短视频在线观看| 午夜精品久久久久影视| 成人精品在线播放| 欧美黑人xxxⅹ高潮交| 国产一区二区三区亚洲综合| 国产高清免费在线| 久久99国产精品麻豆| 国产美女高潮视频| 4438成人网| 在线观看三级视频| 999久久久| 精品69视频一区二区三区Q| 在线成人精品视频| 亚洲午夜一区二区| 欧美特级特黄aaaaaa在线看| 亚洲女成人图区| 韩国美女久久| 五月天综合网| 久草在线在线精品观看| 成人在线观看免费完整| 91精品国产综合久久精品app| 精品美女在线观看视频在线观看| 91视频国产精品| 亚洲午夜激情在线| 制服下的诱惑暮生| 亚洲一区二区精品视频| 色噜噜在线播放| 欧美一级片在线播放| 成人3d精品动漫精品一二三| 天堂一区在线观看| 亚洲精品视频在线观看网站| 丰满熟妇乱又伦| 日本久久久久久久| 色乱码一区二区三区网站| 中文字幕乱妇无码av在线| 亚洲国产视频在线| 奇米影视888狠狠狠777不卡| 国产欧美日韩精品在线观看| 综合久久99| 捆绑凌虐一区二区三区| 91福利在线播放| 国产超级va在线视频| 国产主播一区二区三区四区| 国产精品社区| 亚洲视频重口味| 亚洲电影在线看| 成人亚洲免费| 国产真实老熟女无套内射| 国产亚洲精品久| av官网在线观看| 欧美亚洲另类在线| 99久久www免费| 精品无码在线视频| 欧美精品v日韩精品v韩国精品v| 国内老司机av在线| 欧美一区二区综合| 国产成人免费在线| 久久久久久无码精品大片| 欧美猛交ⅹxxx乱大交视频| 亚洲免费观看高清完整版在线观| 亚洲va在线va天堂va偷拍| 欧美日韩国产精品一区二区不卡中文 | 欧美一区二区三区视频在线观看 | 中文字幕免费一区二区三区| 亚洲色图14p| 日韩一二在线观看|