日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP的那些事(转载)

發布時間:2025/6/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP的那些事(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(轉載本站文章請注明作者和出處 酷 殼 – CoolShell.cn ,請勿用于任何商業用途)

TCP是一個巨復雜的協議,因為他要解決很多問題,而這些問題又帶出了很多子問題和陰暗面。所以學習TCP本身是個比較痛苦的過程,但對于學習的過程卻能讓人有很多收獲。關于TCP這個協議的細節,我還是推薦你去看W.Richard Stevens的《TCP/IP 詳解 卷1:協議》(當然,你也可以去讀一下RFC793以及后面N多的RFC)。另外,本文我會使用英文術語,這樣方便你通過這些英文關鍵詞來查找相關的技術文檔。

之所以想寫這篇文章,目的有三個,

  • 一個是想鍛煉一下自己是否可以用簡單的篇幅把這么復雜的TCP協議描清楚的能力。
  • 另一個是覺得現在的好多程序員基本上不會認認真真地讀本書,喜歡快餐文化,所以,希望這篇快餐文章可以讓你對TCP這個古典技術有所了解,并能體會到軟件設計中的種種難處。并且你可以從中有一些軟件設計上的收獲。
  • 最重要的希望這些基礎知識可以讓你搞清很多以前一些似是而非的東西,并且你能意識到基礎的重要。

所以,本文不會面面俱到,只是對TCP協議、算法和原理的科普。

我本來只想寫一個篇幅的文章的,但是TCP真TMD的復雜,比C++復雜多了,這30多年來,各種優化變種爭論和修改。所以,寫著寫著就發現只有砍成兩篇。

  • 上篇中,主要向你介紹TCP協議的定義和丟包時的重傳機制。
  • 下篇中,重點介紹TCP的流迭、擁塞處理。

廢話少說,首先,我們需要知道TCP在網絡OSI的七層模型中的第四層——Transport層,IP在第三層——Network層,ARP在第二層——Data Link層,在第二層上的數據,我們叫Frame,在第三層上的數據叫Packet,第四層的數據叫Segment。

首先,我們需要知道,我們程序的數據首先會打到TCP的Segment中,然后TCP的Segment會打到IP的Packet中,然后再打到以太網Ethernet的Frame中,傳到對端后,各個層解析自己的協議,然后把數據交給更高層的協議處理。

TCP頭格式

接下來,我們來看一下TCP頭的格式

TCP頭格式(圖片來源)

你需要注意這么幾點:

  • TCP的包是沒有IP地址的,那是IP層上的事。但是有源端口和目標端口。
  • 一個TCP連接需要四個元組來表示是同一個連接(src_ip, src_port, dst_ip, dst_port)準確說是五元組,還有一個是協議。但因為這里只是說TCP協議,所以,這里我只說四元組。
  • 注意上圖中的四個非常重要的東西:
    • Sequence Number是包的序號,用來解決網絡包亂序(reordering)問題。
    • Acknowledgement Number就是ACK——用于確認收到,用來解決不丟包的問題
    • Window又叫Advertised-Window,也就是著名的滑動窗口(Sliding Window),用于解決流控的
    • TCP Flag ,也就是包的類型,主要是用于操控TCP的狀態機的

關于其它的東西,可以參看下面的圖示

(圖片來源)

TCP的狀態機

其實,網絡上的傳輸是沒有連接的,包括TCP也是一樣的。而TCP所謂的“連接”,其實只不過是在通訊的雙方維護一個“連接狀態”,讓它看上去好像有連接一樣。所以,TCP的狀態變換是非常重要的。

下面是:“TCP協議的狀態機”(圖片來源) 和 “TCP建鏈接”、“TCP斷鏈接”、“傳數據” 的對照圖,我把兩個圖并排放在一起,這樣方便在你對照著看。另外,下面這兩個圖非常非常的重要,你一定要記牢。(吐個槽:看到這樣復雜的狀態機,就知道這個協議有多復雜,復雜的東西總是有很多坑爹的事情,所以TCP協議其實也挺坑爹的)

很多人會問,為什么建鏈接要3次握手,斷鏈接需要4次揮手?

  • 對于建鏈接的3次握手,主要是要初始化Sequence Number 的初始值。通信的雙方要互相通知對方自己的初始化的Sequence Number(縮寫為ISN:Inital Sequence Number)——所以叫SYN,全稱Synchronize Sequence Numbers。也就上圖中的 x 和 y。這個號要作為以后的數據通信的序號,以保證應用層接收到的數據不會因為網絡上的傳輸的問題而亂序(TCP會用這個序號來拼接數據)。
  • 對于4次揮手,其實你仔細看是2次,因為TCP是全雙工的,所以,發送方和接收方都需要Fin和Ack。只不過,有一方是被動的,所以看上去就成了所謂的4次揮手。如果兩邊同時斷連接,那就會就進入到CLOSING狀態,然后到達TIME_WAIT狀態。下圖是雙方同時斷連接的示意圖(你同樣可以對照著TCP狀態機看):


兩端同時斷連接(圖片來源)

另外,有幾個事情需要注意一下:

  • 關于建連接時SYN超時。試想一下,如果server端接到了clien發的SYN后回了SYN-ACK后client掉線了,server端沒有收到client回來的ACK,那么,這個連接處于一個中間狀態,即沒成功,也沒失敗。于是,server端如果在一定時間內沒有收到的TCP會重發SYN-ACK。在Linux下,默認重試次數為5次,重試的間隔時間從1s開始每次都翻售,5次的重試時間間隔為1s, 2s, 4s, 8s, 16s,總共31s,第5次發出后還要等32s都知道第5次也超時了,所以,總共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,TCP才會把斷開這個連接。
  • 關于SYN Flood攻擊。一些惡意的人就為此制造了SYN Flood攻擊——給服務器發了一個SYN后,就下線了,于是服務器需要默認等63s才會斷開連接,這樣,攻擊者就可以把服務器的syn連接的隊列耗盡,讓正常的連接請求不能處理。于是,Linux下給了一個叫tcp_syncookies的參數來應對這個事——當SYN隊列滿了后,TCP會通過源地址端口、目標地址端口和時間戳打造出一個特別的Sequence Number發回去(又叫cookie),如果是攻擊者則不會有響應,如果是正常連接,則會把這個 SYN Cookie發回來,然后服務端可以通過cookie建連接(即使你不在SYN隊列中)。請注意,請先千萬別用tcp_syncookies來處理正常的大負載的連接的情況。因為,synccookies是妥協版的TCP協議,并不嚴謹。對于正常的請求,你應該調整三個TCP參數可供你選擇,第一個是:tcp_synack_retries 可以用他來減少重試次數;第二個是:tcp_max_syn_backlog,可以增大SYN連接數;第三個是:tcp_abort_on_overflow 處理不過來干脆就直接拒絕連接了。
  • 關于ISN的初始化。ISN是不能hard code的,不然會出問題的——比如:如果連接建好后始終用1來做ISN,如果client發了30個segment過去,但是網絡斷了,于是 client重連,又用了1做ISN,但是之前連接的那些包到了,于是就被當成了新連接的包,此時,client的Sequence Number 可能是3,而Server端認為client端的這個號是30了。全亂了。RFC793中說,ISN會和一個假的時鐘綁在一起,這個時鐘會在每4微秒對ISN做加一操作,直到超過2^32,又從0開始。這樣,一個ISN的周期大約是4.55個小時。因為,我們假設我們的TCP Segment在網絡上的存活時間不會超過Maximum Segment Lifetime(縮寫為MSL - Wikipedia語條),所以,只要MSL的值小于4.55小時,那么,我們就不會重用到ISN。
  • 關于 MSL 和 TIME_WAIT。通過上面的ISN的描述,相信你也知道MSL是怎么來的了。我們注意到,在TCP的狀態圖中,從TIME_WAIT狀態到CLOSED狀態,有一個超時設置,這個超時設置是 2*MSL(RFC793定義了MSL為2分鐘,Linux設置成了30s)為什么要這有TIME_WAIT?為什么不直接給轉成CLOSED狀態呢?主要有兩個原因:1)TIME_WAIT確保有足夠的時間讓對端收到了ACK,如果被動關閉的那方沒有收到Ack,就會觸發被動端重發Fin,一來一去正好2個MSL,2)有足夠的時間讓這個連接不會跟后面的連接混在一起(你要知道,有些自做主張的路由器會緩存IP數據包,如果連接被重用了,那么這些延遲收到的包就有可能會跟新連接混在一起)。你可以看看這篇文章《TIME_WAIT and its design implications for protocols and scalable client server systems》
  • 關于TIME_WAIT數量太多。從上面的描述我們可以知道,TIME_WAIT是個很重要的狀態,但是如果在大并發的短鏈接下,TIME_WAIT 就會太多,這也會消耗很多系統資源。只要搜一下,你就會發現,十有八九的處理方式都是教你設置兩個參數,一個叫tcp_tw_reuse,另一個叫tcp_tw_recycle的參數,這兩個參數默認值都是被關閉的,后者recyle比前者resue更為激進,resue要溫柔一些。另外,如果使用tcp_tw_reuse,必需設置tcp_timestamps=1,否則無效。這里,你一定要注意,打開這兩個參數會有比較大的坑——可能會讓TCP連接出一些詭異的問題(因為如上述一樣,如果不等待超時重用連接的話,新的連接可能會建不上。正如官方文檔上說的一樣“It should not be changed without advice/request of technical experts”)。
    • 關于tcp_tw_reuse。官方文檔上說tcp_tw_reuse 加上tcp_timestamps(又叫PAWS, for Protection Against Wrapped Sequence Numbers)可以保證協議的角度上的安全,但是你需要tcp_timestamps在兩邊都被打開(你可以讀一下tcp_twsk_unique的源碼 )。我個人估計還是有一些場景會有問題。
    • 關于tcp_tw_recycle。如果是tcp_tw_recycle被打開了話,會假設對端開啟了tcp_timestamps,然后會去比較時間戳,如果時間戳變大了,就可以重用。但是,如果對端是一個NAT網絡的話(如:一個公司只用一個IP出公網)或是對端的IP被另一臺重用了,這個事就復雜了。建鏈接的SYN可能就被直接丟掉了(你可能會看到connection time out的錯誤)(如果你想觀摩一下Linux的內核代碼,請參看源碼 tcp_timewait_state_process)。
    • 關于tcp_max_tw_buckets。這個是控制并發的TIME_WAIT的數量,默認值是180000,如果超限,那么,系統會把多的給destory掉,然后在日志里打一個警告(如:time wait bucket table overflow),官網文檔說這個參數是用來對抗DDoS攻擊的。也說的默認值180000并不小。這個還是需要根據實際情況考慮。

