久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Linux網(wǎng)絡(luò)編程入門:從Socket與TCP/IP分層到三次握手實(shí)戰(zhàn)

Linux網(wǎng)絡(luò)編程入門:從Socket與TCP/IP分層到三次握手實(shí)戰(zhàn) 第一次在Linux上寫網(wǎng)絡(luò)程序很多人第一反應(yīng)是翻man文檔查socket的用法我也不例外。但真正讓我從“會(huì)調(diào)用API”變成“理解網(wǎng)絡(luò)”的反而不是那幾個(gè)函數(shù)簽名而是把腦子里那臺(tái)“獨(dú)立主機(jī)”的模型拆掉換成一張協(xié)議協(xié)作的地圖。這篇是Linux網(wǎng)絡(luò)編程系列的第一篇目標(biāo)是帶你完成這個(gè)思維轉(zhuǎn)換從單機(jī)進(jìn)程通信的視角切換到多主機(jī)協(xié)議協(xié)作的視角把IP、端口、Socket、TCP/IP分層這些概念串成一條線最后親手跑通一個(gè)最小的TCP程序并用tcpdump親眼看到三次握手。不管是還沒(méi)寫過(guò)網(wǎng)絡(luò)代碼的新手還是寫過(guò)一點(diǎn)但總被奇怪問(wèn)題卡住的人這篇都適用。1. 先從單機(jī)思維切換到網(wǎng)絡(luò)思維1.1 單機(jī)世界的通信方式以及它們的邊界Linux里進(jìn)程與進(jìn)程之間怎么通信管道、消息隊(duì)列、共享內(nèi)存、信號(hào)、本地套接字這些都是經(jīng)典機(jī)制。管道就像一條水管一端寫進(jìn)去另一端讀出來(lái)共享內(nèi)存更像是把一張紙貼在墻上多個(gè)進(jìn)程都能看。這些機(jī)制用起來(lái)都很順手但有一個(gè)共同的邊界條件它們都只能在同一臺(tái)主機(jī)上工作。為什么因?yàn)楣艿馈⑾㈥?duì)列、共享內(nèi)存本質(zhì)上依賴內(nèi)核中的公共資源比如一個(gè)文件描述符、一段共享內(nèi)存區(qū)域。兩個(gè)進(jìn)程哪怕隔著一堵墻只要在同一臺(tái)Linux系統(tǒng)上就能通過(guò)內(nèi)核搭橋。但如果進(jìn)程A在筆記本上進(jìn)程B在千里之外的服務(wù)器上內(nèi)核不是同一個(gè)內(nèi)存不是同一片管道和共享內(nèi)存立刻失效。網(wǎng)絡(luò)編程要解決的就是這個(gè)跨主機(jī)的問(wèn)題。要讓兩個(gè)運(yùn)行在不同機(jī)器上的進(jìn)程像在同一臺(tái)機(jī)器上一樣交換數(shù)據(jù)我們必須設(shè)計(jì)一套機(jī)制怎么找到對(duì)方尋址、怎么把數(shù)據(jù)安全送到傳輸控制、中間經(jīng)過(guò)哪些設(shè)備路由、數(shù)據(jù)壞了怎么辦差錯(cuò)檢測(cè)。這一整套機(jī)制疊加起來(lái)就是我們常說(shuō)的“協(xié)議?!?。所以學(xué)網(wǎng)絡(luò)編程本質(zhì)上學(xué)的不是某個(gè)API而是這套跨主機(jī)通信的規(guī)則體系。1.2 通信的前提是“約定”協(xié)議就是這套約定想象一下兩個(gè)人打電話。撥號(hào)之前雙方其實(shí)默認(rèn)遵守了一整套流程主叫方先撥號(hào)被叫方聽到鈴聲后接聽然后一方說(shuō)“喂”另一方回應(yīng)雙方確認(rèn)能聽到聲音后才開始講正事。這套流程看起來(lái)稀松平常但它保證了通信的雙方在同一時(shí)間、同一頻率、同一語(yǔ)言體系下工作。如果沒(méi)有這套約定一方用手機(jī)、一方用對(duì)講機(jī)或者一方說(shuō)中文、一方說(shuō)德語(yǔ)這個(gè)電話根本打不成。網(wǎng)絡(luò)協(xié)議也一樣它就是通信雙方事先約定好的規(guī)則。專業(yè)一點(diǎn)說(shuō)協(xié)議包含三要素語(yǔ)法規(guī)定數(shù)據(jù)怎么組織比如字段順序、格式語(yǔ)義規(guī)定每個(gè)字段代表什么含義比如某個(gè)標(biāo)志位為1表示數(shù)據(jù)結(jié)束時(shí)序規(guī)定事件發(fā)生的順序比如先建立連接再傳數(shù)據(jù)傳完數(shù)據(jù)再斷開。舉個(gè)例子一個(gè)最簡(jiǎn)單的HTTP GET請(qǐng)求報(bào)文長(zhǎng)這樣GET /index.html HTTP/1.1\r\n Host: www.example.com\r\n \r\n這串文本就是一個(gè)應(yīng)用層協(xié)議的具體體現(xiàn)。GET是方法/index.html是路徑HTTP/1.1是版本號(hào)\r\n是行結(jié)束符。服務(wù)器看到這串文本就能明白客戶端想要什么并按照同樣的規(guī)則返回響應(yīng)。你可能會(huì)問(wèn)為什么是GET而不是拿因?yàn)閰f(xié)議必須是雙方都懂的語(yǔ)言它不依賴人的自然語(yǔ)言而是依賴文檔規(guī)范?;ヂ?lián)網(wǎng)上大量協(xié)議的標(biāo)準(zhǔn)定義在RFC文檔里任何人都能查閱和實(shí)現(xiàn)。所以請(qǐng)記住這句話網(wǎng)絡(luò)編程的核心是把你對(duì)“通信過(guò)程的想象”變成雙方都能理解的協(xié)議。代碼只是協(xié)議的載體API只是敲門磚。2. 分層模型協(xié)議世界的地基2.1 為什么協(xié)議非得分層不能一個(gè)大包如果從頭設(shè)計(jì)一套跨主機(jī)通信方案你會(huì)發(fā)現(xiàn)要處理的問(wèn)題實(shí)在太多。要尋址要路由要保證數(shù)據(jù)不丟要處理亂序要流控還要區(qū)分不同應(yīng)用。把所有邏輯塞進(jìn)一個(gè)協(xié)議結(jié)果就是一個(gè)巨型怪物任何一個(gè)環(huán)節(jié)要升級(jí)整個(gè)協(xié)議都得推翻任何一個(gè)地方出錯(cuò)排查范圍就是海量的。分層是解決這種復(fù)雜度的經(jīng)典手段。你可以把整個(gè)通信過(guò)程按職責(zé)拆成幾個(gè)相對(duì)獨(dú)立的層每一層只干一件明確的事層與層之間通過(guò)標(biāo)準(zhǔn)接口對(duì)接。生活中最典型的就是快遞系統(tǒng)。商家不關(guān)心快遞員怎么運(yùn)輸快遞員不關(guān)心包裹里裝的是什么倉(cāng)庫(kù)工人只負(fù)責(zé)分揀和貼單。每一層的職責(zé)都足夠單純也可以獨(dú)立更換——比如商家換了包裝盒快遞公司完全不需要知道。網(wǎng)絡(luò)協(xié)議棧的設(shè)計(jì)思路正是這樣。通過(guò)分層每一層可以獨(dú)立演化物理層從以太網(wǎng)換成WiFi、從銅線換成光纖應(yīng)用層的HTTP和SSH完全感知不到變化。排錯(cuò)也因此有了明確方向鏈路層的問(wèn)題查MAC地址和交換機(jī)網(wǎng)絡(luò)層的問(wèn)題查IP和路由傳輸層的問(wèn)題查端口和連接狀態(tài)應(yīng)用層的問(wèn)題查報(bào)文格式和業(yè)務(wù)邏輯。2.2 先記TCP/IP四層暫緩OSI七層很多初學(xué)者一上來(lái)就被“OSI七層模型”勸退。但現(xiàn)實(shí)中真正落地的是TCP/IP協(xié)議族它的分層方式和OSI并不完全一致。與其死記七層的抽象概念不如先建立TCP/IP四層模型這張圖分層核心職責(zé)代表協(xié)議尋址方式應(yīng)用層為具體應(yīng)用提供數(shù)據(jù)語(yǔ)義HTTP、FTP、SSH、DNS無(wú)固定尋址靠協(xié)議內(nèi)部字段傳輸層端到端的可靠傳輸區(qū)分具體應(yīng)用TCP、UDP端口號(hào)網(wǎng)絡(luò)層跨網(wǎng)絡(luò)的主機(jī)尋址與路由IP、ICMPIP地址鏈路層物理網(wǎng)絡(luò)內(nèi)的幀傳輸以太網(wǎng)、WiFi、VLANMAC地址你只需要先記住這個(gè)四層模型就夠了。應(yīng)用層處理“數(shù)據(jù)是什么”傳輸層處理“數(shù)據(jù)交給哪個(gè)進(jìn)程”網(wǎng)絡(luò)層處理“數(shù)據(jù)去哪臺(tái)機(jī)器”鏈路層處理“數(shù)據(jù)怎么在網(wǎng)線上跑”。OSI七層里的會(huì)話層、表示層在實(shí)際的TCP/IP體系里基本被合并進(jìn)應(yīng)用層初學(xué)階段暫時(shí)搞不清楚沒(méi)關(guān)系等以后分析具體協(xié)議時(shí)再回頭看也不遲。有個(gè)細(xì)節(jié)值得留意鏈路層的以太網(wǎng)幀里有一個(gè)VLAN標(biāo)簽字段802.1Q用來(lái)標(biāo)記幀屬于哪個(gè)虛擬局域網(wǎng)。如果你在公司網(wǎng)絡(luò)里抓包看到vlan 100之類的信息這就是鏈路層在干活跟我們常說(shuō)的IP地址不在同一個(gè)層面。2.3 從發(fā)送到接收數(shù)據(jù)包的封裝與解封裝分層模型在數(shù)據(jù)流動(dòng)中體現(xiàn)得最直觀。假設(shè)你在瀏覽器里敲下http://www.example.com并回車數(shù)據(jù)是這樣從上往下走的應(yīng)用層把HTTP請(qǐng)求報(bào)文交給傳輸層傳輸層的TCP在報(bào)文前面加上一個(gè)TCP頭這個(gè)頭里最關(guān)鍵的是源端口和目的端口比如源端口隨機(jī)分配一個(gè)49152目的端口是80。接著網(wǎng)絡(luò)層的IP在TCP頭前面再加一個(gè)IP頭里面寫入源IP和目的IP。最后鏈路層把整個(gè)IP數(shù)據(jù)報(bào)再包成以太網(wǎng)幀加上目標(biāo)MAC地址、源MAC地址和幀尾的校驗(yàn)序列然后把這一串比特通過(guò)網(wǎng)線或WiFi發(fā)出去。接收方收到數(shù)據(jù)后做相反的操作。鏈路層收幀、校驗(yàn)、去掉幀頭幀尾把IP數(shù)據(jù)報(bào)交給網(wǎng)絡(luò)層網(wǎng)絡(luò)層解析IP頭看到目的IP是本機(jī)就把TCP段上交傳輸層傳輸層檢查端口號(hào)發(fā)現(xiàn)是80再把數(shù)據(jù)交給監(jiān)聽80端口的進(jìn)程。這個(gè)過(guò)程叫解封裝。這里有個(gè)核心觀點(diǎn)每一層只關(guān)心自己的頭部信息不解析上層的內(nèi)容。就好比快遞員只認(rèn)面單上的收件地址絕不拆開包裹看你買的是什么東西。這個(gè)“越界”概念特別重要以后你用tcpdump抓包看到一幀數(shù)據(jù)里包含以太網(wǎng)頭、IP頭、TCP頭、應(yīng)用數(shù)據(jù)四層嵌套就會(huì)瞬間理解封裝與解封裝在物理世界里的樣子。3. IP、端口與Socket網(wǎng)絡(luò)編程的三塊基石3.1 IP地址找到那臺(tái)主機(jī)IP地址是網(wǎng)絡(luò)層尋址的核心它回答的問(wèn)題是“數(shù)據(jù)該發(fā)給哪臺(tái)主機(jī)”。類比生活里IP地址就是門牌號(hào)。IPv4地址是一個(gè)32位二進(jìn)制數(shù)習(xí)慣上寫成四個(gè)十進(jìn)制數(shù)比如192.168.1.100。一個(gè)局域網(wǎng)里的每臺(tái)設(shè)備都要有自己的IP地址否則交換機(jī)不知道數(shù)據(jù)幀該往哪個(gè)口送。在這個(gè)基礎(chǔ)上還有幾個(gè)概念要認(rèn)清。第一個(gè)是回環(huán)地址127.0.0.1它代表“本機(jī)自己”不管有沒(méi)有網(wǎng)卡它都能通。開發(fā)調(diào)試時(shí)用127.0.0.1最方便因?yàn)閿?shù)據(jù)不會(huì)真的跑到物理網(wǎng)絡(luò)上純粹在內(nèi)核里轉(zhuǎn)一圈就回來(lái)了。第二個(gè)是私網(wǎng)地址常見的有10.x.x.x、172.16.x.x到172.31.x.x、192.168.x.x。私網(wǎng)地址只能在內(nèi)網(wǎng)使用不能直接上公網(wǎng)。家用路由器給手機(jī)、電腦分配的通常都是192.168.x.x這類地址設(shè)備要訪問(wèn)互聯(lián)網(wǎng)路由器會(huì)做NAT網(wǎng)絡(luò)地址轉(zhuǎn)換把私網(wǎng)地址映射成公網(wǎng)地址。IPv4的總地址數(shù)約43億在全球互聯(lián)網(wǎng)面前早就捉襟見肘所以有了IPv6用128位地址徹底解決了數(shù)量問(wèn)題。寫網(wǎng)絡(luò)程序時(shí)函數(shù)要優(yōu)先考慮同時(shí)支持IPv4和IPv6比如用getaddrinfo而不是老舊的gethostbyname。不過(guò)初學(xué)階段先在IPv4上跑通再去接觸IPv6會(huì)更容易上手。3.2 端口號(hào)找到那個(gè)進(jìn)程有了IP地址你可以找到一臺(tái)主機(jī)但主機(jī)上同時(shí)跑著幾十上百個(gè)進(jìn)程。你連上服務(wù)器到底是要把數(shù)據(jù)交給Web服務(wù)器、SSH服務(wù)還是數(shù)據(jù)庫(kù)這就輪到端口號(hào)登場(chǎng)。端口號(hào)是傳輸層用16位二進(jìn)制數(shù)標(biāo)識(shí)的范圍從0到65535它回答的問(wèn)題是“數(shù)據(jù)該交給這臺(tái)機(jī)器上的哪個(gè)進(jìn)程”。常見端口要記幾個(gè)22是SSH80是HTTP443是HTTPS3306是MySQL6379是Redis。0到1023范圍通常需要管理員權(quán)限才能監(jiān)聽1024到49151是可以自由使用的注冊(cè)端口49152到65535一般用于動(dòng)態(tài)分配??蛻舳税l(fā)起連接時(shí)系統(tǒng)會(huì)自動(dòng)分配一個(gè)臨時(shí)端口作為源端口服務(wù)端收到的報(bào)文里源IP和源端口就是客戶端的身份標(biāo)識(shí)。一臺(tái)服務(wù)器可以同時(shí)監(jiān)聽多個(gè)端口比如同一臺(tái)機(jī)器上開著Nginx80、MySQL3306、Redis6379。而一個(gè)端口同一時(shí)刻只能被一個(gè)監(jiān)聽套接字占用這是新手一定會(huì)踩的坑后面專門講。識(shí)別一條連接需要五個(gè)要素源IP、源端口、目的IP、目的端口、協(xié)議類型TCP還是UDP網(wǎng)絡(luò)領(lǐng)域管這叫五元組。3.3 Socket用戶程序與內(nèi)核協(xié)議棧之間的門說(shuō)完IP和端口終于來(lái)到Linux網(wǎng)絡(luò)編程的核心對(duì)象Socket。Socket可以理解成“應(yīng)用程序訪問(wèn)網(wǎng)絡(luò)協(xié)議棧的大門”。你寫的程序是用戶態(tài)進(jìn)程協(xié)議棧是內(nèi)核的一部分兩者之間靠Socket這座橋連接。創(chuàng)建Socket后內(nèi)核會(huì)在協(xié)議棧里幫你分配一套收發(fā)緩沖區(qū)、狀態(tài)標(biāo)記和隊(duì)列并返回一個(gè)文件描述符給你。這里要強(qiáng)調(diào)一個(gè)容易混淆的點(diǎn)Socket不是協(xié)議它是API是操作系統(tǒng)暴露給用戶的網(wǎng)絡(luò)入口。你通過(guò)這個(gè)入口調(diào)用內(nèi)核的協(xié)議棧能力。Linux里一切皆文件Socket也不例外的體現(xiàn)為文件描述符所以你能用read、write來(lái)收發(fā)數(shù)據(jù)也能用close來(lái)關(guān)閉連接。創(chuàng)建Socket時(shí)最典型的三類參數(shù)地址族類型說(shuō)明AF_INETSOCK_STREAM基于IPv4的TCP流式套接字AF_INETSOCK_DGRAM基于IPv4的UDP數(shù)據(jù)報(bào)套接字AF_UNIXSOCK_STREAM本機(jī)進(jìn)程間通信的本地套接字TCP用流式Socket因?yàn)門CP天然是字節(jié)流有連接、可靠、按序UDP用數(shù)據(jù)報(bào)Socket每個(gè)報(bào)文獨(dú)立沒(méi)有連接概念適合音視頻等允許少量丟失的場(chǎng)景。初學(xué)階段把TCP的Socket流程跑熟再回頭看UDP會(huì)輕松很多。記住這句話Socket是門IP是門牌端口是門后面的房間號(hào)協(xié)議棧是整棟大樓。4. 寫代碼前先練手用Linux命令觸摸協(xié)議4.1 ss與netstat看一眼當(dāng)前連接狀態(tài)不少人的第一反應(yīng)是上來(lái)寫代碼但我建議先學(xué)會(huì)用命令觀察網(wǎng)絡(luò)狀態(tài)。Linux系統(tǒng)里最常用的連接查看命令是ss舊一點(diǎn)的系統(tǒng)用netstat。運(yùn)行下面的命令ss -tan-t只看TCP-a看所有狀態(tài)的連接-n跳過(guò)域名解析直接顯示IP和端口。輸出大致長(zhǎng)這樣State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* ESTAB 0 0 192.168.1.100:22 192.168.1.50:52314 TIME_WAIT 0 0 192.168.1.100:22 192.168.1.80:50112這些狀態(tài)詞就是TCP協(xié)議的狀態(tài)機(jī)LISTEN表示這個(gè)端口正在被某個(gè)進(jìn)程監(jiān)聽等待客戶端連接ESTABESTABLISHED表示一條TCP連接已經(jīng)建立雙方可以收發(fā)數(shù)據(jù)TIME_WAIT表示主動(dòng)關(guān)閉連接的一方在等待一段時(shí)間確保遲到的報(bào)文在網(wǎng)絡(luò)中消亡后才能徹底釋放端口。初學(xué)者看到一堆TIME_WAIT別慌這是正常現(xiàn)象系統(tǒng)會(huì)在大約60秒后回收這些連接。如果你想知道某個(gè)端口被誰(shuí)占用了用這個(gè)組合sudo ss -tlnp | grep 8080-p參數(shù)能顯示占用端口的進(jìn)程PID和名字。排查“端口被占用”這類問(wèn)題時(shí)這條命令比翻代碼管用得多。我見過(guò)太多次新手以為bind失敗是代碼寫錯(cuò)了其實(shí)完全是上一個(gè)進(jìn)程沒(méi)退干凈。4.2 tcpdump抓到真正的報(bào)文看看理論知識(shí)說(shuō)得再多都不如親眼看一次數(shù)據(jù)包來(lái)得通透。tcpdump是Linux下最經(jīng)典的抓包工具它把經(jīng)過(guò)網(wǎng)卡的真實(shí)報(bào)文打印出來(lái)。抓TCP連接的過(guò)程比如我們后面要跑的服務(wù)器監(jiān)聽8888端口可以這么抓sudo tcpdump -i any -nn tcp port 8888-i any抓所有網(wǎng)卡-nn不解析域名和端口名tcp port 8888只抓TCP協(xié)議且端口匹配8888的包。運(yùn)行后發(fā)起一次連接你會(huì)看到類似這樣的輸出14:23:01.111111 IP 127.0.0.1.50000 127.0.0.1.8888: Flags [S], seq 1000 14:23:01.111222 IP 127.0.0.1.8888 127.0.0.1.50000: Flags [S.], seq 2000, ack 1001 14:23:01.111333 IP 127.0.0.1.50000 127.0.0.1.8888: Flags [.], ack 2001Flags [S]是SYN報(bào)文表示“我想建立連接”[S.]是SYNACK表示“同意你的連接請(qǐng)求”[.]是純ACK表示“收到你的確認(rèn)”。這三個(gè)包就是TCP三次握手的完整流程。第一次抓包看不懂沒(méi)關(guān)系先混個(gè)眼熟知道協(xié)議真的是以這么直白的形式在網(wǎng)上跑就比很多只寫CRUD的開發(fā)者高一個(gè)level了。抓包也可以保存成文件交給Wireshark做可視化分析sudo tcpdump -i any -w /tmp/capture.pcap tcp port 88884.3 ping與traceroute驗(yàn)證連通性和路由路徑再介紹兩個(gè)網(wǎng)絡(luò)層工具。ping用來(lái)驗(yàn)證目標(biāo)主機(jī)通不通原理是發(fā)送ICMP回顯請(qǐng)求ping -c 4 www.example.com輸出會(huì)顯示每個(gè)ICMP報(bào)文的往返時(shí)間RTT和TTL。RTT大說(shuō)明網(wǎng)絡(luò)鏈路慢TTL值則能間接看出經(jīng)過(guò)了多少跳路由器。如果你剛配置完Linux網(wǎng)絡(luò)環(huán)境第一件事就應(yīng)該是ping一下網(wǎng)關(guān)確認(rèn)本機(jī)不在“孤立島”上。traceroute更進(jìn)一步它打印出數(shù)據(jù)包從本地到目標(biāo)主機(jī)經(jīng)過(guò)的每一跳路由器地址traceroute www.example.com這個(gè)工具的原理是利用IP頭里的TTL字段第一次發(fā)一個(gè)TTL為1的報(bào)文第一跳路由器收到后發(fā)現(xiàn)TTL過(guò)期返回一個(gè)ICMP超時(shí)報(bào)文于是客戶端就知道第一跳是誰(shuí)然后TTL加1依次探測(cè)第二跳、第三跳。每次上網(wǎng)卡頓我用ping判斷是不是鏈路問(wèn)題用traceroute定位卡在哪一跳順序清晰效率也高。5. 實(shí)戰(zhàn)寫一個(gè)最小的TCP回聲服務(wù)5.1 環(huán)境準(zhǔn)備與整體思路接下來(lái)的例子需要一臺(tái)Linux環(huán)境以及gcc編譯器。如果沒(méi)有最簡(jiǎn)單的辦法是裝個(gè)虛擬機(jī)或者在Windows上啟用WSL。注意虛擬機(jī)默認(rèn)使用NAT網(wǎng)絡(luò)模式外部機(jī)器不能直接訪問(wèn)虛擬機(jī)的某個(gè)端口這會(huì)影響到后面聯(lián)調(diào)具體在第6章展開。這個(gè)demo的目標(biāo)極簡(jiǎn)一個(gè)服務(wù)端監(jiān)聽8888端口接受一個(gè)客戶端連接客戶端連上后發(fā)送一串字符串服務(wù)端收到后原樣返回。它不處理并發(fā)、不做協(xié)議解析、不考慮性能就是一個(gè)能跑通的最小閉環(huán)讓你在動(dòng)手層面感受完整流程socket、bind、listen、accept、connect、read、write、close。這不僅僅是“跑通就完事”整個(gè)過(guò)程中的每個(gè)系統(tǒng)調(diào)用都會(huì)讓你確認(rèn)前面講的分層模型和協(xié)議狀態(tài)是真實(shí)存在的。5.2 服務(wù)端socket、bind、listen、accept四件套下面是最簡(jiǎn)單的TCP服務(wù)端代碼保存為server.c#include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #define PORT 8888 #define BACKLOG 5 int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len sizeof(client_addr); char buffer[1024]; // 1. 創(chuàng)建TCP套接字 server_fd socket(AF_INET, SOCK_STREAM, 0); if (server_fd 0) { perror(socket); exit(EXIT_FAILURE); } // 2. 允許地址復(fù)用避免TIME_WAIT導(dǎo)致bind失敗 int opt 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt)); // 3. 綁定IP和端口 memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr htonl(INADDR_ANY); server_addr.sin_port htons(PORT); if (bind(server_fd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) { perror(bind); exit(EXIT_FAILURE); } // 4. 開始監(jiān)聽 if (listen(server_fd, BACKLOG) 0) { perror(listen); exit(EXIT_FAILURE); } printf(server listening on port %d\n, PORT); // 5. 接受客戶端連接此處阻塞 client_fd accept(server_fd, (struct sockaddr *)client_addr, addr_len); if (client_fd 0) { perror(accept); exit(EXIT_FAILURE); } char *client_ip inet_ntoa(client_addr.sin_addr); printf(client connected: %s:%d\n, client_ip, ntohs(client_addr.sin_port)); // 6. 接收數(shù)據(jù)原樣返回 ssize_t len read(client_fd, buffer, sizeof(buffer) - 1); if (len 0) { buffer[len] \0; printf(received: %s\n, buffer); const char *msg hello from server; write(client_fd, msg, strlen(msg)); } close(client_fd); close(server_fd); return 0; }逐行看幾個(gè)關(guān)鍵點(diǎn)。socket(AF_INET, SOCK_STREAM, 0)創(chuàng)建的是IPv4的TCP套接字。AF_INET是地址族SOCK_STREAM表示流式傳輸0讓內(nèi)核自動(dòng)選TCP協(xié)議。bind負(fù)責(zé)把套接字綁定到一個(gè)具體的IP和端口上。為什么需要htons(PORT)因?yàn)槎丝谔?hào)在網(wǎng)絡(luò)傳輸中要用大端字節(jié)序而x86等小端機(jī)器內(nèi)部是小端htons把主機(jī)字節(jié)序轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)序。同樣htonl(INADDR_ANY)是因?yàn)镮NADDR_ANY表示“綁定本機(jī)所有可用IP”也需要轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)序。listen(server_fd, BACKLOG)讓套接字進(jìn)入監(jiān)聽狀態(tài)BACKLOG是未完成連接隊(duì)列的最大長(zhǎng)度。accept是阻塞調(diào)用沒(méi)有客戶端連上來(lái)時(shí)進(jìn)程停在這里不動(dòng)有連接到達(dá)后它返回一個(gè)新的套接字文件描述符client_fd這個(gè)新文件描述符才代表“當(dāng)前這個(gè)客戶端連接”原來(lái)的server_fd繼續(xù)作為監(jiān)聽者等待下一撥連接。這里很容易誤解不是accept返回的fd和監(jiān)聽fd同一個(gè)網(wǎng)絡(luò)程序里一個(gè)fd對(duì)應(yīng)一條連接連接結(jié)束fd就釋放。5.3 客戶端socket、connect、讀寫客戶端的代碼更短一些保存為client.c#include stdio.h #include stdlib.h #include string.h #include unistd.h #include arpa/inet.h #define PORT 8888 int main(int argc, char *argv[]) { if (argc ! 2) { printf(usage: %s server_ip\n, argv[0]); exit(EXIT_FAILURE); } int sock_fd; struct sockaddr_in server_addr; char buffer[1024]; // 1. 創(chuàng)建TCP套接字 sock_fd socket(AF_INET, SOCK_STREAM, 0); if (sock_fd 0) { perror(socket); exit(EXIT_FAILURE); } // 2. 設(shè)置服務(wù)器地址 memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_port htons(PORT); // 3. 把點(diǎn)分十進(jìn)制IP轉(zhuǎn)成二進(jìn)制 if (inet_pton(AF_INET, argv[1], server_addr.sin_addr) 0) { perror(inet_pton); exit(EXIT_FAILURE); } // 4. 發(fā)起連接內(nèi)核幫你完成三次握手 if (connect(sock_fd, (struct sockaddr *)server_addr, sizeof(server_addr)) 0) { perror(connect); exit(EXIT_FAILURE); } // 5. 發(fā)送數(shù)據(jù) const char *msg hello from client; write(sock_fd, msg, strlen(msg)); // 6. 讀取服務(wù)器返回的數(shù)據(jù) ssize_t len read(sock_fd, buffer, sizeof(buffer) - 1); if (len 0) { buffer[len] \0; printf(server says: %s\n, buffer); } close(sock_fd); return 0; }inet_pton把127.0.0.1這種字符串形式的IP轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)序的二進(jìn)制結(jié)構(gòu)比老舊的inet_addr更安全。connect成功返回意味著三次握手已經(jīng)完成這是TCP非常關(guān)鍵的性質(zhì)連接是經(jīng)過(guò)雙方確認(rèn)的而不是客戶端單方面的幻想。connect之后TCP的序列號(hào)、窗口大小都已經(jīng)協(xié)商好可以直接收發(fā)數(shù)據(jù)。完整流程里客戶端不需要bind系統(tǒng)會(huì)自動(dòng)分配一個(gè)臨時(shí)端口不需要listen因?yàn)榭蛻舳瞬皇潜贿B接方。5.4 編譯、運(yùn)行、抓包驗(yàn)證三次握手編譯運(yùn)行g(shù)cc server.c -o server gcc client.c -o client ./server ./client 127.0.0.1服務(wù)端會(huì)打印client connected: 127.0.0.1:xxxxx客戶端會(huì)打印server says: hello from server。read和write在這個(gè)例子里用起來(lái)像操作文件一樣這也印證了Linux“一切皆文件”的設(shè)計(jì)哲學(xué)。Socket確實(shí)是文件描述符對(duì)連接的讀寫就是對(duì)文件描述符的讀寫。跑通了只是第一步建議你按上一節(jié)的方法開啟抓包再跑一次程序親眼看到SYN、SYNACK、ACK三個(gè)報(bào)文依次出現(xiàn)。這個(gè)步驟雖然瑣碎但效果非常好你會(huì)發(fā)現(xiàn)TCP握手不是一個(gè)抽象概念而是實(shí)實(shí)在在出現(xiàn)在網(wǎng)卡上的三個(gè)數(shù)據(jù)包。抓包時(shí)如果用-nn參數(shù)IP地址不會(huì)被解析成域名所以127.0.0.1會(huì)直接顯示方便對(duì)照。5.5 這個(gè)demo暴露出的問(wèn)題這個(gè)程序能跑但它極其簡(jiǎn)陋局限也很明顯第一它一次只能處理一個(gè)客戶端。accept之后如果第二個(gè)客戶端連上來(lái)誰(shuí)都不理它因?yàn)槌绦蛘枞诘谝粋€(gè)連接的read上。第二read是阻塞式的如果客戶端一直不發(fā)數(shù)據(jù)服務(wù)端就永遠(yuǎn)卡在那一行。第三收發(fā)沒(méi)有消息邊界如果客戶端連續(xù)發(fā)兩條消息服務(wù)端可能一次read讀完也可能分三次讀完怎么切分邊界需要應(yīng)用層協(xié)議來(lái)定義。這些不是代碼寫得不好而是所有TCP網(wǎng)絡(luò)程序都要面對(duì)的基礎(chǔ)問(wèn)題。處理它們要靠多線程、非阻塞IO、IO多路復(fù)用select/poll/epoll這些技術(shù)這是本系列后面幾個(gè)篇章的核心內(nèi)容?,F(xiàn)在先把這套流程跑通肚子里有了一張完整的圖再學(xué)那些高級(jí)玩法就有參照系了。6. 新手期最容易踩的四個(gè)坑6.1 bind報(bào)錯(cuò)Address already in use我敢說(shuō)每個(gè)寫TCP服務(wù)端的人都遇見過(guò)這個(gè)錯(cuò)誤。表現(xiàn)是第二次啟動(dòng)程序時(shí)bind返回失敗錯(cuò)誤信息為Address already in use。通常原因不是端口真的被別的服務(wù)占用了而是上一個(gè)程序正常退出了但TCP連接還在TIME_WAIT狀態(tài)系統(tǒng)要等約60秒才能釋放端口。TIME_WAIT產(chǎn)生的原因是被動(dòng)關(guān)閉連接的一方可能還有數(shù)據(jù)沒(méi)發(fā)完主動(dòng)關(guān)閉方要留出時(shí)間處理遲到的報(bào)文。解決這個(gè)問(wèn)題的標(biāo)準(zhǔn)做法就是我們?cè)诜?wù)端代碼里寫的那行setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt))。這行代碼在bind之前設(shè)置告訴內(nèi)核即使有連接處于TIME_WAIT這個(gè)端口也可以立即重用。很多人把它當(dāng)模板抄卻不理解為什么這里必須說(shuō)清楚沒(méi)有它你每次調(diào)試都要干等一分鐘有它在你的開發(fā)體驗(yàn)會(huì)順暢很多。6.2 虛擬機(jī)里連不上別急著懷疑代碼如果你的服務(wù)端跑在虛擬機(jī)里客戶端從宿主機(jī)連接連不上是最常見的問(wèn)題。這里面的原因通常不是socket代碼而是虛擬機(jī)網(wǎng)絡(luò)模式。VMware默認(rèn)的NAT模式下虛擬機(jī)有自己獨(dú)立的NAT網(wǎng)段宿主機(jī)不能直接訪問(wèn)虛擬機(jī)。如果你要從宿主機(jī)連虛擬機(jī)的8888端口要么把網(wǎng)絡(luò)模式改為橋接bridge讓虛擬機(jī)和宿主機(jī)處于同一局域網(wǎng)要么配置NAT端口轉(zhuǎn)發(fā)。判斷問(wèn)題是不是出在網(wǎng)絡(luò)環(huán)境有一個(gè)很省事的辦法在虛擬機(jī)內(nèi)部自己連自己比如客戶端也跑在虛擬機(jī)里連127.0.0.1。如果能通說(shuō)明代碼沒(méi)有問(wèn)題剩下的就是網(wǎng)絡(luò)拓?fù)鋯?wèn)題。另外還要檢查L(zhǎng)inux防火墻某些發(fā)行版默認(rèn)開啟firewalld可以暫時(shí)關(guān)閉或者放行端口sudo systemctl stop firewalld不需要一上來(lái)就懷疑協(xié)議棧先看連通性再看端口監(jiān)聽最后看代碼這個(gè)排查順序能幫你省掉大量時(shí)間。6.3 數(shù)據(jù)收不齊TCP流式協(xié)議沒(méi)有消息邊界寫網(wǎng)絡(luò)程序最普遍的困惑就是為什么我的read讀出來(lái)的數(shù)據(jù)不完整或者一次性讀到了兩條消息。原因是TCP是流式協(xié)議它只保證字節(jié)按序到達(dá)但不保證字節(jié)的“組合方式”。你可以把TCP想成一根水管水連續(xù)地流你從水管里接水接多少取決于你拿杯子的時(shí)機(jī)而不是取決于誰(shuí)往水管里倒了多少水。應(yīng)用層如果不好好定義消息邊界就會(huì)出現(xiàn)粘包把兩條消息合成一條讀和半包一條消息被拆成兩次讀。解決思路有很多最常見的是這幾種固定長(zhǎng)度消息每條消息長(zhǎng)度一樣讀完一個(gè)長(zhǎng)度再讀下一個(gè)分隔符協(xié)議用\r\n或自定義分隔符切分消息長(zhǎng)度前綴每個(gè)消息前面用幾個(gè)字節(jié)聲明消息體長(zhǎng)度接收方先讀長(zhǎng)度再讀對(duì)應(yīng)長(zhǎng)度的正文。這已經(jīng)屬于應(yīng)用層協(xié)議設(shè)計(jì)的范疇第一篇文章不展開但你要先有這個(gè)意識(shí)光靠TCP自帶機(jī)制無(wú)法解決業(yè)務(wù)消息的分界問(wèn)題。6.4 單線程阻塞帶來(lái)的并發(fā)瓶頸最后一個(gè)坑也是從入門到進(jìn)階的必經(jīng)坎阻塞IO。accept會(huì)阻塞read會(huì)阻塞意味著一個(gè)單線程程序同一時(shí)間只能服務(wù)一個(gè)連接。很多新手在這里會(huì)把程序改成多線程為每個(gè)連接開一個(gè)線程但線程多了以后又有資源競(jìng)爭(zhēng)和上下文切換開銷所以業(yè)界主流做法是用IO多路復(fù)用select/poll/epoll配合非阻塞IO用少量線程管理大量連接。第一篇文章不談實(shí)現(xiàn)細(xì)節(jié)只給你一個(gè)宏觀認(rèn)知網(wǎng)絡(luò)編程的下半場(chǎng)是從“能通”走向“能扛”的過(guò)程。當(dāng)你的程序從單連接進(jìn)化到支持成千上萬(wàn)并發(fā)連接時(shí)你對(duì)epoll、事件驅(qū)動(dòng)、用戶態(tài)協(xié)議棧這些詞的理解就會(huì)完全不一樣?,F(xiàn)在先把單連接的demo吃透后面的路一步一步走。我當(dāng)年第一次把這個(gè)demo跑通時(shí)興沖沖給一臺(tái)遠(yuǎn)程服務(wù)器發(fā)消息結(jié)果客戶端一直卡住不動(dòng)最后發(fā)現(xiàn)是對(duì)端根本沒(méi)啟動(dòng)服務(wù)而不是代碼問(wèn)題。從那以后我養(yǎng)成了一個(gè)習(xí)慣先抓包、再猜原因。這個(gè)習(xí)慣一直用到現(xiàn)在。如果你也是剛邁進(jìn)Linux網(wǎng)絡(luò)編程的門檻建議把tcpdump這類工具用熟讓真實(shí)的數(shù)據(jù)包成為你排查問(wèn)題的第一依據(jù)。等腦子里有了這張協(xié)議運(yùn)行的全局圖再看后續(xù)的并發(fā)處理、非阻塞IO、epoll一切都會(huì)順理成章。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产欧洲精品亚洲午夜拍精品| 国产精品无码久久久久2028| 91操人| 亚洲日本韩国极品一区二区| 欧美草草高清日韩视频| 丁香五月综合| 亚洲美女 晚间男人天堂 | 台湾佬激情综合| 91精品婷婷国产综合久久竹菊| 97超碰精品图片| 国产三级多多影院2022国产AA一级毛片无码 | 夜嗨影院| 大香蕉色欲AV| ji熟女.com| 粉嫩国产精品久久粉嫩| 伊人九九九| 天堂中文日本在线观看| 91 偷| 国产人伦a片信息免费片| 五月婷婷色| 在线五区| 午夜福利成人免费视频| 天天爱综合网| 国产精品探花视频| 欧美国产操逼| 91精品啪在线观看国产城中村| 天天看特黄的免费网站| 操逼国产免费| 91色伦综合| 懂色天天爱天天日天天射天天澡| 99九九久久| а√天堂资源官网在线资源| 日本色婷婷| 日本精品一区二区三| 人人操人人插人www| 在线 亚洲 网爆 自拍| 久久色网| 国产青视频| 伊人热综合| 91亚洲不卡一区| 人人操人人摸人人骑| 国产伦精品一区二区三区视频女| 色综合加勒比| 在线视频一区二区传媒| JIZZJIZZ国产精品喷水| 国产精品一区二区三区在线| 97 超碰 人人做 人人爱| 久久精品国产亚洲AV高清演员表| 亚洲凸凹超碰成人| 激情九月婷婷| 最新亚洲黄色免费电影| 欧美色图下一页| 欧美黄色大片在线观看 | 国产白丝在线| 国产乱码精品一区二区三区四川| 欧美色图另类图片| 在线观看十八禁| 成人26uuu| 日少妇视频| 日本三级日本三级三级人妇四虎| 91香蕉视频在线观看免费| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 久久最新视频免费观看| 色成人Www精品永久观看| 久超碰这里只有精品| 中文字幕成人| 亚洲成成熟女人综合一区二区| 69人妻精品一区二区绯色| 日比av无码| 天天综合网~69| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 激情视频图片| 少妇99成人麻豆| 思思热久久成人| 天天干人人乐| 成人热久久精品| 久久久久国产无av| 丝袜人妻av一区二区| 97se综合| 99热超碰| 免费精品福利在线观看| 日韩一级性爱无码| 欧美 亚洲 在线| 天天日日日射| 婷婷激情五月综合| 亚洲天堂五月天国产| 麻豆AV96熟妇人妻| 91美女丝袜诱惑视频| 人人人摸人人| 国产91美女视频| 日韩二三区| 中文字幕日本久久| 欧美黑人精品在线播放| 91天天看| 外国免费性情大片| 99色在线| 大香蕉综合久久| 嗯啊不要在线观看嗯啊| 欧美性爱中文字幕无线码| 六月丁丁香| 大香蕉黄色一级片免费看| 亚洲人人夜夜澡人人爽| 五月天久久婷婷亚洲 | 香蕉欧美| 国产搭汕a级片| 中文字幕人妻色偷偷久久皮 | 五月婷丁香| 岛国A V在线免费看| 亚洲欧洲日韩中文字幕一区| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 成年人网站在线免费观看| 大白逼三四级| 91 亚洲情侣偷拍 久久| 中文字幕少妇色| 免费精品99| 欧美日韩精品一区二区三区高清| 一个人免费视频观看在线WWW| 97色欧洲| 人妻精品一区一区三区蜜桃91| 中文字幕在在线观看网站| 国内自拍 日韩激情 99| 日韩AV一起草| 无码伊人久久大杳蕉中文无码| 亚欧色图在线激情| 97精品久久| 99精品无码| 色香91| 欧洲精品久久| 男人把坤坤插入女人的下体| 欧美日韩少妇色情| 亚洲视频,小说| 亚洲人成网www| 精品超碰国产| 日韩国产中文字幕| 激情五月婷婷| www.操| 殴美牲| 碰碰在线视频| 欧美美女在线高潮999| 超AV色女| 久热久| 久久久国产精品亚洲精品| 精精夜夜| 97超碰在线资源网站| 欧美的性爱网站免费| 97超色| 国产AV人人夜夜澡人人爽麻豆| 试看福利| 一级免费精品| 91情色| 久久久精品91八戒| 日韩成年人性爱视频| 又粗又长又大国产不卡| 中文字幕人妻资源在线| 国产精品不卡av免费在线观看| 九九亚洲| a片在线播放| 无码久久国产| 国产操逼逼网| 97色碰| 调教熟妇 久久久久久| 91丨国产丨白浆| 欧美色图中文字幕| 双插在线| 国产精品午夜福利| 欧美中出| caoni国产亚洲av| 熟女视频久久| 内射日韩大臀美女| 中文字幕一二三av| 91免费看一区二区三区| 亚洲熟伦熟妇AV无码春色| 免费人成在线观看网站品爱网| A级片日韩欧美国产欧美视频精选观看 | 99re这里只有精品中心播放 | 极品少妇久久久久| 精品国模无码| 日韩强奸av| 国产色精品午夜大片| 久热91| 欧美 传媒 麻豆 日韩 偷拍| 精人妻一区二区三区| 粉嫩av在线| 人妻系列无码专区中文有码| 伊人影院中文字幕| 日产123区精品免费观看| 日韩欧美三级| 久久久久久久九九九九九九| 国产精品欧美日韩久久| 99热亚洲天堂| 91九色丰满高潮| 69天堂| 人妻出轨一区二区三区| 91操熟女视频| 乱伦3P视频| 青青爽| 欧洲色综合| 人人妻碰人人免费| 大香蕉九九| 97玖玖人妻| 亚洲清纯唯美| 九九九免费视频| 日韩美女操b| 国产精品女同| 欧美大的香蕉有线电视视频| 久久东京伊人一本到鬼色| 日韩一级片在线看| 黄呦呦在线| 大奶的诱惑| 一级免费啪啪片| 97色97好| 91美女视频在线观看| 丰满高潮18xxxx| 冬京热男人的天堂| 人妻久久一区二区三区| 5278欧美一区二区三区| 97干天天| 三级日本一区二区三区| 盗摄 精品 另类 一区| 韩国嫰模上门援交视频| 国产精品爱欲| 在线啊啊啊啊| 欧美色交| 国内精品久久久久影院亚洲| 久久久九| 白嫩国模丰满一二三区| 一区二区亚州激情久婷婷欧美| 成人免费视瓶| 丝袜喷水在线| 国产精品黑人一区二区三区| 亚洲免费日韩在线一区二区| 人妻夜夜爽天天爽三区麻豆AV网站| 欧洲一级性爱视频在线观看| 蜜桃精品一区二区三区久在线| 嫩草在线视频| 97天天操天天干| 国产亚洲精品A在线观看下载| 欧美后进式| 久久精品熟妇丰满人妻99| 婷婷深爱五月| 一摸二插三插| 久久这里只精品99re66图| 97操综合| 婷婷综合在线| 色图综合网| 懂色AV一区二区三区| 啪啪自拍九九综合| 中文字幕黑人大片| 国产97亚洲| 99热这里只有精品99| 美女十八禁| 麻豆国产免费影片| 91国产丝袜美女| 欧美v亚洲v日韩v最新在线二区 | 国产AB视频| 日韩一级成人毛片免费观看| 久久久久久久久久久精| 青青操狠狠撩| 亚洲激情综合另类| 丰满少妇人妻久久久久久| 秋霞Av理论一级在线| 热天堂一区二区| 日本中文熟女视频| 男人的天堂日本东京热| 国产一区二区欧美日本| 欧美丝袜中文字幕07在线| 韩日精品四区| 四虎午夜影院| 久久精品日韩专区免费观看| 91美女丝袜诱惑视频| 亚洲情色综合| ai欧美亚洲小说| 欧美亚洲日本激情在线| 超碰9 7女人 | 亚洲成人一二三区| 日韩不卡毛片Av免费高清| 青青草在线视频美女| 天天操天天插| 国产精品午夜AV完会免费| 色av中文字| 国产精品不卡高清在线观看| 亚洲色资源| 成人av动漫在线观看| 午夜噜噜噜| 91九色丨国产丨爆乳| 激情综合网五月婷婷五月天| 4虎在线观看| 性色国产东北露脸精品视频| 免费看欧美美女黄色大片| 男人的天堂网页| 中文字幕日韩人妻视频一区二区三区交换夫妻| 人人干人人操人人..com| 九九热三级片| 偷拍亚洲高清图片| 手机在线人成免费视频| 欧美色999| 色女免费在线观看视频网址| 九九无码久久精品视频| 亞洲久久直播| 综合久久久久久久久91| 亚洲美女高潮喷水视频| 亚洲色图 欧美热图 清纯唯美 另类自拍| 最新亚洲黄色免费电影 | 九99久久| 中文字幕十五区| 国产福利在线视频网站| 国产激情视频一区区三区| 91人妻视频| 日韩精品黄片免费观看| 东京热大香蕉| 国产9熟妇视频网站| 色综合加勒比四四季| 欧美人妻久久精品二区三区| 欧美乱伦专区| 熟妇色99| 熟妇女伦乱视频视频| 亚洲av总站| 最新国产亚洲精品精品国产亚洲综合| 亚洲另类欧美精品| 久久久久久久9| 欧美线天码中字| 91av天美性媒精品视频| 欧美熟爽综合| 五月丁香色综合| 日本激情免费大片| 欧美日韩免费性爱| 厕所偷拍在线| 色五月网址| 国产精品内射婷婷一级二| 精品丰满熟妇人妻一区| 无码操逼天堂| 亚洲 图片 综合91| 人妻嗯啊啊在线播放| 国产69精品久久久久99尤物| 97无码视频在线播放| 天堂网亚洲区手机版| 激情视频一二三| 九热大香蕉| 日韩av女优在线免费一区| 狠狠色婷婷7777久| 国产99 中文字幕日韩小视频| www久久国产精品| 亚州综合网| 无码人妻一区二区三区四区老鸭窝| 亚洲人妻熟妇三十三区| 乱伦熟女区| 国产精品激情久久久久久久| 3P乱轮视频| 中文精品一区二去| 草莓精品视频在线免费观看| 热久久国产| 91精品国产91久久福利| 98久久| www.人人摸在线视频| 制服丝袜第二页| 超碰久久网| 天天激色| 亚洲久久天堂| v91av| 欧美高潮| 男人的天堂日韩| 国产噜噜噜噜噜久久久久久久久| 亚洲精品天天影视综合网| 日韩女优中文字幕| 欧美日本天堂| 97精品97久久| 亚洲熟女诱惑| 亚洲 欧美 精品专区 极品| 中日韩一区二区三区欧美| 亚洲本色精品一区二区久久| 91熟女视频| 中文字幕第9页萱萱影音先锋| 日本性感人妻91| 国产欧美日本亚洲精品| 日本东京热加勒比久久| 全球成人中文在线| 色色五月天激情| 密桃99999| 亚洲中文人妻色| 亚洲图片欧美91N| 99re8超碰| 手机不卡视频不卡在线一二三区| 97碰碰日本乱偷人妻中文的| 青青草啪啪网| 大屁股熟女一区二区三区| 亚洲综人网| 欧美 亚洲 第一页| 凹凸视频在线一区二区| 国产一区二区精品久久99| 成人性爱电影一区二区| 麻豆这里只有精品| 免费看美国人人爽,人人操| 猛交交| 午夜福利视频在线一区| 99热日| 综合色图,成人综合网| 亚洲熟女国产综合另类| 天天综合网AV91| 九九九九一级| 香蕉国产97| 99国产精品| 亚洲国产精品9999在线观看 | 久操免费观看| 69久久| 日韩av熟女一区二区三区成人| 激情终合网| 国内成人圈中文字幕无码视频| 好吊色综合| 日本一区不卡| 久久一区二区三区入口| 国产有码一区| 91精品免费| 色吧91| 秋霞曰韩R级| 2020视频1区2区3区| 亚洲性少妇| 舔舔啊| 亚洲资源站| 岛国黄| 在线 制服丝袜中出 人妻| 久久亚州高清| 加勒比综合网| 国产日韩欧美三级片| 嗯嗯嗯啊啊啊操的我好爽| 91熟女视频网| 精品高清一区二区三区三州| 超碰资源亚洲97| 日日A∨| 亚洲色婷婷综合久久久久中文| 天天看天天日| 午夜国产成人福利视频| 人妻人妻天天碰| 大鸡巴久久| 色婷婷视频| 日韩精品熟妇| 欧美色999| 亚洲高清在线| 国产一区二区精品在线视频| 台湾成人无码AV| 欧美亚洲性爱一区二区| 欧美 亚洲| 久久久久成人亚洲国产| 男人的天堂在线| 97精品一区二区视频| 国产999精品久久久久久| 日韩中文字幕宗合在线| 91人妻最真实刺激绿帽| 激情图片亚洲色图| av影片在线观看不卡| 欧美日韩 强奸乱伦| 欧美熟女妇同| 欧美日韩另类在线播放| 久久、1234| 蜜乳视频网站| 男插女青青影院| 亚洲国产精品久久AV| 综合色图区| 久久精品一区一起草| 女同性恋久久| 欧美成人精品一区二区男人蜜臀| 国产 丝袜 欧美中文 另类| 综合97亚洲| 亚洲色系另类精品国产| ai欧美亚洲小说| 精品欧美不卡在线播放| 亚洲激情 欧美色图| 成人国产视频在线观看| 九九十八精品| 91东京热男人的天堂| 久草视频制服诱惑| 日本熟女不卡视频| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 天天综合网网欲色| 中文字幕日产av人| 大香蕉视频一二三区| 青久操| 国产精品第一区第一页| 欧美78| 天天操夜夜嗨| 亚洲中文sv| 色婷婷激情| 另类图片综合| 精品少妇后入一区二区三区四区人妻巨乳 | 少妇丝袜在线观看AV| 国产精品自拍xxxx| 日本久久999| 欧美性爱伊人| 神马麻豆福利院| 第二页中文字幕| 午夜.DJ高清在线观看免费7| 在线小视频| 欧美中出1| 亚洲影视高清第一页| 色婷婷电影| a级免费在线观看| 色爱欲亚洲| 中文字幕交换人妻| 国产久久天堂资源| 亚洲人在线| 欧美日本中字另类在线| 亚洲高清欧美总合| 一区中文字幕二区日韩| 中文字幕精品日韩中文字幕| 啊啊啊啊啊啊在线| 美性中文综合网| 久久久91福利姬| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 超碰98综合网| 日本综合久久| 亚洲码在线中文在线观看| 免费超碰97久久| 免费夜夜爱黄色视频毛片| AV麻豆免费一区| 日韩欧美~中文字| 极品五月天噜噜| 亚洲1区2区三区高清中文字幕| 麻豆熟妇乱妇熟色A片在线看| 91最新综合| 久久精品国产免费观看99| 国产色图乱伦| 日韩成人小视频| 欧亚第一综合网| 五月激情视频| 麻花豆传媒剧国产MV出差| 变态综合色| 日韩无码AB| 色噜噜婷婷| 污污汅18禁网站在线永久免费观看| 久久风骚城市人| 好吊色一区| 久热久| 中国一级特黄大片护士| 777超碰| AV男人天堂网| se吧提供国产乱老熟视频胖女人| 另类av综合久久| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美亚洲首页| 我爱操| 美女让帅哥通她小鸡鸡| 亚洲男人天堂2016| 亚洲色性情三级| 亚洲aw毛茸茸在线| 奸色色 男人天堂 天天射| 狠狠狠狠狠干| 六月婷婷综合| 丁香五月激情综合| 99色视频| 嗯嗯啊中文字幕| 婷婷五月在线视频| 五月天婷婷久久| 色色操| 99热亚洲| 日本欧美成人片AAAA| a在线观看| 久99视频| 中文字幕啊啊啊在线观看视频| 五月天社区| 久久五月丁香| 嗯嗯啊啊视频在线看| 男人的天堂亚洲| 色噜噜狠狠色综无码久久合欧美| 青青草日韩无码| 一区二区三区在线资源| 久久大香蕉手机高清| 久久免费老司机精品| 极品丝袜无码| 神马午夜久久久| 男女激情中文字幕| 欧美情色贴图| 91男同| 超碰97综合网| 日韩猛交| 美日韩男女操屄视频| 中文字幕一区二区三区字幕| 久久久亚洲高清不打码| 日本精品高清一二区一本到| 日韩中文字幕二区| 亚洲有码 视频一区| 口爆欧美91| 牛牛久久国产精品视频一二三| 色综合超碰超| 久久久久久十| 国产综合日韩伦理| 天天色天天干天天射| 亚洲 欧美 手机在线观看| 91中文在线| 啊啊啊啊啊操我视频| 97爱b| 天天摸天天操视频| 色色毛片| 国产亚州高清国产拍精| 日韩一级二级| 伊蕉97蜜桃97狠狠综合干| 91日日夜夜| 综合久久2017| 久久国产性爱| 五月天精品| 躁躁日曰躁2020| 91综合天天看| 超碰97人妻免费在线| 日韩欧美中文| AV色天香在线| 99精品丰满人妻无码| 国产路线专区| 亚洲人91| 青草成人免费视频一COm| 国产精品原创巨作?v网站| 网页导航五月天免费一二三区| 日本高清电影欧美色图| 人人爽人人精品乱人伦AV| 欧洲视频在线| 操逼免费视频无码国产| 亚洲第一综合| 欧美色图人妻| 精品人成视频在线观看| 欧美日韩操逼嗦吊| 91欧美偷拍| 日本 情色 1区| 啪啪视频亚洲第一| 粉嫩国产精品久久粉嫩| 色香91| 日韩av性爱在线播放| 女人高潮抽搐喷水视频网站| 亚洲第一色页夜| 亚州性色| 国产一区二区啪啪视频| 91精品成人| 好吊色综合| 中文字幕性感少妇av| 久久綜合很很很| 97色在线视频| 欧美 亚洲 偷拍自拍| 亚洲区限制级| 婷婷超| 1024人妻| 欧美在线|亚洲| 乱伦a片视频| 国产九九久久久精品| 熟妇人妻精品一区二区| 欧美日韩香蕉| 天天综合网AV91| 日本爽爽爽爽爽爽免费视频| 人妻天天夜夜爽一区二区| 日本五区不卡| 国产福利小视频高清在线观看| 一区二区精品更新提醒| 97亚洲欧美| 伊人五月天| 91操熟妇| 国产成人在线观看综合| 91精品免费| 男人的天堂午夜av| 超碰97玖玖爱| 亚洲影院无码在线| 爆乳免费黄网站| 蜜臀久久99精品久久久久久婷婷| 免费看一级a性色生活片久久无| 久久综合久色欧美综合狠狠 | xxxx网站亚洲精品| 国产高清不卡视频| 一区AV| 日本精品88888888| 天堂v无码免费视频| 嗯嗯啊啊视频在线看| 少妇激情一区二区三区视频| 婷婷色中文字幕| 夜夜高潮夜夜爽夜夜爱爱一区| 午夜男女爽爽爽在线视频 | 久久精品欧美一区二区三区不卡| 二对二中文字幕。| 免费少妇一区二区| 夜草欧美| 久久精品中文字幕无码l| 亚洲宗合网| 久久精品国产亚洲AV高级北京| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲日韩av专区无码| 中文字幕一区二区三区蜜臀| av三级电影在线播放| 日本一区二区三区欧美日韩中文字幕| 欧洲在线性爱视频| 91色图片| 欧美性爱免费短视频| 黑人精品久久97| 91精品啪在线观看国产城中村| 久久精品91| 五月丁香激情综合网| 亚洲男人天堂手机版| 欧美久久九九| 人妻偷拍一区二区三区| 天天内射| 亚洲精品成人| 97免费在线观看| 亚洲欧美九九九| 熟女乱伦A| 啊啊啊男女| 天天影视网综合少妇| 国产精品久久久吖| 日本男人插女人的逼黄色| 国产乱码精品一区二区三区四川| 日本黄色精品| 欧美有码亚洲中文字幕一区二区三区四区| 亚洲无码超碰免费| 伊人视频| 日韩三四五区| 三级特黄60分钟播放| 精品制服美女中文一区二区三区| 五月丁香啪| 操逼视频国产无套| 男人天堂网手机版婷婷| 91oumei| 超碰国产精品无码| 亚洲脚交| 欧色综合| 操逼网站视频漫画国产| 好色综合| 涩亚洲欧洲| 一区二区三区网站日日骚| 亚洲国产一区二区入口| 国产精品一区二区三区免费视频| 欧美 传媒 麻豆 日韩 偷拍| 欧美性爱伊人| 伊人色综合超碰| 亚州操逼图| 精品久| 免费超碰97久久| 亚洲色图久久精品蜜| 天天艹天天日| 精品人妻一区二区三区鲁大师| 男生女生啊啊啊啊| A久久| 精品成人亚洲午夜电影| 91天堂| 久操影视| AV高清一区| www99热| 欧美十八禁导航成人| 日日爱99| 欧美三四五区| 97精品综合久久网| 91色艳| 视频分类 国内精品| 欧美gv在线观看| 九九九国产| 久久综合久色欧美综合狠狠| 91大神电影天堂| 狠狠操综合| 午夜爽爽爽在线观看永久入口姬片| 蜜臀99久久精品久久久懂爱| 日1区2区3区2020| 成人久久精品| 亚洲色图 欧美热图 清纯唯美 另类自拍| www.色综合| 做爱A级亚欧| 中国AAAAAA黄色片| 日本一二区不卡| 97视频一区| 国产精品乱码久久久久久| 久久久久久久78| 午夜精品99久久久久传媒| 996热| 久久鲁干| 26uuu国产成人综合| 为用户提供免费看黄网址在线观看| 成人怡红院| 97久久久久| 高清无码学生妹高潮| 蜜臀av网址| 亚洲视频二区| 一区二区视频你懂的| 国产农村妇女精品一| 色综合美国| 精品国产乱码久久久久A| 99热99色| 大香蕉伊人久久| 久操不卡视频| 一块操欧美性爱| 国产AV超爽| 九九黄色视频在线观看| 福利在线黄片| 成年人一级黄色毛片大全在线观看| 尤物黄色在线观看网站| 欧美激情性爱视频网站| 欧美性爱无码一区二区三区| 免费久久一级毛片大黄| 国模私拍一区二区三区神乳| 乱伦一二三区| 亚洲无码成人精品| 91精品久久久| 久久久久久日韩| 污污汅18禁网站在线永久免费观看| 91精品久久久久五月天精品| 中文字幕日韩精品久久| 亚洲一区二区三区不卡国产欧美| av无线看| 国产精品久久久久久久毛片1| 国产精品激情久久久久久久| 亚洲欧美国产成人综合不卡| 国产大学生高潮在线播放| 一区二区娱乐网站| 丁香五月天社区| 欧美性爱97超碰| 人妻精品4K4K4K4K4| 欧美午夜色妇色鬼| 吉川爱美亚洲二区在线| 在线免费试看60秒| 天堂av最新电影网| 96久久久久久久| 我要色综合网| 日韩在线欧美精品一区二区| 日本免费专区| 精品人妻美妇91job| 噜噜在线| 丝袜性亚洲| 久久国语| 欧美日韩制服| 久久久久亚洲| 小日子操bb在线看| 欧美啪啪女女| 泰国AV在线观看| 人妻在线大香蕉| 欧美专区17页| 欧美天天综合网| 日韩综合无码色欲vv| 亚洲黄网在哪免费看| 日本超碰在线国产一区| 91天美传媒精品| 一区超碰一区| 2017大香蕉| 免费在线黄片视频| 久久人妻办公室视频| 欧美性色综合网| 久久久九九| 欧美亚洲| 操我无码| 国产suv精品一区二区四| 久久人爽| 亚洲日韩电影| 九九久久一区二区伦理| 91粉芽高清在线一区二区| 91亚州欧美| 国产伊人精品在线| 老外又粗又长一晚做五次| 综合久久欧美| 日韩国产十八禁| 综合少妇网| 欧美一区二区三区四区综合| 超碰免费在线| 老女人碰碰在线碰碰视频| 亚州性色| 脫衣舞一区二区三区| 久久精品一区二区三区不卡| 欧美 熟女 日韩| 91爱| 国产精品宅男免费| 九九热免费国产视频婷婷伊人| 亚洲一区制服诱惑| 日韩欧美大片免费高清啪啪| 99久久99九九99九九九| 久久精9| 亚洲欧美黄| 99久久久久久久久| 99re3这里只有精品| 青青草华人在线欧美在线| 国产探花日韩援交| 久久日韩毛| 亚洲精品成人激情在线| 亚洲色图加勒比| 国产成人五月天丁香花| 成人性爱美曰韩| 超碰1024久久| 超碰97人妻| 丁香五月色| 亚洲麻豆18发?| 国产极品精品美女视频| 亚洲人成色9999精品久久 | 国产精品久久久久久久无码AV| 国产成人久久久精品免费AV| 97国产色图| 日韩偷拍一区二区三区| 日本三级久| 天天欧美| 亚洲AV无码乱码在线观看性色| 成人黄页| 国产一级137片内射麻豆| 香一区二区三区| 天美传媒AV在线| 亚洲夜夜欢无码一区二区| 男人的天堂久久狠| 最新岛国大片| 啊啊啊97视频| 亚洲啪啪视频免费| 欧美大香蕉在线观看| 超碰97 线线 在现| 天天干天天做| 久久啊啊| 91国产精品在线看| 婷婷激情四射| 伊人成人中文字幕久久网| 国产9熟妇视频网站| 无码抄逼网| 久久精品无码不卡| 国产av美女被艹的乱叫| 熟女91网| 立川理惠无码一区二区| 一区二区三区四区在线不卡| 中文字幕狠狠玩| 9997se| 破苞ⅩXXX性无码动漫无码| 97久久国产精品| 亚洲国产麻豆一区二区三区| 日本黄色天堂| 日本日皮视频逼| 死我十八禁| 亚洲成人久久美女| 精品国产99999| 长长久久免费视频| 97欧美| 亚洲精品一二三四区| 精品人妻一区二区三区四区石在线| 亚洲国产一区二区三区在线| 91精品无码久久久久久久| 天天综合欧美综合| 樱花蜜乳av| 天堂网 主播 亚洲| 欧美v亚洲v日韩v最新在线二区| 日韩成人人妻网站| 免费看一级a性色生活片久久无| 天天干夜夜鈤| 97久久资源| www.99色| 国桃视频产巨乳精品一区二区在线| 色噜噜精品一区二区三| 亚洲另类色综合网站| 99在线精品视频| TS人妖另类精品视频系列| 99操| 在免费jIzzjIzz在线视频| 97超级久久| 中文字幕91综合| 国产精品爱欲| 中文字幕二区| 亚洲,欧美,春色,另类| 人妻另类 专区 欧美 制服| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 久久综合资源一区二区| 天天综合网亚洲综合网| 免费观看欧美日韩操逼视频| 国产精品成人AV片免费看网站| 97色色,97综合| 成人三级片无码| 91天美| 免费成人在线熟妇网| 色综合色欲色综合色综合色综合| 日日摸天天爽夜夜欢| 精品国产72| 91干熟女| 99精品国产户外露出| 激情综合网一盗摄| 99这里有精品视频| 国产精品一区二区亚洲人成毛片| 欧美在线第五页| 有码免费观看| 日韩AV一起草| 精品一区二区三区国产| 久热99999| 熟女在线视频| 黄色片大香蕉| 国产辣妈在线视频福利| 欧美,日韩,中文,另类| xxx亚洲午夜天堂| 日本高清有码网址视频| 亚洲精品97| AV男人天堂网| 最新亚洲风情电影| 婷婷丁香成人| 国产对白刺激视频| 久久久夜夜夜| 国偷自 一区| 国产a级精品| 亚洲五月婷婷| 欧美一级黄片视频在线| 97久久国产| 中文字幕欧美日本乱码一线二线| 青青草日逼视频| 五月色网| 欧美性爱日韩性爱| 亚洲综合第一页| 中文字幕第二页| 精品999日本| 北条麻妃99精品青青久久| 亚洲偷拍自拍在线视频| 中文字幕一区二区三区字幕| 美女啊啊啊啊啊| 女同性恋中文字幕| 伊人青青草久久| 久久久98网站免费视频| 欧美性爱一级操| 一个国产在线综合网站| 69天堂| 東南亚性呦成人伦理资源在线视频| 91日产欧美| 天天摸夜夜摸| 蜜臀久久99精品久久久久久久久| 国产成人自拍视频在线| 377p欧洲日本亚洲大胆| 丝袜人妻av一区二区| 97碰碰色| 91成人亚洲色图| 91在线/欧洲| 一级黄碟在线观看| 中文字幕在线观看AV| 深爱五月婷婷| 综合一区中亚洲国产成人综合精品 | 日本一区二区亚洲综合| 诱惑网综合| 日韩欧美中文字幕搭讪巨乳美人妻视频| 嗯,啊。舔我逼| 97欧美色资源| 少妇极品熟妇人妻无码| 久久国产视频专区一二三 | 欧亚不卡| 大香蕉欧美伊| 青青草吊丝| 久久久久久久久久久人妻| 一本一道人妻久久一区二区三区| 9久久精品| 五月婷婷久久综合| 超碰成人国产| 一区在线观看中文字幕| 亚洲日韩国产欧美综合v| 亚洲色 国产 欧美 日韩| 一级黄色视频网| av强奸乱轮| 女人被男人桶爽视频网站| 久久亚洲欧美中文字幕国语| 亚欧免费| 多毛小伙内射老太婆| 精品人妻av在线播放| 污污汅18禁网站在线永久免费观看| 亚洲阿v天堂无码z2018| 日韩欧美成人性爱在线| 久久五十路熟女人妻| 天天看天天在线精品| 亚洲AV噜噜狠狠网址蜜桃动漫| 亚洲第一狼人丝袜美女另类| 岛国视频免费在线观看| 欧美一区二区观看在线| 7777欧美成是人在线观看| 女人爽到高潮潮喷18禁网站| 91久久久久久久| 久久午夜伦| 国产乱婷婷精品二区三区| 后入人妻一区| 区二区亚洲婷| 亚洲人码13| 日本久久久久久久久久| 亚洲交性| 3PAV乱伦视频| 亚洲h片在线免费观看| 国产精品麻豆视频网站| 黄网色一区二区三区四区精品| 91粉嫩萝控精品福利网站_精品影音先锋国 | 五月天色图| 97视频网站在线观看| 91色综合激情| 性交一区二区在线播放| 五月天日日操夜夜操| 久久 精品| 日韩激情无码影院| 国产精品女久久久久av爽| www.色操逼| 久无码| av东京热男人的天堂| 亚州色图欧美色图| 亚洲男人天堂av| 青草草免费网站av| 午夜黄色免费在线观看| 精品久久久无码| 日本精品免费一区二区三区四区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 亚洲高清色综合| 91被操| 人看人人摸人人操| 日韩草久视频| 欧美91精彩| 97视频播放| 啪啪啪精品| 亚洲操人| 白丝AV网站| 人人澡人人澡人人| av三级电影在线播放| 人干人人人操人人摸| 久久午夜伦| 成熟熟女国产精品一区二区| 99re6在线视频播放免费精品| 翔田千里爆乳巨臀无码| 无码日韩网站| 久久综合久久综合人久久夜精品| 久久精品成人一区二区三区蜜臀| 青青草国产欧美非洲黑人| 国产高清免费不卡av| 色婷婷五月天| 久草精品视频| 91亚州| 日本操BAV| 午夜欧美J进J出白浆流出久久久| 97 国产精品| 韩三级a视频在线观看| 丁香五月久久| 婷婷五月天无码 | 在线视频 亚洲精品| 中文自拍欧美影视| 超碰午夜在线| 96超碰网| 色欲蜜臀AV| 日韩伦理视频| 国产精品农村妇女精品| 激情五月天插| 久久本道| 成年在线视频日本亚洲在线视频区精品江靖宇公司| www.操| 久99| 亚洲有码第一页| 国产高清自拍视频| 国产成人无码久久精品| 日韩欧美丝袜诱惑| 亚洲黑人在线| 婷婷六月色开| 97精选久久| 在线观看不卡一区二区三区| 欧洲色色| 噜噜瑟| 婷婷午夜成人色中色| 99天天超碰| 91少妇| 亚洲丝袜二区| 日日干日日摸| 日本高清_区二区三区| 天天享受天天看| 亚洲欧美综合| 91黑丝在线播放| 深喉吞精| 国产成人www免费人成看片| 亚洲AV不卡在线观看尤物| 午夜性生活av免费在线看| 五月天婷婷色色| 4tube欧美女厕所| 伊人女女资源在线观看| 激情视频一二三| 日本精品网站在线中文| 蜜桃久久久久久久| 中文字幕熟女人妻丝袜| 97人人干| 欧美日韩欧美| 日韩婷婷| 91色欧美| 五月丁香啪啪啪| 亚洲丝袜少妇在线|