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

Socket編程實戰

開發 后端
本文著重介紹現在用的最多的 network socket,包括其在網絡模型中的位置、API 的編程范式、常見錯誤等方面,最后用 Python 語言中的 socket API 實現幾個實際的例子。Socket 中文一般翻譯為“套接字”,不得不說這是個讓人摸不著頭腦的翻譯,我也沒想到啥“信達雅”的翻譯,所以本文直接用其英文表述。本文中所有代碼均可在 socket.py 倉庫中找到。

Socket 在英文中的含義為“(連接兩個物品的)凹槽”,像the eye socket,意為“眼窩”,此外還有“插座”的意思。在計算機科學中,socket 通常是指一個連接的兩個端點,這里的連接可以是同一機器上的,像unix domain socket,也可以是不同機器上的,像network socket。

本文著重介紹現在用的最多的 network socket,包括其在網絡模型中的位置、API 的編程范式、常見錯誤等方面,***用 Python 語言中的 socket API 實現幾個實際的例子。Socket 中文一般翻譯為“套接字”,不得不說這是個讓人摸不著頭腦的翻譯,我也沒想到啥“信達雅”的翻譯,所以本文直接用其英文表述。本文中所有代碼均可在 socket.py 倉庫中找到。

概述

Socket 作為一種通用的技術規范,***是由 Berkeley 大學在 1983 為 4.2BSD Unix 提供的,后來逐漸演化為 POSIX 標準。Socket API 是由操作系統提供的一個編程接口,讓應用程序可以控制使用 socket 技術。Unix 哲學中有一條一切皆為文件,所以 socket 和file 的 API 使用很類似:可以進行read、write、open、close等操作。

現在的網絡系統是分層的,理論上有OSI模型,工業界有TCP/IP協議簇。其對比如下:

每層上都有其相應的協議,socket API 不屬于TCP/IP協議簇,只是操作系統提供的一個用于網絡編程的接口,工作在應用層與傳輸層之間:

我們平常瀏覽網站所使用的http協議,收發郵件用的smtp與imap,都是基于 socket API 構建的。

一個 socket,包含兩個必要組成部分:

  1. 地址,由 ip 與 端口組成,像192.168.0.1:80。
  2. 協議,socket 所是用的傳輸協議,目前有三種:TCP、UDP、raw IP。

地址與協議可以確定一個socket;一臺機器上,只允許存在一個同樣的socket。TCP 端口 53 的 socket 與 UDP 端口 53 的 socket 是兩個不同的 socket。

根據 socket 傳輸數據方式的不同(使用協議不同),可以分為以下三種:

  1. Stream sockets,也稱為“面向連接”的 socket,使用 TCP 協議。實際通信前需要進行連接,傳輸的數據沒有特定的結構,所以高層協議需要自己去界定數據的分隔符,但其優勢是數據是可靠的。
  2. Datagram sockets,也稱為“無連接”的 socket,使用 UDP 協議。實際通信前不需要連接,一個優勢時 UDP 的數據包自身是可分割的(self-delimiting),也就是說每個數據包就標示了數據的開始與結束,其劣勢是數據不可靠。
  3. Raw sockets,通常用在路由器或其他網絡設備中,這種 socket 不經過TCP/IP協議簇中的傳輸層(transport layer),直接由網絡層(Internet layer)通向應用層(Application layer),所以這時的數據包就不會包含 tcp 或 udp 頭信息。

Python socket API

Python 里面用(ip, port)的元組來表示 socket 的地址屬性,用AF_*來表示協議類型。

數據通信有兩組動詞可供選擇:send/recv 或 read/write。read/write 方式也是 Java 采用的方式,這里不會對這種方式進行過多的解釋,但是需要注意的是:

read/write 操作的具有 buffer 的“文件”,所以在進行讀寫后需要調用flush方法去真正發送或讀取數據,否則數據會一直停留在緩沖區內。

TCP socket

TCP socket 由于在通向前需要建立連接,所以其模式較 UDP socket 負責些。具體如下:

每個API 的具體含義這里不在贅述,可以查看手冊,這里給出 Python 語言的實現的 echo server。

  1. # echo_server.py 
  2. # coding=utf8 
  3. import socket 
  4.  
  5. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  6. # 設置 SO_REUSEADDR 后,可以立即使用 TIME_WAIT 狀態的 socket 
  7. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
  8. sock.bind(('', 5500)) 
  9. sock.listen(5)  
  1. def handler(client_sock, addr): 
  2.     print('new client from %s:%s' % addr) 
  3.     msg = client_sock.recv(1024) 
  4.     client_sock.send(msg) 
  5.     client_sock.close() 
  6.     print('client[%s:%s] socket closed' % addr) 
  7.  
  8. if __name__ == '__main__'
  9.     while 1: 
  10.         client_sock, addr = sock.accept() 
  11.         handler(client_sock, addr)  
  1. # echo_client.py 
  2. # coding=utf8 
  3. import socket 
  4.  
  5. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  6. sock.connect(('', 5500)) 
  7. sock.send('hello socket world'
  8. print sock.recv(1024)  

上面簡單的echo server 代碼中有一點需要注意的是:server 端的 socket 設置了SO_REUSEADDR為1,目的是可以立即使用處于TIME_WAIT狀態的socket,那么TIME_WAIT又是什么意思呢?后面在講解 tcp 狀態變更圖時再做詳細介紹。

UDP socket

UDP socket server 端代碼在進行bind后,無需調用listen方法。

  1. # udp_echo_server.py 
  2. # coding=utf8 
  3. import socket 
  4.  
  5. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
  6. # 設置 SO_REUSEADDR 后,可以立即使用 TIME_WAIT 狀態的 socket 
  7. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
  8. sock.bind(('', 5500)) 
  9. # 沒有調用 listen 
  10.  
  11. if __name__ == '__main__'
  12.     while 1: 
  13.         data, addr = sock.recvfrom(1024) 
  14.  
  15.         print('new client from %s:%s' % addr) 
  16.         sock.sendto(data, addr) 
  17.  
  18. # udp_echo_client.py 
  19. # coding=utf8 
  20. import socket 
  21.  
  22. udp_server_addr = ('', 5500) 
  23.  
  24. if __name__ == '__main__'
  25.     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
  26.     data_to_sent = 'hello udp socket' 
  27.     try: 
  28.         sent = sock.sendto(data_to_sent, udp_server_addr) 
  29.         data, server = sock.recvfrom(1024) 
  30.         print('receive data:[%s] from %s:%s' % ((data,) + server)) 
  31.     finally: 
  32.         sock.close()  

常見陷阱

忽略返回值

本文中的 echo server 示例因為篇幅限制,也忽略了返回值。網絡通信是個非常復雜的問題,通常無法保障通信雙方的網絡狀態,很有可能在發送/接收數據時失敗或部分失敗。所以有必要對發送/接收函數的返回值進行檢查。本文中的 tcp echo client 發送數據時,正確寫法應該如下:

  1. total_send = 0 
  2. content_length = len(data_to_sent) 
  3. while total_send < content_length: 
  4.     sent = sock.send(data_to_sent[total_send:]) 
  5.     if sent == 0: 
  6.         raise RuntimeError("socket connection broken"
  7.     total_send += total_send + sent  

send/recv操作的是網絡緩沖區的數據,它們不必處理傳入的所有數據。

一般來說,當網絡緩沖區填滿時,send函數就返回了;當網絡緩沖區被清空時,recv 函數就返回。

當 recv 函數返回0時,意味著對端已經關閉。

可以通過下面的方式設置緩沖區大小。

  1. s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, buffer_size) 

認為 TCP 具有 framing

TCP 不提供 framing,這使得其很適合于傳輸數據流。這是其與 UDP 的重要區別之一。UDP 是一個面向消息的協議,能保持一條消息在發送者與接受者之間的完備性。

 

代碼示例參考:framing_assumptions 

TCP 的狀態機

在前面echo server 的示例中,提到了TIME_WAIT狀態,為了正式介紹其概念,需要了解下 TCP 從生成到結束的狀態機器。(圖片來源)

 

這個狀圖轉移圖非常非常關鍵,也比較復雜,我自己為了方便記憶,對這個圖進行了拆解,仔細分析這個圖,可以得出這樣一個結論,連接的打開與關閉都有被動(passive)與主動(active)兩種,主動關閉時,涉及到的狀態轉移最多,包括FIN_WAIT_1、FIN_WAIT_2、CLOSING、TIME_WAIT。

此外,由于 TCP 是可靠的傳輸協議,所以每次發送一個數據包后,都需要得到對方的確認(ACK),有了上面這兩個知識后,再來看下面的圖:(圖片來源)

 

 

  1. 在主動關閉連接的 socket 調用 close方法的同時,會向被動關閉端發送一個 FIN
  2. 對端收到FIN后,會向主動關閉端發送ACK進行確認,這時被動關閉端處于 CLOSE_WAIT 狀態
  3. 當被動關閉端調用close方法進行關閉的同時向主動關閉端發送 FIN 信號,接收到 FIN 的主動關閉端這時就處于 TIME_WAIT 狀態
  4. 這時主動關閉端不會立刻轉為 CLOSED 狀態,而是需要等待 2MSL(max segment life,一個數據包在網絡傳輸中***的生命周期),以確保被動關閉端能夠收到***發出的 ACK。如果被動關閉端沒有收到***的 ACK,那么被動關閉端就會重新發送 FIN,所以處于TIME_WAIT的主動關閉端會再次發送一個 ACK 信號,這么一來(FIN來)一回(ACK),正好是兩個 MSL 的時間。如果等待的時間小于 2MSL,那么新的socket就可以收到之前連接的數據。

前面 echo server 的示例也說明了,處于 TIME_WAIT 并不是說一定不能使用,可以通過設置 socket 的 SO_REUSEADDR 屬性以達到不用等待 2MSL 的時間就可以復用socket 的目的,當然,這僅僅適用于測試環境,正常情況下不要修改這個屬性。

實戰

HTTP UA

http 協議是如今萬維網的基石,可以通過 socket API 來簡單模擬一個瀏覽器(UA)是如何解析 HTTP 協議數據的。

  1. #coding=utf8 
  2. import socket 
  3.  
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  5. baidu_ip = socket.gethostbyname('baidu.com'
  6. sock.connect((baidu_ip, 80)) 
  7. print('connected to %s' % baidu_ip) 
  8.  
  9. req_msg = [ 
  10.     'GET / HTTP/1.1'
  11.     'User-Agent: curl/7.37.1'
  12.     'Host: baidu.com'
  13.     'Accept: */*'
  14. delimiter = '\r\n' 
  15.  
  16. sock.send(delimiter.join(req_msg)) 
  17. sock.send(delimiter) 
  18. sock.send(delimiter) 
  19.  
  20. print('%sreceived%s' % ('-'*20, '-'*20)) 
  21. http_response = sock.recv(4096) 
  22. print(http_response)  

運行上面的代碼可以得到下面的輸出

  1. --------------------received-------------------- 
  2. HTTP/1.1 200 OK 
  3. Date: Tue, 01 Nov 2016 12:16:53 GMT 
  4. Server: Apache 
  5. Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT 
  6. ETag: "51-47cf7e6ee8400" 
  7. Accept-Ranges: bytes 
  8. Content-Length: 81 
  9. Cache-Control: max-age=86400 
  10. Expires: Wed, 02 Nov 2016 12:16:53 GMT 
  11. Connection: Keep-Alive 
  12. Content-Type: text/html 
  13.  
  14. <html> 
  15. <meta http-equiv="refresh" content="0;url=http://www.baidu.com/"
  16. </html>  

http_response是通過直接調用recv(4096)得到的,萬一真正的返回大于這個值怎么辦?我們前面知道了 TCP 協議是面向流的,它本身并不關心消息的內容,需要應用程序自己去界定消息的邊界,對于應用層的 HTTP 協議來說,有幾種情況,最簡單的一種時通過解析返回值頭部的Content-Length屬性,這樣就知道body的大小了,對于 HTTP 1.1版本,支持Transfer-Encoding: chunked傳輸,對于這種格式,這里不在展開講解,大家只需要知道, TCP 協議本身無法區分消息體就可以了。對這塊感興趣的可以查看 CPython 核心模塊 http.client

Unix_domain_socket

UDS 用于同一機器上不同進程通信的一種機制,其API適用與 network socket 很類似。只是其連接地址為本地文件而已。

代碼示例參考:uds_server.pyuds_client.py

ping

ping 命令作為檢測網絡聯通性最常用的工具,其適用的傳輸協議既不是TCP,也不是 UDP,而是 ICMP,利用 raw sockets,我們可以適用純 Python 代碼來實現其功能。

代碼示例參考:ping.py

netstat vs ss

netstat 與 ss 是類 Unix 系統上查看 Socket 信息的命令。netstat 是比較老牌的命令,我常用的選擇有

  • -t,只顯示 tcp 連接
  • -u,只顯示 udp 連接
  • -n,不用解析hostname,用 IP 顯示主機,可以加快執行速度
  • -p,查看連接的進程信息
  • -l,只顯示監聽的連接

ss 是新興的命令,其選項和 netstat 差不多,主要區別是能夠進行過濾(通過state與exclude關鍵字)。

  1. $ ss -o state time-wait -n | head 
  2. Recv-Q Send-Q             Local Address:Port               Peer Address:Port 
  3. 0      0                 10.200.181.220:2222              10.200.180.28:12865  timer:(timewait,33sec,0) 
  4. 0      0                      127.0.0.1:45977                 127.0.0.1:3306   timer:(timewait,46sec,0) 
  5. 0      0                      127.0.0.1:45945                 127.0.0.1:3306   timer:(timewait,6.621ms,0) 
  6. 0      0                 10.200.181.220:2222              10.200.180.28:12280  timer:(timewait,12sec,0) 
  7. 0      0                 10.200.181.220:2222              10.200.180.28:35045  timer:(timewait,43sec,0) 
  8. 0      0                 10.200.181.220:2222              10.200.180.28:42675  timer:(timewait,46sec,0) 
  9. 0      0                      127.0.0.1:45949                 127.0.0.1:3306   timer:(timewait,11sec,0) 
  10. 0      0                      127.0.0.1:45954                 127.0.0.1:3306   timer:(timewait,21sec,0) 
  11. 0      0               ::ffff:127.0.0.1:3306           ::ffff:127.0.0.1:45964  timer:(timewait,31sec,0)  

這兩個命令更多用法可以參考:

總結

我們的生活已經離不開網絡,平時的開發也充斥著各種復雜的網絡應用,從最基本的數據庫,到各種分布式系統,不論其應用層怎么復雜,其底層傳輸數據的的協議簇是一致的。Socket 這一概念我們很少直接與其打交道,但是當我們的系統出現問題時,往往是對底層的協議認識不足造成的,希望這篇文章能對大家編程網絡方面的程序有所幫助。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2012-03-19 11:41:30

JavaSocket

2010-03-03 16:19:29

Python Sock

2013-03-26 12:46:23

Android開發So

2013-03-27 13:26:04

Android開發Socket

2015-07-27 09:53:13

PHP編程過程

2013-09-22 11:03:20

SocketSocket編程

2011-06-13 16:51:19

Qt Socket

2015-04-24 09:48:59

TCPsocketsocket編程

2010-03-22 10:42:37

Java Socket

2010-03-17 14:22:40

Java Socket

2012-02-15 10:37:38

JavaJava Socket

2009-06-11 10:00:05

Java Socket

2022-10-24 08:01:32

Sockets網絡協議

2012-03-19 10:55:27

JavaSocket

2019-02-12 15:04:09

2009-02-04 09:45:05

Java SocketSocket APIJava編程

2024-08-08 15:46:34

2012-02-15 10:40:37

JavaJava Socket

2012-02-15 10:34:29

JavaJava Socket

2012-03-19 10:41:15

JavaSocket
點贊
收藏

51CTO技術棧公眾號

成人在线视频电影| 中文字幕亚洲综合| 少妇高潮喷水在线观看| 青青操视频在线| 老司机午夜免费精品视频| 日韩专区在线观看| 老司机免费视频| 成人国产激情| 亚洲高清视频的网址| 日韩av一区二区三区在线| 国产人妖一区二区| 久久国产日本精品| 欧美激情欧美激情在线五月| 新91视频在线观看| 97久久精品| 欧美伊人精品成人久久综合97 | 国产福利小视频在线| 精品在线亚洲视频| 日产精品99久久久久久| 九九热只有精品| 欧洲杯半决赛直播| 日韩美女一区二区三区四区| 欧美日韩怡红院| www视频在线观看| 最新欧美精品一区二区三区| 欧美日韩精品一区| 欧美一区二区三区成人片在线| 蜜桃视频一区二区三区在线观看 | 波多野结衣久久精品| 亚洲视频你懂的| 日韩国产精品一区二区三区| 少妇av一区二区| 国产乱子轮精品视频| 国产精品欧美一区二区| 九九热在线免费观看| 欧美三级午夜理伦三级中文幕| 色婷婷综合成人av| 日韩人妻无码精品综合区| 国产图片一区| 日韩一区二区三区在线观看| 怡红院亚洲色图| 一呦二呦三呦精品国产| 欧美日韩亚洲91| 婷婷五月综合缴情在线视频| 少女频道在线观看免费播放电视剧| 中文在线资源观看网站视频免费不卡| 久久亚洲高清| 无码国产伦一区二区三区视频 | 欧美三级中文字| 能在线观看的av网站| 女人高潮被爽到呻吟在线观看| 亚洲精品高清在线| 水蜜桃在线免费观看| 成人在线播放免费观看| 亚洲色图清纯唯美| 久久免费视频2| 黄色免费网站在线| 亚洲欧美日韩国产综合| 特级黄色录像片| 成人直播在线| 一二三区精品福利视频| 亚洲国产一二三精品无码 | 亚洲日本香蕉视频| 91蜜桃传媒精品久久久一区二区| 久久大片网站| 久草视频视频在线播放| 国产亲近乱来精品视频| 亚洲精品二区| 久做在线视频免费观看| 夜夜精品浪潮av一区二区三区| 亚洲天堂第一区| xxx.xxx欧美| 欧美三级欧美成人高清www| 日日摸日日碰夜夜爽av| 欧美黑人疯狂性受xxxxx野外| 91豆麻精品91久久久久久| 爆乳熟妇一区二区三区霸乳| 日韩欧国产精品一区综合无码| 欧美日韩国产影片| 少妇性l交大片7724com| 国产乱人伦丫前精品视频| 日韩精品中文字幕在线| 东京热无码av男人的天堂| 国产精品毛片一区二区在线看| 久久成人人人人精品欧| 国产一卡二卡在线| 日韩黄色一级片| 91亚洲精品在线观看| 秋霞网一区二区| 国产午夜亚洲精品午夜鲁丝片| 亚洲综合网中心| 欧美日韩色网| 色天使色偷偷av一区二区 | 91丝袜高跟美女视频| 欧美一级二级三级| 成人影欧美片| 色嗨嗨av一区二区三区| 精品人妻一区二区三区免费| 欧美freesex8一10精品| 日韩中文字幕在线视频播放| 日韩三级免费看| 男人的天堂久久精品| 国产福利不卡| 日韩精品成人av| 天天射综合影视| 婷婷中文字幕在线观看| 色婷婷久久久| 久久99精品国产99久久6尤物| 亚洲免费在线观看av| 老汉av免费一区二区三区 | 免费理论片在线观看播放老| 亚洲三级小视频| 国产第一页视频| 亚洲经典视频| www.xxxx欧美| 国产suv精品一区二区33| 懂色中文一区二区在线播放| 天堂精品视频| 亚洲欧洲高清| 亚洲精品一线二线三线| 亚洲视频重口味| 欧美资源在线| 激情视频一区二区| 色www永久免费视频首页在线| 欧美综合久久久| 性色av蜜臀av色欲av| 欧美色一级片| 亚洲va码欧洲m码| www亚洲人| 色网综合在线观看| 精品人妻一区二区三区日产乱码卜| 欧美激情在线| 亚洲综合在线中文字幕| 欧洲不卡视频| 欧美日韩精品欧美日韩精品一| 久久久精品人妻无码专区| 亚洲三级色网| 国产精品99久久久久久久| 在线中文字幕第一页| 欧美日韩久久一区| 国产wwwwxxxx| 蜜臀精品一区二区三区在线观看| 欧洲一区二区日韩在线视频观看免费| 三级中文字幕在线观看| 亚洲成人免费在线视频| 91aaa在线观看| 国产精品小仙女| a级网站在线观看| www.欧美视频| 欧美剧在线观看| 精品区在线观看| 亚洲最色的网站| 波多野结衣办公室双飞| 在线观看一区| 久久精品magnetxturnbtih| 久久男人天堂| 亚洲欧洲xxxx| 国产成人精品一区二区色戒| 国产午夜精品久久| 91网址在线播放| 久久裸体网站| 亚洲free性xxxx护士白浆| а√天堂官网中文在线| 日韩欧美自拍偷拍| 国产精品6666| 久久久久久久性| 一路向西2在线观看| 水蜜桃久久夜色精品一区| 91免费视频网站| 日本一级理论片在线大全| 精品国产髙清在线看国产毛片| 久久久久久久99| 久久久激情视频| 一起操在线视频| 狠狠入ady亚洲精品| 久久精品一二三区| 123成人网| 欧美成人sm免费视频| 欧美一级特黄aaaaaa大片在线观看| 狠狠躁18三区二区一区| 一区二区三区在线观看免费视频| 精品综合久久久久久8888| 成人免费a级片| 婷婷精品视频| 成人黄色av网站| 成人观看网址| 日韩在线免费av| 神马久久久久久久久久| 欧洲激情一区二区| 国产大学生自拍| 久久亚洲私人国产精品va媚药| 最新中文字幕2018| 精品69视频一区二区三区Q| 日韩av电影免费观看| 中文字幕av一区二区三区四区| 日韩av电影国产| 八戒八戒神马在线电影| 精品网站999www| 国产婷婷在线视频| 色婷婷综合久久久中文字幕| 久久久国产精品人人片| 国产丝袜美腿一区二区三区| 欧美性猛交乱大交| 日本不卡中文字幕| 99视频在线免费播放| 91成人精品| 日本欧美精品久久久| 一区二区三区高清在线观看| 国产精品成人一区二区| 草美女在线观看| www.国产精品一二区| 久久精品色图| 亚洲精品www久久久| 国产精品久久久午夜夜伦鲁鲁| 狠狠久久亚洲欧美专区| 久久久国产精品黄毛片| 亚洲欧洲av在线| 亚洲精品国产熟女久久久| av一本久道久久综合久久鬼色| 性刺激的欧美三级视频| 亚洲综合不卡| 人妻少妇精品无码专区二区| 在线成人超碰| 中文网丁香综合网| jizzjizz欧美69巨大| 精品午夜一区二区三区| 亚洲视频国产| 91手机在线视频| 999色成人| 国产精品欧美日韩久久| 韩国精品主播一区二区在线观看| 91av在线免费观看| 9999热视频在线观看| 欧美多人乱p欧美4p久久| 黄色精品在线观看| 久久这里只有精品99| 素人av在线| 色青青草原桃花久久综合| 国外av在线| 亚洲欧美综合v| 搞黄视频免费在线观看| 亚洲精品之草原avav久久| 亚洲av片在线观看| 亚洲精品福利免费在线观看| 黄色av网站免费在线观看| 欧美本精品男人aⅴ天堂| 亚洲福利在线观看视频| 欧美r级电影在线观看| 成人小说亚洲一区二区三区| 日韩一级完整毛片| 亚洲精品视频网| 亚洲国产成人精品电影| 天天色综合av| 亚洲欧美日韩网| 国产二区视频在线观看| 中文字幕日韩欧美在线| 嫩草香蕉在线91一二三区| 久久精品最新地址| 久久亚洲资源| 欧美性受xxx| 欧洲av不卡| 国产美女久久精品香蕉69| 香蕉久久一区| 成人免费视频观看视频| 狼人精品一区二区三区在线| 久久精品国产理论片免费| 国产一区二区三区电影在线观看| 日韩欧美亚洲精品| 天天综合久久| 欧美乱大交xxxxx潮喷l头像| 国产模特精品视频久久久久| 天天爽天天爽夜夜爽| 国产一区二区中文字幕| 无码人妻一区二区三区精品视频| eeuss国产一区二区三区| 国产精品久久久久无码av色戒| 国产精品日韩成人| 欧美精品久久久久性色| 天天色综合成人网| 91激情在线观看| 亚洲成成品网站| 成人资源www网在线最新版| 久久久精品国产| 精品三级久久| 国产区亚洲区欧美区| 2020国产精品极品色在线观看| 久久99精品久久久久子伦| 日韩欧美综合| 91精品国产91久久久久麻豆 主演| 久久中文字幕一区二区三区| 国产一级片中文字幕| 91免费在线看| 国产精品老熟女一区二区| 色综合天天综合网天天狠天天| 国产绿帽刺激高潮对白| 精品亚洲一区二区三区在线播放| 日韩免费啪啪| 日韩av第一页| 国产成人精品福利| 最新精品视频| 久久久久国产精品一区三寸| 免费高清视频在线观看| 中文字幕第一区| 97人人澡人人爽人人模亚洲| 欧美高清一级片在线| 你懂的视频在线免费| 久久99久久久久久久噜噜| 777午夜精品电影免费看| 精品蜜桃一区二区三区| 亚洲综合小说| 黑森林精品导航| 91伊人久久大香线蕉| 国产1区2区3区4区| 欧美日韩一区二区三区四区| 亚洲欧美综合在线观看| 久久91亚洲精品中文字幕| 日韩护士脚交太爽了| 欧美极品jizzhd欧美| 亚洲福利一区| 亚洲精品乱码久久久久久动漫| 国产欧美综合在线| av大全在线观看| 亚洲白拍色综合图区| 在线视频国产区| 91久久久久久国产精品| 成人影视亚洲图片在线| 欧美日韩亚洲一二三| 97久久精品人人做人人爽50路| 劲爆欧美第一页| 欧美一区二区视频在线观看2020| 69视频在线| 国产精品视频一区二区高潮| 国产成人av| 东京热加勒比无码少妇| 91在线国内视频| 可以免费看的av毛片| 欧美xxxxx牲另类人与| 男女在线观看视频| 99在线热播| 精品9999| 亚洲男人在线天堂| 婷婷开心久久网| 深夜福利在线看| 91av成人在线| 亚洲欧洲美洲国产香蕉| 人妻熟女一二三区夜夜爱| 久久综合色一综合色88| 中文字幕精品三级久久久| 亚洲精品视频在线播放| 成人av观看| 无码免费一区二区三区免费播放| 久久成人在线| 成人精品一二三区| 制服丝袜激情欧洲亚洲| av毛片在线免费| 岛国视频一区| 国产亚洲福利| 亚洲人成人无码网www国产| 欧美专区亚洲专区| 男人天堂久久久| 亚洲一区久久久| 激情六月综合| 不卡一区二区在线观看| 色婷婷国产精品综合在线观看| 成年人在线免费观看| 国产精品中文在线| 欧美国产91| 欲求不满的岳中文字幕| 在线观看亚洲专区| 视频一区二区三区不卡| 亚洲尤物视频网| 日韩一区二区免费看| 亚洲精品国产一区黑色丝袜| 欧美美女一区二区三区| 欧美xxxx免费虐| 欧美国产二区| 九九**精品视频免费播放| 久久免费视频99| 亚洲欧美色婷婷| av一级久久| 成人一对一视频| 国产精品美女久久久久久久 | 欧美另类激情| 日韩精品一区二区免费| 久久久久久毛片| 国产ts变态重口人妖hd| 2021国产精品视频| 91精品综合| 男生裸体视频网站| 91精品国产综合久久福利软件| 成年人黄色大片在线| 亚洲无玛一区| 99久久777色| 国产美女www爽爽爽视频| 91av国产在线| 欧美在线播放| 五月婷婷婷婷婷| 亚洲女人被黑人巨大进入al| 91精品亚洲一区在线观看| 欧美 激情 在线|