Again,使用tcp_tw_reuse和tcp_tw_recycle來解決TIME_WAIT的問題是非常非常危險的,因為這兩個參數違反了TCP協議(RFC 1122)

其實,TIME_WAIT表示的是你主動斷連接,所以,這就是所謂的“不作死不會死”。試想,如果讓對端斷連接,那么這個破問題就是對方的了,呵呵。另外,如果你的服務器是于HTTP服務器,那么設置一個HTTP的KeepAlive有多重要(瀏覽器會重用一個TCP連接來處理多個HTTP請求),然后讓客戶端去斷鏈接(你要小心,瀏覽器可能會非常貪婪,他們不到萬不得已不會主動斷連接)。

數據傳輸中的Sequence Number

下圖是我從Wireshark中截了個我在訪問coolshell.cn時的有數據傳輸的圖給你看一下,SeqNum是怎么變的。(使用Wireshark菜單中的Statistics ->Flow Graph… )

你可以看到,SeqNum的增加是和傳輸的字節數相關的。上圖中,三次握手后,來了兩個Len:1440的包,而第二個包的SeqNum就成了1441。然后第一個ACK回的是1441,表示第一個1440收到了。

注意:如果你用Wireshark抓包程序看3次握手,你會發現SeqNum總是為0,不是這樣的,Wireshark為了顯示更友好,使用了Relative SeqNum——相對序號,你只要在右鍵菜單中的protocol preference 中取消掉就可以看到“Absolute SeqNum”了

TCP重傳機制

TCP要保證所有的數據包都可以到達,所以,必需要有重傳機制。

注意,接收端給發送端的Ack確認只會確認最后一個連續的包,比如,發送端發了1,2,3,4,5一共五份數據,接收端收到了1,2,于是回ack 3,然后收到了4(注意此時3沒收到),此時的TCP會怎么辦?我們要知道,因為正如前面所說的,SeqNum和Ack是以字節數為單位,所以ack的時候,不能跳著確認,只能確認最大的連續收到的包,不然,發送端就以為之前的都收到了。

超時重傳機制

一種是不回ack,死等3,當發送方發現收不到3的ack超時后,會重傳3。一旦接收方收到3后,會ack 回 4——意味著3和4都收到了。

但是,這種方式會有比較嚴重的問題,那就是因為要死等3,所以會導致4和5即便已經收到了,而發送方也完全不知道發生了什么事,因為沒有收到Ack,所以,發送方可能會悲觀地認為也丟了,所以有可能也會導致4和5的重傳。

對此有兩種選擇:

  • 一種是僅重傳timeout的包。也就是第3份數據。
  • 另一種是重傳timeout后所有的數據,也就是第3,4,5這三份數據。

這兩種方式有好也有不好。第一種會節省帶寬,但是慢,第二種會快一點,但是會浪費帶寬,也可能會有無用功。但總體來說都不好。因為都在等timeout,timeout可能會很長(在下篇會說TCP是怎么動態地計算出timeout的)

快速重傳機制

于是,TCP引入了一種叫Fast Retransmit 的算法,不以時間驅動,而以數據驅動重傳。也就是說,如果,包沒有連續到達,就ack最后那個可能被丟了的包,如果發送方連續收到3次相同的ack,就重傳。Fast Retransmit的好處是不用等timeout了再重傳。

比如:如果發送方發出了1,2,3,4,5份數據,第一份先到送了,于是就ack回2,結果2因為某些原因沒收到,3到達了,于是還是ack回2,后面的4和5都到了,但是還是ack回2,因為2還是沒有收到,于是發送端收到了三個ack=2的確認,知道了2還沒有到,于是就馬上重轉2。然后,接收端收到了2,此時因為3,4,5都收到了,于是ack回6。示意圖如下:

Fast Retransmit只解決了一個問題,就是timeout的問題,它依然面臨一個艱難的選擇,就是重轉之前的一個還是重裝所有的問題。對于上面的示例來說,是重傳#2呢還是重傳#2,#3,#4,#5呢?因為發送端并不清楚這連續的3個ack(2)是誰傳回來的?也許發送端發了20份數據,是#6,#10,#20傳來的呢。這樣,發送端很有可能要重傳從2到20的這堆數據(這就是某些TCP的實際的實現)。可見,這是一把雙刃劍。

SACK 方法

另外一種更好的方式叫:Selective Acknowledgment (SACK)(參看RFC 2018),這種方式需要在TCP頭里加一個SACK的東西,ACK還是Fast Retransmit的ACK,SACK則是匯報收到的數據碎版。參看下圖:

這樣,在發送端就可以根據回傳的SACK來知道哪些數據到了,哪些沒有到。于是就優化了Fast Retransmit的算法。當然,這個協議需要兩邊都支持。在 Linux下,可以通過tcp_sack參數打開這個功能(Linux 2.4后默認打開)。

這里還需要注意一個問題——接收方Reneging,所謂Reneging的意思就是接收方有權把已經報給發送端SACK里的數據給丟了。這樣干是不被鼓勵的,因為這個事會把問題復雜化了,但是,接收方這么做可能會有些極端情況,比如要把內存給別的更重要的東西。所以,發送方也不能完全依賴SACK,還是要依賴ACK,并維護Time-Out,如果后續的ACK沒有增長,那么還是要把SACK的東西重傳,另外,接收端這邊永遠不能把SACK的包標記為Ack。

注意:SACK會消費發送方的資源,試想,如果一個攻擊者給數據發送方發一堆SACK的選項,這會導致發送方開始要重傳甚至遍歷已經發出的數據,這會消耗很多發送端的資源。詳細的東西請參看《TCP SACK的性能權衡》

Duplicate SACK – 重復收到數據的問題

Duplicate SACK又稱D-SACK,其主要使用了SACK來告訴發送方有哪些數據被重復接收了。RFC-2833 里有詳細描述和示例。下面舉幾個例子(來源于RFC-2833)

D-SACK使用了SACK的第一個段來做標志,

  • 如果SACK的第一個段的范圍被ACK所覆蓋,那么就是D-SACK
  • 如果SACK的第一個段的范圍被SACK的第二個段覆蓋,那么就是D-SACK

示例一:ACK丟包

下面的示例中,丟了兩個ACK,所以,發送端重傳了第一個數據包(3000-3499),于是接收端發現重復收到,于是回了一個SACK=3000-3500,因為ACK都到了4000意味著收到了4000之前的所有數據,所以這個SACK就是D-SACK——旨在告訴發送端我收到了重復的數據,而且我們的發送端還知道,數據包沒有丟,丟的是ACK包。

1: Transmitted Received ACK Sent 2: Segment Segment (Including SACK Blocks) 3: 4: 3000-3499 3000-3499 3500 (ACK dropped) 5: 3500-3999 3500-3999 4000 (ACK dropped) 6: 3000-3499 3000-3499 4000, SACK=3000-3500 7: ---------

示例二,網絡延誤

下面的示例中,網絡包(1000-1499)被網絡給延誤了,導致發送方沒有收到ACK,而后面到達的三個包觸發了“Fast Retransmit算法”,所以重傳,但重傳時,被延誤的包又到了,所以,回了一個SACK=1000-1500,因為ACK已到了3000,所以,這個SACK是D-SACK——標識收到了重復的包。

這個案例下,發送端知道之前因為“Fast Retransmit算法”觸發的重傳不是因為發出去的包丟了,也不是因為回應的ACK包丟了,而是因為網絡延時了。

1: Transmitted Received ACK Sent 2: Segment Segment (Including SACK Blocks) 3: 4: 500-999 500-999 1000 5: 1000-1499 (delayed) 6: 1500-1999 1500-1999 1000, SACK=1500-2000 7: 2000-2499 2000-2499 1000, SACK=1500-2500 8: 2500-2999 2500-2999 1000, SACK=1500-3000 9: 1000-1499 1000-1499 3000 10: 1000-1499 3000, SACK=1000-1500 11: ---------

可見,引入了D-SACK,有這么幾個好處:

1)可以讓發送方知道,是發出去的包丟了,還是回來的ACK包丟了。

2)是不是自己的timeout太小了,導致重傳。

3)網絡上出現了先發的包后到的情況(又稱reordering)

4)網絡上是不是把我的數據包給復制了。

知道這些東西可以很好得幫助TCP了解網絡情況,從而可以更好的做網絡上的流控

Linux下的tcp_dsack參數用于開啟這個功能(Linux 2.4后默認打開)

好了,上篇就到這里結束了。如果你覺得我寫得還比較淺顯易懂,那么,歡迎移步看下篇《TCP的那些事(下)》

?

這篇文章是下篇,所以如果你對TCP不熟悉的話,還請你先看看上篇《TCP的那些事兒(上)》 上篇中,我們介紹了TCP的協議頭、狀態機、數據重傳中的東西。但是TCP要解決一個很大的事,那就是要在一個網絡根據不同的情況來動態調整自己的發包的速度,小則讓自己的連接更穩定,大則讓整個網絡更穩定。在你閱讀下篇之前,你需要做好準備,本篇文章有好些算法和策略,可能會引發你的各種思考,讓你的大腦分配很多內存和計算資源,所以,不適合在廁所中閱讀。

TCP的RTT算法

從前面的TCP重傳機制我們知道Timeout的設置對于重傳非常重要。

  • 設長了,重發就慢,丟了老半天才重發,沒有效率,性能差;
  • 設短了,會導致可能并沒有丟就重發。于是重發的就快,會增加網絡擁塞,導致更多的超時,更多的超時導致更多的重發。

而且,這個超時時間在不同的網絡的情況下,根本沒有辦法設置一個死的值。只能動態地設置。 為了動態地設置,TCP引入了RTT——Round Trip Time,也就是一個數據包從發出去到回來的時間。這樣發送端就大約知道需要多少的時間,從而可以方便地設置Timeout——RTO(Retransmission TimeOut),以讓我們的重傳機制更高效。 聽起來似乎很簡單,好像就是在發送端發包時記下t0,然后接收端再把這個ack回來時再記一個t1,于是RTT = t1 – t0。沒那么簡單,這只是一個采樣,不能代表普遍情況。

經典算法

RFC793 中定義的經典算法是這樣的:

1)首先,先采樣RTT,記下最近好幾次的RTT值。

2)然后做平滑計算SRTT( Smoothed RTT)。公式為:(其中的 α 取值在0.8 到 0.9之間,這個算法英文叫Exponential weighted moving average,中文叫:加權移動平均)

SRTT = ( α * SRTT ) + ((1- α) * RTT)

3)開始計算RTO。公式如下:

RTO = min [ UBOUND,? max [ LBOUND,?? (β * SRTT) ]? ]

其中:

  • UBOUND是最大的timeout時間,上限值
  • LBOUND是最小的timeout時間,下限值
  • β 值一般在1.3到2.0之間。
Karn / Partridge 算法

但是上面的這個算法在重傳的時候會出有一個終極問題——你是用第一次發數據的時間和ack回來的時間做RTT樣本值,還是用重傳的時間和ACK回來的時間做RTT樣本值?

這個問題無論你選那頭都是按下葫蘆起了瓢。 如下圖所示:

  • 情況(a)是ack沒回來,所以重傳。如果你計算第一次發送和ACK的時間,那么,明顯算大了。
  • 情況(b)是ack回來慢了,但是導致了重傳,但剛重傳不一會兒,之前ACK就回來了。如果你是算重傳的時間和ACK回來的時間的差,就會算短了。

所以1987年的時候,搞了一個叫Karn / Partridge Algorithm,這個算法的最大特點是——忽略重傳,不把重傳的RTT做采樣(你看,你不需要去解決不存在的問題)。

但是,這樣一來,又會引發一個大BUG——如果在某一時間,網絡閃動,突然變慢了,產生了比較大的延時,這個延時導致要重轉所有的包(因為之前的RTO很小),于是,因為重轉的不算,所以,RTO就不會被更新,這是一個災難。 于是Karn算法用了一個取巧的方式——只要一發生重傳,就對現有的RTO值翻倍(這就是所謂的 Exponential backoff),很明顯,這種死規矩對于一個需要估計比較準確的RTT也不靠譜。

Jacobson / Karels 算法

前面兩種算法用的都是“加權移動平均”,這種方法最大的毛病就是如果RTT有一個大的波動的話,很難被發現,因為被平滑掉了。所以,1988年,又有人推出來了一個新的算法,這個算法叫Jacobson / Karels Algorithm(參看RFC6289)。這個算法引入了最新的RTT的采樣和平滑過的SRTT的差距做因子來計算。 公式如下:(其中的DevRTT是Deviation RTT的意思)

SRTT = SRTT + α (RTT – SRTT)? —— 計算平滑RTT

DevRTT = (1-β)*DevRTT + β*(|RTT-SRTT|) ——計算平滑RTT和真實的差距(加權移動平均)

RTO= μ * SRTT + ? *DevRTT —— 神一樣的公式

(其中:在Linux下,α = 0.125,β = 0.25, μ = 1,? = 4 ——這就是算法中的“調得一手好參數”,nobody knows why, it just works…) 最后的這個算法在被用在今天的TCP協議中(Linux的源代碼在:tcp_rtt_estimator)。

TCP滑動窗口

需要說明一下,如果你不了解TCP的滑動窗口這個事,你等于不了解TCP協議。我們都知道,TCP必需要解決的可靠傳輸以及包亂序(reordering)的問題,所以,TCP必需要知道網絡實際的數據處理帶寬或是數據處理速度,這樣才不會引起網絡擁塞,導致丟包。

所以,TCP引入了一些技術和設計來做網絡流控,Sliding Window是其中一個技術。 前面我們說過,TCP頭里有一個字段叫Window,又叫Advertised-Window,這個字段是接收端告訴發送端自己還有多少緩沖區可以接收數據于是發送端就可以根據這個接收端的處理能力來發送數據,而不會導致接收端處理不過來。 為了說明滑動窗口,我們需要先看一下TCP緩沖區的一些數據結構:

上圖中,我們可以看到:

  • 接收端LastByteRead指向了TCP緩沖區中讀到的位置,NextByteExpected指向的地方是收到的連續包的最后一個位置,LastByteRcved指向的是收到的包的最后一個位置,我們可以看到中間有些數據還沒有到達,所以有數據空白區。
  • 發送端的LastByteAcked指向了被接收端Ack過的位置(表示成功發送確認),LastByteSent表示發出去了,但還沒有收到成功確認的Ack,LastByteWritten指向的是上層應用正在寫的地方。

于是:

  • 接收端在給發送端回ACK中會匯報自己的AdvertisedWindow = MaxRcvBuffer – LastByteRcvd – 1;
  • 而發送方會根據這個窗口來控制發送數據的大小,以保證接收方可以處理。

下面我們來看一下發送方的滑動窗口示意圖:

(圖片來源)

上圖中分成了四個部分,分別是:(其中那個黑模型就是滑動窗口)

  • #1已收到ack確認的數據。
  • #2發還沒收到ack的。
  • #3在窗口中還沒有發出的(接收方還有空間)。
  • #4窗口以外的數據(接收方沒空間)

下面是個滑動后的示意圖(收到36的ack,并發出了46-51的字節):

下面我們來看一個接受端控制發送端的圖示:

(圖片來源)

Zero Window

上圖,我們可以看到一個處理緩慢的Server(接收端)是怎么把Client(發送端)的TCP Sliding Window給降成0的。此時,你一定會問,如果Window變成0了,TCP會怎么樣?是不是發送端就不發數據了?是的,發送端就不發數據了,你可以想像成“Window Closed”,那你一定還會問,如果發送端不發數據了,接收方一會兒Window size 可用了,怎么通知發送端呢?

解決這個問題,TCP使用了Zero Window Probe技術,縮寫為ZWP,也就是說,發送端在窗口變成0后,會發ZWP的包給接收方,讓接收方來ack他的Window尺寸,一般這個值會設置成3次,第次大約30-60秒(不同的實現可能會不一樣)。如果3次過后還是0的話,有的TCP實現就會發RST把鏈接斷了。

注意:只要有等待的地方都可能出現DDoS攻擊,Zero Window也不例外,一些攻擊者會在和HTTP建好鏈發完GET請求后,就把Window設置為0,然后服務端就只能等待進行ZWP,于是攻擊者會并發大量的這樣的請求,把服務器端的資源耗盡。(關于這方面的攻擊,大家可以移步看一下Wikipedia的SockStress詞條)

另外,Wireshark中,你可以使用tcp.analysis.zero_window來過濾包,然后使用右鍵菜單里的follow TCP stream,你可以看到ZeroWindowProbe及ZeroWindowProbeAck的包。

Silly Window Syndrome

Silly Window Syndrome翻譯成中文就是“糊涂窗口綜合癥”。正如你上面看到的一樣,如果我們的接收方太忙了,來不及取走Receive Windows里的數據,那么,就會導致發送方越來越小。到最后,如果接收方騰出幾個字節并告訴發送方現在有幾個字節的window,而我們的發送方會義無反顧地發送這幾個字節。

要知道,我們的TCP+IP頭有40個字節,為了幾個字節,要達上這么大的開銷,這太不經濟了。

另外,你需要知道網絡上有個MTU,對于以太網來說,MTU是1500字節,除去TCP+IP頭的40個字節,真正的數據傳輸可以有1460,這就是所謂的MSS(Max Segment Size)注意,TCP的RFC定義這個MSS的默認值是536,這是因為 RFC 791里說了任何一個IP設備都得最少接收576尺寸的大小(實際上來說576是撥號的網絡的MTU,而576減去IP頭的20個字節就是536)。

如果你的網絡包可以塞滿MTU,那么你可以用滿整個帶寬,如果不能,那么你就會浪費帶寬。(大于MTU的包有兩種結局,一種是直接被丟了,另一種是會被重新分塊打包發送) 你可以想像成一個MTU就相當于一個飛機的最多可以裝的人,如果這飛機里滿載的話,帶寬最高,如果一個飛機只運一個人的話,無疑成本增加了,也而相當二。

所以,Silly Windows Syndrome這個現像就像是你本來可以坐200人的飛機里只做了一兩個人。 要解決這個問題也不難,就是避免對小的window size做出響應,直到有足夠大的window size再響應,這個思路可以同時實現在sender和receiver兩端。

  • 如果這個問題是由Receiver端引起的,那么就會使用 David D Clark’s 方案。在receiver端,如果收到的數據導致window size小于某個值,可以直接ack(0)回sender,這樣就把window給關閉了,也阻止了sender再發數據過來,等到receiver端處理了一些數據后windows size 大于等于了MSS,或者,receiver buffer有一半為空,就可以把window打開讓send 發送數據過來。
  • 如果這個問題是由Sender端引起的,那么就會使用著名的 Nagle’s algorithm。這個算法的思路也是延時處理,他有兩個主要的條件(更多的條件可以看一下tcp_nagle_check函數):1)要等到 Window Size>=MSS 或是 Data Size >=MSS,2)等待時間或是超時200ms,這兩個條件有一個滿足,他才會發數據,否則就是在攢數據。

另外,Nagle算法默認是打開的,所以,對于一些需要小包場景的程序——比如像telnet或ssh這樣的交互性比較強的程序,你需要關閉這個算法。你可以在Socket設置TCP_NODELAY選項來關閉這個算法(關閉Nagle算法沒有全局參數,需要根據每個應用自己的特點來關閉)

1

setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&value,sizeof(int));

另外,網上有些文章說TCP_CORK的socket option是也關閉Nagle算法,這個還不夠準確。TCP_CORK是禁止小包發送,而Nagle算法沒有禁止小包發送,只是禁止了大量的小包發送。最好不要兩個選項都設置。老實說,我覺得Nagle算法其實只加了個延時,沒有別的什么,我覺得最好還是把他關閉,然后由自己的應用層來控制數據,我個覺得不應該什么事都去依賴內核算法

TCP的擁塞處理 - Congestion Handling

上面我們知道了,TCP通過Sliding Window來做流控(Flow Control),但是TCP覺得這還不夠,因為Sliding Window需要依賴于連接的發送端和接收端,其并不知道網絡中間發生了什么。TCP的設計者覺得,一個偉大而牛逼的協議僅僅做到流控并不夠,因為流控只是網絡模型4層以上的事,TCP的還應該更聰明地知道整個網絡上的事。

具體一點,我們知道TCP通過一個timer采樣了RTT并計算RTO,但是,如果網絡上的延時突然增加,那么,TCP對這個事做出的應對只有重傳數據,但是,重傳會導致網絡的負擔更重,于是會導致更大的延遲以及更多的丟包,于是,這個情況就會進入惡性循環被不斷地放大。試想一下,如果一個網絡內有成千上萬的TCP連接都這么行事,那么馬上就會形成“網絡風暴”,TCP這個協議就會拖垮整個網絡。這是一個災難。

所以,TCP不能忽略網絡上發生的事情,而無腦地一個勁地重發數據,對網絡造成更大的傷害。對此TCP的設計理念是:TCP不是一個自私的協議,當擁塞發生的時候,要做自我犧牲。就像交通阻塞一樣,每個車都應該把路讓出來,而不要再去搶路了。

關于擁塞控制的論文請參看《Congestion Avoidance and Control》(PDF)

擁塞控制主要是四個算法:1)慢啟動2)擁塞避免3)擁塞發生4)快速恢復。這四個算法不是一天都搞出來的,這個四算法的發展經歷了很多時間,到今天都還在優化中。 備注:

  • 1988年,TCP-Tahoe 提出了1)慢啟動,2)擁塞避免,3)擁塞發生時的快速重傳
  • 1990年,TCP Reno 在Tahoe的基礎上增加了4)快速恢復
慢熱啟動算法 – Slow Start

首先,我們來看一下TCP的慢熱啟動。慢啟動的意思是,剛剛加入網絡的連接,一點一點地提速,不要一上來就像那些特權車一樣霸道地把路占滿。新同學上高速還是要慢一點,不要把已經在高速上的秩序給搞亂了。

慢啟動的算法如下(cwnd全稱Congestion Window):

1)連接建好的開始先初始化cwnd = 1,表明可以傳一個MSS大小的數據。

2)每當收到一個ACK,cwnd++; 呈線性上升

3)每當過了一個RTT,cwnd = cwnd*2; 呈指數讓升

4)還有一個ssthresh(slow start threshold),是一個上限,當cwnd >= ssthresh時,就會進入“擁塞避免算法”(后面會說這個算法)

所以,我們可以看到,如果網速很快的話,ACK也會返回得快,RTT也會短,那么,這個慢啟動就一點也不慢。下圖說明了這個過程。

這里,我需要提一下的是一篇Google的論文《An Argument for Increasing TCP’s Initial Congestion Window》Linux 3.0后采用了這篇論文的建議——把cwnd 初始化成了 10個MSS。 而Linux 3.0以前,比如2.6,Linux采用了RFC3390,cwnd是跟MSS的值來變的,如果MSS< 1095,則cwnd = 4;如果MSS>2190,則cwnd=2;其它情況下,則是3。

擁塞避免算法 - Congestion Avoidance

前面說過,還有一個ssthresh(slow start threshold),是一個上限,當cwnd >= ssthresh時,就會進入“擁塞避免算法”。一般來說ssthresh的值是65535,單位是字節,當cwnd達到這個值時后,算法如下:

1)收到一個ACK時,cwnd = cwnd + 1/cwnd

2)當每過一個RTT時,cwnd = cwnd + 1

這樣就可以避免增長過快導致網絡擁塞,慢慢的增加調整到網絡的最佳值。很明顯,是一個線性上升的算法。

擁塞狀態時的算法

前面我們說過,當丟包的時候,會有兩種情況:

1)等到RTO超時,重傳數據包。TCP認為這種情況太糟糕,反應也很強烈。

    • sshthresh =? cwnd /2
    • cwnd 重置為 1
    • 進入慢啟動過程

2)Fast Retransmit算法,也就是在收到3個duplicate ACK時就開啟重傳,而不用等到RTO超時。

    • TCP Tahoe的實現和RTO超時一樣。
    • TCP Reno的實現是:
      • cwnd = cwnd /2
      • sshthresh = cwnd
      • 進入快速恢復算法——Fast Recovery

上面我們可以看到RTO超時后,sshthresh會變成cwnd的一半,這意味著,如果cwnd<=sshthresh時出現的丟包,那么TCP的sshthresh就會減了一半,然后等cwnd又很快地以指數級增漲爬到這個地方時,就會成慢慢的線性增漲。我們可以看到,TCP是怎么通過這種強烈地震蕩快速而小心得找到網站流量的平衡點的。

快速恢復算法 – Fast Recovery

TCP Reno

這個算法定義在RFC5681。快速重傳和快速恢復算法一般同時使用。快速恢復算法是認為,你還有3個Duplicated Acks說明網絡也不那么糟糕,所以沒有必要像RTO超時那么強烈。 注意,正如前面所說,進入Fast Recovery之前,cwnd 和 sshthresh已被更新:

  • cwnd = cwnd /2
  • sshthresh = cwnd

然后,真正的Fast Recovery算法如下:

  • cwnd = sshthresh? + 3 * MSS (3的意思是確認有3個數據包被收到了)
  • 重傳Duplicated ACKs指定的數據包
  • 如果再收到 duplicated Acks,那么cwnd = cwnd +1
  • 如果收到了新的Ack,那么,cwnd = sshthresh ,然后就進入了擁塞避免的算法了。

如果你仔細思考一下上面的這個算法,你就會知道,上面這個算法也有問題,那就是——它依賴于3個重復的Acks。注意,3個重復的Acks并不代表只丟了一個數據包,很有可能是丟了好多包。但這個算法只會重傳一個,而剩下的那些包只能等到RTO超時,于是,進入了惡夢模式——超時一個窗口就減半一下,多個超時會超成TCP的傳輸速度呈級數下降,而且也不會觸發Fast Recovery算法了。

通常來說,正如我們前面所說的,SACK或D-SACK的方法可以讓Fast Recovery或Sender在做決定時更聰明一些,但是并不是所有的TCP的實現都支持SACK(SACK需要兩端都支持),所以,需要一個沒有SACK的解決方案。而通過SACK進行擁塞控制的算法是FACK(后面會講)

TCP New Reno

于是,1995年,TCP New Reno(參見 RFC 6582 )算法提出來,主要就是在沒有SACK的支持下改進Fast Recovery算法的——

  • 當sender這邊收到了3個Duplicated Acks,進入Fast Retransimit模式,開發重傳重復Acks指示的那個包。如果只有這一個包丟了,那么,重傳這個包后回來的Ack會把整個已經被sender傳輸出去的數據ack回來。如果沒有的話,說明有多個包丟了。我們叫這個ACK為Partial ACK。
  • 一旦Sender這邊發現了Partial ACK出現,那么,sender就可以推理出來有多個包被丟了,于是乎繼續重傳sliding window里未被ack的第一個包。直到再也收不到了Partial Ack,才真正結束Fast Recovery這個過程

我們可以看到,這個“Fast Recovery的變更”是一個非常激進的玩法,他同時延長了Fast Retransmit和Fast Recovery的過程。

算法示意圖

下面我們來看一個簡單的圖示以同時看一下上面的各種算法的樣子:

FACK算法

FACK全稱Forward Acknowledgment 算法,論文地址在這里(PDF)Forward Acknowledgement: Refining TCP Congestion Control 這個算法是其于SACK的,前面我們說過SACK是使用了TCP擴展字段Ack了有哪些數據收到,哪些數據沒有收到,他比Fast Retransmit的3 個duplicated acks好處在于,前者只知道有包丟了,不知道是一個還是多個,而SACK可以準確的知道有哪些包丟了。 所以,SACK可以讓發送端這邊在重傳過程中,把那些丟掉的包重傳,而不是一個一個的傳,但這樣的一來,如果重傳的包數據比較多的話,又會導致本來就很忙的網絡就更忙了。所以,FACK用來做重傳過程中的擁塞流控。

  • 這個算法會把SACK中最大的Sequence Number 保存在snd.fack這個變量中,snd.fack的更新由ack帶秋,如果網絡一切安好則和snd.una一樣(snd.una就是還沒有收到ack的地方,也就是前面sliding window里的category #2的第一個地方)
  • 然后定義一個awnd = snd.nxt – snd.fack(snd.nxt指向發送端sliding window中正在要被發送的地方——前面sliding windows圖示的category#3第一個位置),這樣awnd的意思就是在網絡上的數據。(所謂awnd意為:actual quantity of data outstanding in the network)
  • 如果需要重傳數據,那么,awnd = snd.nxt – snd.fack + retran_data,也就是說,awnd是傳出去的數據 + 重傳的數據。
  • 然后觸發Fast Recovery 的條件是: ( ( snd.fack – snd.una ) > (3*MSS) ) || (dupacks == 3) ) 。這樣一來,就不需要等到3個duplicated acks才重傳,而是只要sack中的最大的一個數據和ack的數據比較長了(3個MSS),那就觸發重傳。在整個重傳過程中cwnd不變。直到當第一次丟包的snd.nxt<=snd.una(也就是重傳的數據都被確認了),然后進來擁塞避免機制——cwnd線性上漲。

我們可以看到如果沒有FACK在,那么在丟包比較多的情況下,原來保守的算法會低估了需要使用的window的大小,而需要幾個RTT的時間才會完成恢復,而FACK會比較激進地來干這事。 但是,FACK如果在一個網絡包會被 reordering的網絡里會有很大的問題。

其它擁塞控制算法簡介
TCP Vegas 擁塞控制算法

這個算法1994年被提出,它主要對TCP Reno 做了些修改。這個算法通過對RTT的非常重的監控來計算一個基準RTT。然后通過這個基準RTT來估計當前的網絡實際帶寬,如果實際帶寬比我們的期望的帶寬要小或是要多的活,那么就開始線性地減少或增加cwnd的大小。如果這個計算出來的RTT大于了Timeout后,那么,不等ack超時就直接重傳。(Vegas 的核心思想是用RTT的值來影響擁塞窗口,而不是通過丟包) 這個算法的論文是《TCP Vegas: End to End Congestion Avoidance on a Global Internet》這篇論文給了Vegas和 New Reno的對比:

關于這個算法實現,你可以參看Linux源碼:/net/ipv4/tcp_vegas.h, /net/ipv4/tcp_vegas.c

HSTCP(High Speed TCP) 算法

這個算法來自RFC 3649(Wikipedia詞條)。其對最基礎的算法進行了更改,他使得Congestion Window漲得快,減得慢。其中:

  • 擁塞避免時的窗口增長方式: cwnd = cwnd + α(cwnd) / cwnd
  • 丟包后窗口下降方式:cwnd = (1- β(cwnd))*cwnd

注:α(cwnd)和β(cwnd)都是函數,如果你要讓他們和標準的TCP一樣,那么讓α(cwnd)=1,β(cwnd)=0.5就可以了。 對于α(cwnd)和β(cwnd)的值是個動態的變換的東西。 關于這個算法的實現,你可以參看Linux源碼:/net/ipv4/tcp_highspeed.c

TCP BIC 算法

2004年,產內出BIC算法。現在你還可以查得到相關的新聞《Google:美科學家研發BIC-TCP協議 速度是DSL六千倍》 BIC全稱Binary Increase Congestion control,在Linux 2.6.8中是默認擁塞控制算法。BIC的發明者發這么多的擁塞控制算法都在努力找一個合適的cwnd – Congestion Window,而且BIC-TCP的提出者們看穿了事情的本質,其實這就是一個搜索的過程,所以BIC這個算法主要用的是Binary Search——二分查找來干這個事。 關于這個算法實現,你可以參看Linux源碼:/net/ipv4/tcp_bic.c

TCP WestWood算法

westwood采用和Reno相同的慢啟動算法、擁塞避免算法。westwood的主要改進方面:在發送端做帶寬估計,當探測到丟包時,根據帶寬值來設置擁塞窗口、慢啟動閾值。 那么,這個算法是怎么測量帶寬的?每個RTT時間,會測量一次帶寬,測量帶寬的公式很簡單,就是這段RTT內成功被ack了多少字節。因為,這個帶寬和用RTT計算RTO一樣,也是需要從每個樣本來平滑到一個值的——也是用一個加權移平均的公式。 另外,我們知道,如果一個網絡的帶寬是每秒可以發送X個字節,而RTT是一個數據發出去后確認需要的時候,所以,X * RTT應該是我們緩沖區大小。所以,在這個算法中,ssthresh的值就是est_BD * min-RTT(最小的RTT值),如果丟包是Duplicated ACKs引起的,那么如果cwnd > ssthresh,則 cwin = ssthresh。如果是RTO引起的,cwnd = 1,進入慢啟動。?? 關于這個算法實現,你可以參看Linux源碼: /net/ipv4/tcp_westwood.c

其它

更多的算法,你可以從Wikipedia的 TCP Congestion Avoidance Algorithm 詞條中找到相關的線索

后記

好了,到這里我想可以結束了,TCP發展到今天,里面的東西可以寫上好幾本書。本文主要目的,還是把你帶入這些古典的基礎技術和知識中,希望本文能讓你了解TCP,更希望本文能讓你開始有學習這些基礎或底層知識的興趣和信心。

當然,TCP東西太多了,不同的人可能有不同的理解,而且本文可能也會有一些荒謬之言甚至錯誤,還希望得到您的反饋和批評。

(全文完)

轉載于:https://www.cnblogs.com/westwind/p/3812696.html

總結

以上是生活随笔為你收集整理的TCP的那些事(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品久久久影院 | 久久精品一区二区国产 | 久久久久久久久久影院 | 久久99久久久久久 | 国产在线不卡视频 | 欧美日本一区 | 黄网站色视频 | 国产一线在线 | 中文字幕一区二区在线播放 | 久久伊人国产精品 | 9i看片成人免费看片 | 精品久久久亚洲 | 日韩高清一区在线 | 国产精品久久久久久久久久白浆 | 伊人五月婷 | 国产九九精品视频 | 欧美日韩国产在线一区 | 五月婷婷丁香在线观看 | 91精品1区| 亚州av免费 | 99精品视频在线观看 | 日日日干 | 欧美性粗大hdvideo | 中文字幕精品www乱入免费视频 | 一区二区三区在线免费播放 | 欧美精品久久久久a | 国产精国产精品 | 91九色成人蝌蚪首页 | 丁香婷婷激情国产高清秒播 | 一区二区高清在线 | 欧美精品久久久久久久久久 | 久香蕉| 中文字幕国产一区 | 在线观看黄网站 | 中文字幕在线日 | 精品人妖videos欧美人妖 | 久久久影片 | 亚洲美女视频在线观看 | 伊人永久| 五月天视频网站 | 午夜精品久久久久久久久久久久久久 | 九色自拍视频 | 国产麻豆视频 | 综合网av | 久久精品一区二 | 精品福利网站 | 亚洲国产精品电影在线观看 | 久久久天堂| 久久久久久久久久电影 | 天天看天天操 | 在线天堂v | 国内精品久久久久久久久 | 麻豆av电影 | 国产精品免费在线视频 | 国产精品99久久久久久人免费 | 国产精品久久久久影院 | 91亚色免费视频 | 成人影视免费 | 国产精品美乳一区二区免费 | 在线观看免费高清视频大全追剧 | 亚洲欧美日韩精品久久奇米一区 | 高清av免费观看 | 色狠狠一区二区 | 亚洲精品xx| 日韩毛片久久久 | 中文字幕一区二区三区久久 | 一区中文字幕 | 日本三级在线观看中文字 | 性色在线视频 | 午夜在线看 | 麻豆一区在线观看 | 国产蜜臀av| 91色一区二区三区 | 久久精品五月 | 亚洲做受高潮欧美裸体 | www.婷婷com| 日韩欧美精品在线观看视频 | 丝袜+亚洲+另类+欧美+变态 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产群p视频 | 欧美成人性网 | 免费av在线网站 | 在线观看国产麻豆 | 国产免费三级在线观看 | a在线免费 | 久久激情综合网 | 久久婷亚洲五月一区天天躁 | 91精品夜夜| 特级毛片网站 | 丁香花中文字幕 | 99r精品视频在线观看 | 91黄色在线看 | 六月丁香社区 | 在线免费观看视频一区二区三区 | 天天做天天干 | 日韩av二区 | 一本色道久久综合亚洲二区三区 | 99精品国产福利在线观看免费 | 成人久久18免费网站麻豆 | 久久爽久久爽久久av东京爽 | 日韩动态视频 | 精品欧美乱码久久久久久 | 久久人网 | 欧美色精品天天在线观看视频 | 日韩毛片一区 | 欧美国产精品久久久久久免费 | 免费观看黄色12片一级视频 | www黄色大片 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产精品尤物视频 | 国产亚洲免费观看 | 97精品免费视频 | 美女久久精品 | 丁香婷婷深情五月亚洲 | 日韩在线理论 | 91黄视频在线观看 | 亚洲好视频 | 中文字幕欧美日韩va免费视频 | 综合网天天色 | 日韩成人xxxx | 国产99久久九九精品免费 | 免费欧美精品 | 国产精品美女在线观看 | 日韩精品网址 | 亚洲乱码中文字幕综合 | 97在线观看免费观看 | 亚洲国产99 | 日韩精品中文字幕av | 97视频免费看 | 九九免费在线观看视频 | 国产精品videoxxxx | 这里只有精品视频在线 | 国产精品自产拍在线观看中文 | 亚洲一级黄色片 | 国产男女免费完整视频 | 91视频 - 114av | 亚洲国产中文字幕 | 99在线观看免费视频精品观看 | 午夜精品av | 日韩久久久久久久久久久久 | 高潮毛片无遮挡高清免费 | 激情中文在线 | 97干com| 91成人精品一区在线播放69 | 欧美性超爽 | 成人a在线观看高清电影 | 青青河边草观看完整版高清 | 国产一区在线视频观看 | 日韩在线精品一区 | 国产最新视频在线观看 | 日韩高清一二区 | 久色婷婷 | 伊人春色电影网 | www.五月婷| 国内精品久久久久久久久久久久 | 亚洲久在线 | 人人干人人爽 | 久久9999久久| 婷婷在线综合 | 99视频一区二区 | 亚洲精品国产综合99久久夜夜嗨 | 91麻豆精品国产自产在线游戏 | 在线免费观看的av | 欧美综合色在线图区 | 欧美先锋影音 | 久久久电影网站 | 免费观看黄 | 草久久久久久久 | www免费网站在线观看 | 免费看黄的 | 99色婷婷 | 日韩免费av片| 91tv国产成人福利 | 亚洲欧美日韩国产一区二区 | 国内偷拍精品视频 | 91中文字幕在线播放 | 97av视频在线| 丁香五月缴情综合网 | 91丨九色丨蝌蚪丨老版 | 波多野结衣在线观看一区二区三区 | 免费av大全| 一区精品久久 | 午夜黄色 | 96亚洲精品久久久蜜桃 | 国产一线二线三线在线观看 | 色网免费观看 | av成人在线电影 | 久久精品免费看 | 国产一区影院 | 最新国产精品久久精品 | 偷拍精偷拍精品欧洲亚洲网站 | 午夜久久久久久久久久影院 | 成人资源在线观看 | 久久久久久久久久国产精品 | 久久久久久欧美二区电影网 | 亚州免费视频 | 在线视频日韩一区 | 中文字幕 国产专区 | 中文字幕二区三区 | 国产精品欧美久久久久天天影视 | 黄色av网站在线免费观看 | 色之综合网 | 精品视频中文字幕 | 九九久久久久久久久激情 | 狠狠干2018 | 国产一级特黄毛片在线毛片 | 免费又黄又爽 | 91专区在线观看 | 在线免费精品视频 | 色网站视频 | 色偷偷男人的天堂av | 亚洲综合成人专区片 | 国产一级一片免费播放放 | 国产精品久久久久高潮 | 国产999免费视频 | 96av在线| 在线免费观看麻豆 | 久久免费视频这里只有精品 | 精品福利片 | 国产精品一区二区果冻传媒 | 西西444www大胆高清视频 | 午夜精品电影一区二区在线 | 丁香六月色 | 99视频99| 色视频网站在线 | 欧美性猛片, | 91久久黄色 | 国产中文 | 久久精品导航 | 韩国av免费 | 在线观看国产麻豆 | 精品国产精品国产偷麻豆 | 中文字幕一区二区三区久久 | 在线观看免费视频你懂的 | 伊人成人久久 | 97福利社| 国产精品成人一区 | 国产明星视频三级a三级点| av丁香花 | 国产正在播放 | 久久国产精品视频观看 | 国产欧美在线一区二区三区 | 久久精品99国产精品 | 九九国产视频 | 天天天天天天干 | 五月婷婷丁香激情 | 欧美色图亚洲图片 | 精品视频中文字幕 | 在线色亚洲 | 国产成人精品免费在线观看 | 亚洲码国产日韩欧美高潮在线播放 | 欧美成人aa | 亚洲欧洲精品久久 | 天天色天天干天天 | 国产999精品久久久影片官网 | 亚洲欧美日韩在线一区二区 | 国产一区二区在线影院 | 日日操网站| 国产伦精品一区二区三区在线 | 四季av综合网站 | 在线 高清 中文字幕 | 久久精视频 | 欧美久久久久久久久 | 国产激情免费 | 亚洲天堂免费视频 | 91探花系列在线播放 | 国产精品久久久久久久久久ktv | 丁香六月激情婷婷 | 国产高清在线精品 | 中国一级片在线观看 | 国产69久久久 | 91传媒91久久久 | 片网址 | 毛片视频网址 | 亚洲国产精品推荐 | 456成人精品影院 | www178ccom视频在线 | 国产亚洲精品久 | 国产精品欧美日韩 | 日本女人的性生活视频 | 中文字幕av一区二区三区四区 | 夜夜爽88888免费视频4848 | 国产精品毛片久久久久久 | 93久久精品日日躁夜夜躁欧美 | 最新日韩精品 | 天堂中文在线视频 | 日韩中文字幕网站 | 国内外成人在线 | 免费久久网 | 国产91区 | 国产做aⅴ在线视频播放 | 日韩午夜电影网 | 91亚洲精品久久久 | 国产精品成人一区二区 | 亚洲综合视频在线播放 | 欧美成年网站 | 手机在线中文字幕 | 国产精品永久免费视频 | 成人免费在线观看av | 五月婷婷久 | 天天干 夜夜操 | 久久精品久久精品久久39 | 精品久久久久久一区二区里番 | 在线免费色视频 | 一二三久久久 | 久久久久久久久久网 | 精品久久久久一区二区国产 | 国产福利在线免费 | 天天操天天射天天 | 国产精品乱码一区二区视频 | 二区三区在线视频 | 欧美激情精品久久久久久免费 | 六月丁香六月婷婷 | 国产精品婷婷 | 国产伦精品一区二区三区四区视频 | 激情黄色av| 日韩av男人的天堂 | 国产免费又爽又刺激在线观看 | 日本一区二区三区视频在线播放 | 激情久久久久久久久久久久久久久久 | 国产精品毛片一区二区 | 久久久国产一区二区 | 黄色大片免费网站 | 九月婷婷综合网 | 精品欧美小视频在线观看 | 免费中文字幕在线观看 | 97精品国自产拍在线观看 | 91亚州 | 一级a性色生活片久久毛片波多野 | 天天色天天草天天射 | 国产伦精品一区二区三区照片91 | 午夜在线看片 | 国产精品乱码久久久 | 久久成年人| 亚洲日日日 | 天天色播 | 五月天av在线 | 中文字幕欧美日韩va免费视频 | 国产大尺度视频 | 深夜免费福利网站 | 91中文字幕视频 | a久久久久 | 9色在线视频 | 午夜久久久久久久久久久 | www.日本色| 精品高清视频 | 色姑娘综合天天 | 五月香视频在线观看 | 欧美 日韩 成人 | 夜夜夜影院 | 国产高清视频在线免费观看 | 中文字幕高清 | 久久99精品视频 | 91精品国产成人 | 国产精品第72页 | 日韩久久精品一区 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久精品一区二 | 国产成人av免费在线观看 | 日韩色综合| 天堂成人在线 | 黄色在线看网站 | 日韩精品在线视频 | 公开超碰在线 | 黄在线 | 四虎精品成人免费网站 | 99久久www | 伊人一级| 亚州精品一二三区 | 久热这里有精品 | 一本一本久久a久久 | 久久久亚洲电影 | 播五月综合 | 久草在线免费播放 | 日韩欧美国产精品 | 99久久久成人国产精品 | 欧美日韩国产精品久久 | 国产精品九色 | 一级片免费观看视频 | 日韩 精品 一区 国产 麻豆 | 狠狠88综合久久久久综合网 | 人人澡澡人人 | 色综合久久综合中文综合网 | 中文字幕久久精品一区 | 青草视频在线 | 五月婷网| 日韩有码中文字幕在线 | 麻豆视频www | 96亚洲精品久久久蜜桃 | 人人搞人人搞 | 成 人 黄 色视频免费播放 | 免费看毛片网站 | 亚洲成色777777在线观看影院 | 日韩网站在线免费观看 | 久久草 | 精品视频一区在线观看 | 日韩网站在线观看 | 国产精品伦一区二区三区视频 | 三级黄色三级 | 最近中文字幕免费大全 | 日韩一区二区三区免费视频 | 久久精品99久久 | 免费欧美高清视频 | 精品国产乱码久久久久久1区二区 | 69国产在线观看 | 欧美粗又大 | 丁香激情网 | 成人亚洲精品国产www | 日本深夜福利视频 | 欧美精品国产综合久久 | 亚洲欧洲精品一区二区精品久久久 | 99精品在线 | www日韩在线观看 | 99在线视频观看 | 亚洲高清视频在线播放 | 六月天综合网 | 亚洲国产中文字幕在线观看 | 精品久久久久亚洲 | 色婷av | 探花视频网站 | 日韩有码欧美 | 久久色亚洲 | 国产三级视频 | 久久精品亚洲精品国产欧美 | 99精品视频中文字幕 | 欧美疯狂性受xxxxx另类 | 日韩 在线a| av免费观看高清 | 在线看的毛片 | 日日操日日操 | 久久99亚洲网美利坚合众国 | 亚洲伊人婷婷 | 国产黄av | 中文字幕在线久一本久 | 久久精品小视频 | 四虎免费在线观看 | 亚洲一二三区精品 | 久久手机视频 | 国产伦理久久精品久久久久_ | 青草视频免费观看 | 在线国产福利 | 狠狠伊人 | 五月天婷婷在线观看视频 | 亚洲欧美在线综合 | 天天草天天爽 | 正在播放日韩 | 欧美久久久久久久 | 国产成人亚洲精品自产在线 | 精品99在线观看 | 国产91在线播放 | 97成人精品区在线播放 | 日韩免费电影在线观看 | 免费黄色网址网站 | 99福利片 | 国产视频欧美视频 | 不卡的一区二区三区 | 亚洲激情视频在线观看 | 久久久www成人免费精品 | 精品一区精品二区高清 | 国产黄在线播放 | 在线精品观看 | 精品国产乱码久久久久久1区二区 | 在线不卡中文字幕播放 | avav片 | 在线观看亚洲免费视频 | 草久久久久久久 | 国产精品乱看 | 国产精品九九热 | 精品一区二区在线播放 | 国产资源免费在线观看 | 人人插人人看 | 国产精品成人av在线 | 就色干综合 | 色婷婷国产精品 | 97视频免费在线看 | 久久久亚洲精华液 | 国产丝袜在线 | 日日操操 | www天天操 | 最近中文字幕mv免费高清在线 | 一区二区丝袜 | 97精产国品一二三产区在线 | 天天操天天操天天操 | 国产一区二区久久精品 | 午夜在线日韩 | 91丨porny丨九色 | 天天操天天射天天舔 | 久久在线视频在线 | 西西444www高清大胆 | 成人在线观看免费 | 亚洲成年人免费网站 | 成年人天堂com | 国产精品第一页在线 | 免费观看的av网站 | 99精品热视频只有精品10 | 天天操天天干天天玩 | 在线之家免费在线观看电影 | 一区二区三区国产精品 | 日韩在线观看网址 | 91chinesexxx| 国产精品久99 | 亚洲欧美激情插 | 国产在线观看午夜 | 在线91视频| 国产精品福利在线 | 中文字幕欲求不满 | 国产视频一区二区三区在线 | 久久久久久影视 | 国产成人久久精品亚洲 | 在线色亚洲 | 福利电影一区二区 | 成年人视频在线观看免费 | 中文字幕成人一区 | 全久久久久久久久久久电影 | 国内三级在线观看 | 国产精品www | 久草在线视频首页 | 国产一区二区在线观看免费 | 国产小视频精品 | 精品不卡av | 尤物九九久久国产精品的分类 | 国产美女精彩久久 | 久久成人一区 | 香蕉视频日本 | 精品国产成人av在线免 | 久久这里只有精品23 | 日韩系列在线观看 | 色偷偷88888欧美精品久久 | 免费日韩一区 | 伊人手机在线 | 久久99亚洲热视 | 狂野欧美激情性xxxx | 91豆麻精品91久久久久久 | 国产裸体视频网站 | 三级黄色免费片 | 国产亚洲亚洲 | 人人舔人人插 | 天天伊人网 | 国产一级视频 | 亚洲精品国产自产拍在线观看 | 日本午夜在线观看 | 亚洲国产成人精品在线观看 | 精品成人在线 | 久草在线久草在线2 | 久久精品99视频 | 国产一级a毛片视频爆浆 | 视频二区在线 | 97天堂| 99久久网站| 伊人久在线 | 麻豆视频成人 | 久久精品一区二区三区国产主播 | 在线观看av中文字幕 | 国产精品久久久一区二区 | 国产一级免费视频 | 欧美a视频 | av高清免费| 日日干天夜夜 | 久久久免费精品视频 | av三级av| 婷婷综合国产 | 国产视频一区在线播放 | 97国产 | 欧美日韩在线免费观看视频 | 成人久久综合 | 欧美五月婷婷 | 午夜视频在线观看一区二区三区 | 91精品国产自产老师啪 | 69亚洲精品 | 福利网址在线观看 | 久久色中文字幕 | 91干干干| 99视频精品视频高清免费 | 九九爱免费视频在线观看 | 免费在线视频一区二区 | 久久久久综合视频 | 日韩欧美在线观看一区二区三区 | 欧美性性网 | 久久伊人精品天天 | 久久蜜臀一区二区三区av | 探花在线观看 | av电影免费在线看 | 日本黄色大片免费看 | 久久成人麻豆午夜电影 | 成人国产精品 | 国产一区欧美在线 | 国产精品麻豆视频 | 三级性生活视频 | 在线中文字幕播放 | 国产日产欧美在线观看 | 中文字幕亚洲综合久久五月天色无吗'' | 五月激情在线 | 大荫蒂欧美视频另类xxxx | 激情大尺度视频 | 深爱婷婷久久综合 | 国产精品观看在线亚洲人成网 | 久亚洲精品 | 91成人免费看 | 久久五月天色综合 | 亚洲伦理一区二区 | 337p日本欧洲亚洲大胆裸体艺术 | 黄色a视频免费 | 99成人精品| 日韩激情网 | 蜜臀av夜夜澡人人爽人人桃色 | 亚洲黄色免费在线 | 黄色免费高清视频 | 夜夜操天天操 | 性色在线视频 | 亚州精品视频 | 少妇搡bbbb搡bbb搡忠贞 | 一级黄色毛片 | 久久久久久久久久久久久久av | 一区二区中文字幕在线 | 在线色网站 | 日韩小视频网站 | 婷婷网址 | 欧美日韩一区二区在线观看 | 中午字幕在线 | 国产精品毛片久久久久久久 | 9999国产| 日韩欧美一区二区不卡 | av黄色成人 | 精品99久久久久久 | 成人欧美日韩国产 | 久久久久日本精品一区二区三区 | 亚洲精品一区二区在线观看 | 九九精品毛片 | www国产在线 | 一区二区三区在线看 | www.99久久.com| 色偷偷97 | 高清一区二区 | 亚洲精区二区三区四区麻豆 | 国产精品久久久久久a | 精品久久精品久久 | 91成人精品一区在线播放69 | 日韩精品一区二区三区中文字幕 | 久久国产热视频 | 久久a级片 | 欧美中文字幕久久 | 久草视频在线新免费 | 91大神免费视频 | 色偷偷av男人天堂 | 99在线热播精品免费 | 亚州精品国产 | 五月婷婷丁香 | 婷婷色av | 欧美日韩精品在线免费观看 | 香蕉视频国产在线 | 激情偷乱人伦小说视频在线观看 | 国产日产精品一区二区三区四区 | 日韩在线播放欧美字幕 | 一级电影免费在线观看 | 国产高清免费视频 | 久久婷婷国产色一区二区三区 | 国产综合在线观看视频 | 超碰国产在线播放 | 国产色婷婷精品综合在线手机播放 | 欧美电影在线观看 | 久久黄色美女 | 国产小视频在线看 | 天天操天天操天天操天天操天天操天天操 | 伊人国产在线播放 | 99久久综合狠狠综合久久 | 久久久久国产一区二区三区 | 深爱激情久久 | 91av蜜桃 | 亚洲精品乱码久久久久久蜜桃不爽 | 美女视频久久久 | 国产精品久久久久久久久久免费看 | 国产精品久久久久久久久久久久久久 | 日韩免费福利 | 天天干天天射天天爽 | 国产视频久久久 | 玖玖精品在线 | 五月天国产精品 | 在线www色| 免费在线观看的av网站 | 在线观看免费成人av | 91精品国产成人观看 | 探花视频免费观看高清视频 | 91精品国产成人观看 | 欧美国产一区在线 | 91精品在线视频 | 久久久www | 久热超碰| 久久99精品国产麻豆婷婷 | 黄色av高清 | 在线视频日韩一区 | 久久怡红院| 亚洲国产精品成人综合 | 500部大龄熟乱视频 欧美日本三级 | 国产精品99蜜臀久久不卡二区 | 在线免费中文字幕 | 黄色免费大片 | 日日麻批40分钟视频免费观看 | 日韩精品 在线视频 | 99精品欧美一区二区蜜桃免费 | 亚洲资源在线观看 | 久草在线一免费新视频 | 日本99精品| 黄色福利网| 成人免费xyz网站 | 亚洲欧美在线观看视频 | 久色网| 成人av观看| 欧美精品一区二区三区一线天视频 | 亚洲国产精品电影 | 丁香婷婷综合激情五月色 | 99热精品免费观看 | 国产精品成人久久久久久久 | 日韩精品免费在线播放 | 成人在线网站观看 | 成人免费观看大片 | 久久精品屋 | 中文字幕区 | 成年人免费av网站 | 久久综合久久综合这里只有精品 | 成人h在线观看 | 中文字幕色在线视频 | 日韩高清国产精品 | 伊人天天综合 | 99久久精品免费视频 | 欧美另类交人妖 | 久久a v电影 | 天天操天天色天天 | 国产精品免费人成网站 | 国产精品video爽爽爽爽 | 成人精品福利 | 99热9| 日韩av中文字幕在线免费观看 | 不卡av免费在线观看 | 日日夜夜精品视频天天综合网 | 国内揄拍国内精品 | 国产亚洲精品久久19p | 中文字幕在线有码 | 国产一级在线观看 | 欧美另类xxxx | 国产在线播放一区二区 | 国产精品亚洲精品 | 91传媒视频在线观看 | 亚洲一片黄 | 又色又爽又激情的59视频 | 欧美成人在线网站 | 欧美色伊人| 久久艹人人 | 色婷婷av一区 | av福利超碰网站 | 99久久精品无免国产免费 | 国产成本人视频在线观看 | 国产一级黄色电影 | 91久久爱热色涩涩 | 国产黄色精品在线 | 欧美在线视频第一页 | 少妇bbbb | 亚洲成人国产 | 91九色在线播放 | 999久久久精品视频 日韩高清www | 精品视频免费在线 | 免费福利小视频 | 亚洲精品成人av在线 | 国产午夜一级毛片 | 欧美精品亚州精品 | 西西4444www大胆无视频 | 国产伦精品一区二区三区照片91 | 日韩色在线 | 伊人亚洲精品 | 在线国产片| 日韩精品久久久久久久电影99爱 | 99久久毛片 | 91成人蝌蚪 | 成人资源在线观看 | 国产小视频在线观看 | 成人欧美日韩国产 | 日日夜夜免费精品视频 | 久久免费国产视频 | 亚洲影视九九影院在线观看 | 开心综合网 | 日韩在线观看你懂的 | 成人va在线观看 | 国产在线黄 | 欧美日韩不卡一区二区三区 | 久久伦理网 | 成人免费在线播放 | 日韩精品一区二区三区外面 | 三级黄色片在线观看 | 手机在线日韩视频 | 免费在线观看91 | 在线观看成人毛片 | 国产高清精品在线观看 | 香蕉视频91 | 国产字幕在线看 | 狠狠操精品 | 国产精品1区2区在线观看 | 久久免费看毛片 | 日韩精品久久久久久 | 91传媒免费观看 | 亚洲 中文字幕av | 九九热国产视频 | 久久撸在线视频 | 久草爱视频| 日韩黄色一区 | 亚洲黄污| 免费观看午夜视频 | 99精品热 | 亚洲免费专区 | av不卡免费在线观看 | 欧美精品久久久久久久亚洲调教 | 成人午夜精品 | 国产又粗又硬又长又爽的视频 | 97国产精品一区二区 | 国产一区二区久久久久 | 在线激情小视频 | 久久精品亚洲国产 | 亚洲午夜精品久久久久久久久久久久 | 91理论电影| 久久久99精品免费观看app | 99久久精品国产毛片 | 在线91视频 | 久久国产欧美日韩精品 | www黄色大片| 久久午夜免费观看 | 亚洲最快最全在线视频 | 久草精品电影 | 国产精品成人av久久 | 五月婷婷色综合 | a在线观看免费视频 | 麻豆传媒在线免费看 | 中文字幕一区二区三区四区视频 | 韩国三级av在线 | 日韩在线视频一区 | 亚洲精品一区二区久 | 狠狠色丁香久久婷婷综合五月 | 综合色婷婷 | 欧美日韩一区二区视频在线观看 | 中文字幕av一区二区三区四区 | 久久久久一区 | 国产精品久久影院 | 日本黄区免费视频观看 | 国产精品欧美久久久久天天影视 | 久久精品三 | 中文字幕色综合网 | 日日干天夜夜 | 69国产精品成人在线播放 | 亚洲免费av网站 | 亚洲区色| 美女网站视频免费都是黄 | 一区中文字幕电影 | 天堂av在线免费 | 丝袜制服天堂 | 亚洲精品tv久久久久久久久久 | 99久热在线精品视频观看 | 久久久久久久亚洲精品 | 97日日碰人人模人人澡分享吧 | 精品网站999www| 久久精品男人的天堂 | 国产成人精品电影久久久 | 免费一级日韩欧美性大片 | 99精品在线看 | 欧美人zozo | 亚洲麻豆精品 | 欧美激情精品久久久久久变态 | 色综合久久99 | 天天曰 | 丁香花中文字幕 | 国产精品视频资源 | 国产在线视频一区二区 | 国产精品一区二区三区四 | 久久久久久草 | 狠狠干夜夜操 | 国产成人一区二区三区电影 | 国产免费三级在线观看 | 在线免费观看一区二区三区 | 九九导航| 亚洲一区免费在线 | 国产精品一区二区62 | 99在线精品视频在线观看 | 国产特级毛片aaaaaa毛片 | 亚洲第一区在线播放 | 伊人开心激情 | 91视频91色 | 黄色的网站免费看 | 成人久久免费视频 | 国产乱码精品一区二区蜜臀 | 98超碰人人 | 国产成人精品一区二三区 | 国产日韩在线一区 | 五月婷婷中文网 | 91porny九色91啦中文 | 亚洲免费av网站 | 日本美女xx | 国产一级视频免费看 | 国内精品在线看 | 四虎影视精品 | 免费观看成年人视频 | 亚洲日本一区二区在线 | 中文字幕国产一区二区 | 免费在线色电影 | 国产伦精品一区二区三区照片91 | 国内精品视频在线播放 | 中文字幕有码在线播放 | 日韩欧美极品 | 亚洲区色 | 国产高清精| 在线观看日韩免费视频 | 久久国产高清 | 国产精品不卡在线观看 | 中文字幕日韩电影 | 在线观看av麻豆 | 啪嗒啪嗒免费观看完整版 | 日韩精品免费专区 | av一区二区三区在线观看 | 成人免费观看视频网站 | 久久99亚洲网美利坚合众国 | 久久精品一区二区三区中文字幕 | 欧美成人中文字幕 | 国产成人久久精品77777 | 国产精品123 | 人人玩人人添人人澡97 | 狠狠操操操 | 一本一本久久a久久精品综合 | 欧美日韩裸体免费视频 | 超碰在97 | 亚洲视屏一区 | 天天夜夜操 | 国产视频亚洲精品 | 国产黄av | 国产成人精品国内自产拍免费看 | 午夜精品久久久久久久99婷婷 | 欧美激情综合五月色丁香 | 中文字幕日韩国产 | 久久国产日韩 | 亚洲人成综合 | 九九九九九九精品任你躁 | 天天天天天天天操 | 亚洲精品久久久久久中文传媒 | 狠狠色狠狠色综合系列 | 黄色三级网站在线观看 | 99久久精品无码一区二区毛片 | 久久综合精品国产一区二区三区 | 国产中文在线字幕 | 天天做日日爱夜夜爽 | 免费国产黄线在线观看视频 | 日韩久久午夜一级啪啪 | 欧美乱码精品一区 | 91香蕉视频污在线 | 国产不卡av在线 | 成年人免费观看国产 | 国产精品午夜在线 | 国产成人免费观看 | 久久a v视频 | 久久 国产一区 | 欧美日韩性生活 | 亚洲精品国 | 一级片观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 人人干人人做 | 日韩在线播放视频 | zzijzzij亚洲成熟少妇 | 国偷自产中文字幕亚洲手机在线 | 天天艹天天 | 91大神精品视频在线观看 | 精品少妇一区二区三区在线 | 久久激情精品 | 午夜黄色大片 | 全黄网站| 婷婷丁香激情综合 | 国产福利一区二区在线 | 国产精品18久久久久久久久 | 国语精品免费视频 | 久久亚洲福利 | 色综合久久综合中文综合网 | 91人人爽人人爽人人精88v | 亚洲欧美国产日韩在线观看 | 91色国产在线 | 亚洲精品乱码久久久久v最新版 | 亚洲一二区视频 | 成人免费观看网站 | 中文字幕国产视频 | 狠狠狠色丁香综合久久天下网 | 天无日天天操天天干 | 一区二区精品国产 | 国产精品久久久久久久久软件 | 极品中文字幕 | 丁香婷婷激情网 | 免费看一级黄色大全 | 国产中文字幕视频在线观看 | 色综合五月 | 在线观看亚洲精品 | 欧美精品久久久久a | 久久情爱 | 国产成人av网 | 在线观看精品 | 久久久久国产精品视频 | 久久都是精品 | 亚洲欧洲精品一区二区精品久久久 | 久久免费国产视频 |