亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(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親眼看到三次握手。不管是還沒寫過網(wǎng)絡(luò)代碼的新手還是寫過一點(diǎn)但總被奇怪問題卡住的人這篇都適用。1. 先從單機(jī)思維切換到網(wǎng)絡(luò)思維1.1 單機(jī)世界的通信方式以及它們的邊界Linux里進(jìn)程與進(jìn)程之間怎么通信管道、消息隊(duì)列、共享內(nèi)存、信號(hào)、本地套接字這些都是經(jīng)典機(jī)制。管道就像一條水管一端寫進(jìn)去另一端讀出來共享內(nèi)存更像是把一張紙貼在墻上多個(gè)進(jìn)程都能看。這些機(jī)制用起來都很順手但有一個(gè)共同的邊界條件它們都只能在同一臺(tái)主機(jī)上工作。為什么因?yàn)楣艿馈⑾㈥?duì)列、共享內(nèi)存本質(zhì)上依賴內(nèi)核中的公共資源比如一個(gè)文件描述符、一段共享內(nèi)存區(qū)域。兩個(gè)進(jìn)程哪怕隔著一堵墻只要在同一臺(tái)Linux系統(tǒng)上就能通過內(nèi)核搭橋。但如果進(jìn)程A在筆記本上進(jìn)程B在千里之外的服務(wù)器上內(nèi)核不是同一個(gè)內(nèi)存不是同一片管道和共享內(nèi)存立刻失效。網(wǎng)絡(luò)編程要解決的就是這個(gè)跨主機(jī)的問題。要讓兩個(gè)運(yùn)行在不同機(jī)器上的進(jìn)程像在同一臺(tái)機(jī)器上一樣交換數(shù)據(jù)我們必須設(shè)計(jì)一套機(jī)制怎么找到對(duì)方尋址、怎么把數(shù)據(jù)安全送到傳輸控制、中間經(jīng)過哪些設(shè)備路由、數(shù)據(jù)壞了怎么辦差錯(cuò)檢測(cè)。這一整套機(jī)制疊加起來就是我們常說的“協(xié)議棧”。所以學(xué)網(wǎng)絡(luò)編程本質(zhì)上學(xué)的不是某個(gè)API而是這套跨主機(jī)通信的規(guī)則體系。1.2 通信的前提是“約定”協(xié)議就是這套約定想象一下兩個(gè)人打電話。撥號(hào)之前雙方其實(shí)默認(rèn)遵守了一整套流程主叫方先撥號(hào)被叫方聽到鈴聲后接聽然后一方說“喂”另一方回應(yīng)雙方確認(rèn)能聽到聲音后才開始講正事。這套流程看起來稀松平常但它保證了通信的雙方在同一時(shí)間、同一頻率、同一語言體系下工作。如果沒有這套約定一方用手機(jī)、一方用對(duì)講機(jī)或者一方說中文、一方說德語這個(gè)電話根本打不成。網(wǎng)絡(luò)協(xié)議也一樣它就是通信雙方事先約定好的規(guī)則。專業(yè)一點(diǎn)說協(xié)議包含三要素語法規(guī)定數(shù)據(jù)怎么組織比如字段順序、格式語義規(guī)定每個(gè)字段代表什么含義比如某個(gè)標(biāo)志位為1表示數(shù)據(jù)結(jié)束時(shí)序規(guī)定事件發(fā)生的順序比如先建立連接再傳數(shù)據(jù)傳完數(shù)據(jù)再斷開。舉個(gè)例子一個(gè)最簡單的HTTP GET請(qǐng)求報(bào)文長這樣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ì)問為什么是GET而不是拿因?yàn)閰f(xié)議必須是雙方都懂的語言它不依賴人的自然語言而是依賴文檔規(guī)范。互聯(lián)網(wǎng)上大量協(xié)議的標(biāo)準(zhǔn)定義在RFC文檔里任何人都能查閱和實(shí)現(xiàn)。所以請(qǐng)記住這句話網(wǎng)絡(luò)編程的核心是把你對(duì)“通信過程的想象”變成雙方都能理解的協(xié)議。代碼只是協(xié)議的載體API只是敲門磚。2. 分層模型協(xié)議世界的地基2.1 為什么協(xié)議非得分層不能一個(gè)大包如果從頭設(shè)計(jì)一套跨主機(jī)通信方案你會(huì)發(fā)現(xià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è)通信過程按職責(zé)拆成幾個(gè)相對(duì)獨(dú)立的層每一層只干一件明確的事層與層之間通過標(biāo)準(zhǔn)接口對(duì)接。生活中最典型的就是快遞系統(tǒng)。商家不關(guān)心快遞員怎么運(yùn)輸快遞員不關(guān)心包裹里裝的是什么倉庫工人只負(fù)責(zé)分揀和貼單。每一層的職責(zé)都足夠單純也可以獨(dú)立更換——比如商家換了包裝盒快遞公司完全不需要知道。網(wǎng)絡(luò)協(xié)議棧的設(shè)計(jì)思路正是這樣。通過分層每一層可以獨(dú)立演化物理層從以太網(wǎng)換成WiFi、從銅線換成光纖應(yīng)用層的HTTP和SSH完全感知不到變化。排錯(cuò)也因此有了明確方向鏈路層的問題查MAC地址和交換機(jī)網(wǎng)絡(luò)層的問題查IP和路由傳輸層的問題查端口和連接狀態(tài)應(yīng)用層的問題查報(bào)文格式和業(yè)務(wù)邏輯。2.2 先記TCP/IP四層暫緩OSI七層很多初學(xué)者一上來就被“OSI七層模型”勸退。但現(xiàn)實(shí)中真正落地的是TCP/IP協(xié)議族它的分層方式和OSI并不完全一致。與其死記七層的抽象概念不如先建立TCP/IP四層模型這張圖分層核心職責(zé)代表協(xié)議尋址方式應(yīng)用層為具體應(yīng)用提供數(shù)據(jù)語義HTTP、FTP、SSH、DNS無固定尋址靠協(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í)搞不清楚沒關(guān)系等以后分析具體協(xié)議時(shí)再回頭看也不遲。有個(gè)細(xì)節(jié)值得留意鏈路層的以太網(wǎng)幀里有一個(gè)VLAN標(biāo)簽字段802.1Q用來標(biāo)記幀屬于哪個(gè)虛擬局域網(wǎng)。如果你在公司網(wǎng)絡(luò)里抓包看到vlan 100之類的信息這就是鏈路層在干活跟我們常說的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)序列然后把這一串比特通過網(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è)過程叫解封裝。這里有個(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ò)層尋址的核心它回答的問題是“數(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ī)自己”不管有沒有網(wǎng)卡它都能通。開發(fā)調(diào)試時(shí)用127.0.0.1最方便因?yàn)閿?shù)據(jù)不會(huì)真的跑到物理網(wǎng)絡(luò)上純粹在內(nèi)核里轉(zhuǎn)一圈就回來了。第二個(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è)備要訪問互聯(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ǎng)絡(luò)程序時(shí)函數(shù)要優(yōu)先考慮同時(shí)支持IPv4和IPv6比如用getaddrinfo而不是老舊的gethostbyname。不過初學(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ù)庫這就輪到端口號(hào)登場(chǎng)。端口號(hào)是傳輸層用16位二進(jìn)制數(shù)標(biāo)識(shí)的范圍從0到65535它回答的問題是“數(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é)議棧之間的門說完IP和端口終于來到Linux網(wǎng)絡(luò)編程的核心對(duì)象Socket。Socket可以理解成“應(yīng)用程序訪問網(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ò)入口。你通過這個(gè)入口調(diào)用內(nèi)核的協(xié)議棧能力。Linux里一切皆文件Socket也不例外的體現(xiàn)為文件描述符所以你能用read、write來收發(fā)數(shù)據(jù)也能用close來關(guān)閉連接。創(chuàng)建Socket時(shí)最典型的三類參數(shù)地址族類型說明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ú)立沒有連接概念適合音視頻等允許少量丟失的場(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)是上來寫代碼但我建議先學(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跳過域名解析直接顯示IP和端口。輸出大致長這樣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別慌這是正?,F(xiàn)象系統(tǒng)會(huì)在大約60秒后回收這些連接。如果你想知道某個(gè)端口被誰占用了用這個(gè)組合sudo ss -tlnp | grep 8080-p參數(shù)能顯示占用端口的進(jìn)程PID和名字。排查“端口被占用”這類問題時(shí)這條命令比翻代碼管用得多。我見過太多次新手以為bind失敗是代碼寫錯(cuò)了其實(shí)完全是上一個(gè)進(jìn)程沒退干凈。4.2 tcpdump抓到真正的報(bào)文看看理論知識(shí)說得再多都不如親眼看一次數(shù)據(jù)包來得通透。tcpdump是Linux下最經(jīng)典的抓包工具它把經(jīng)過網(wǎng)卡的真實(shí)報(bào)文打印出來。抓TCP連接的過程比如我們后面要跑的服務(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三次握手的完整流程。第一次抓包看不懂沒關(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用來驗(yàn)證目標(biāo)主機(jī)通不通原理是發(fā)送ICMP回顯請(qǐng)求ping -c 4 www.example.com輸出會(huì)顯示每個(gè)ICMP報(bào)文的往返時(shí)間RTT和TTL。RTT大說明網(wǎng)絡(luò)鏈路慢TTL值則能間接看出經(jīng)過了多少跳路由器。如果你剛配置完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)過的每一跳路由器地址traceroute www.example.com這個(gè)工具的原理是利用IP頭里的TTL字段第一次發(fā)一個(gè)TTL為1的報(bào)文第一跳路由器收到后發(fā)現(xiàn)TTL過期返回一個(gè)ICMP超時(shí)報(bào)文于是客戶端就知道第一跳是誰然后TTL加1依次探測(cè)第二跳、第三跳。每次上網(wǎng)卡頓我用ping判斷是不是鏈路問題用traceroute定位卡在哪一跳順序清晰效率也高。5. 實(shí)戰(zhàn)寫一個(gè)最小的TCP回聲服務(wù)5.1 環(huán)境準(zhǔn)備與整體思路接下來的例子需要一臺(tái)Linux環(huán)境以及gcc編譯器。如果沒有最簡單的辦法是裝個(gè)虛擬機(jī)或者在Windows上啟用WSL。注意虛擬機(jī)默認(rèn)使用NAT網(wǎng)絡(luò)模式外部機(jī)器不能直接訪問虛擬機(jī)的某個(gè)端口這會(huì)影響到后面聯(lián)調(diào)具體在第6章展開。這個(gè)demo的目標(biāo)極簡一個(gè)服務(wù)端監(jiān)聽8888端口接受一個(gè)客戶端連接客戶端連上后發(fā)送一串字符串服務(wù)端收到后原樣返回。它不處理并發(fā)、不做協(xié)議解析、不考慮性能就是一個(gè)能跑通的最小閉環(huán)讓你在動(dòng)手層面感受完整流程socket、bind、listen、accept、connect、read、write、close。這不僅僅是“跑通就完事”整個(gè)過程中的每個(gè)系統(tǒng)調(diào)用都會(huì)讓你確認(rèn)前面講的分層模型和協(xié)議狀態(tài)是真實(shí)存在的。5.2 服務(wù)端socket、bind、listen、accept四件套下面是最簡單的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ì)列的最大長度。accept是阻塞調(diào)用沒有客戶端連上來時(shí)進(jìn)程停在這里不動(dòng)有連接到達(dá)后它返回一個(gè)新的套接字文件描述符client_fd這個(gè)新文件描述符才代表“當(dāng)前這個(gè)客戶端連接”原來的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)過雙方確認(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è)例子里用起來像操作文件一樣這也印證了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暴露出的問題這個(gè)程序能跑但它極其簡陋局限也很明顯第一它一次只能處理一個(gè)客戶端。accept之后如果第二個(gè)客戶端連上來誰都不理它因?yàn)槌绦蛘枞诘谝粋€(gè)連接的read上。第二read是阻塞式的如果客戶端一直不發(fā)數(shù)據(jù)服務(wù)端就永遠(yuǎn)卡在那一行。第三收發(fā)沒有消息邊界如果客戶端連續(xù)發(fā)兩條消息服務(wù)端可能一次read讀完也可能分三次讀完怎么切分邊界需要應(yīng)用層協(xié)議來定義。這些不是代碼寫得不好而是所有TCP網(wǎng)絡(luò)程序都要面對(duì)的基礎(chǔ)問題。處理它們要靠多線程、非阻塞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我敢說每個(gè)寫TCP服務(wù)端的人都遇見過這個(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ù)沒發(fā)完主動(dòng)關(guān)閉方要留出時(shí)間處理遲到的報(bào)文。解決這個(gè)問題的標(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)模板抄卻不理解為什么這里必須說清楚沒有它你每次調(diào)試都要干等一分鐘有它在你的開發(fā)體驗(yàn)會(huì)順暢很多。6.2 虛擬機(jī)里連不上別急著懷疑代碼如果你的服務(wù)端跑在虛擬機(jī)里客戶端從宿主機(jī)連接連不上是最常見的問題。這里面的原因通常不是socket代碼而是虛擬機(jī)網(wǎng)絡(luò)模式。VMware默認(rèn)的NAT模式下虛擬機(jī)有自己獨(dú)立的NAT網(wǎng)段宿主機(jī)不能直接訪問虛擬機(jī)。如果你要從宿主機(jī)連虛擬機(jī)的8888端口要么把網(wǎng)絡(luò)模式改為橋接bridge讓虛擬機(jī)和宿主機(jī)處于同一局域網(wǎng)要么配置NAT端口轉(zhuǎn)發(fā)。判斷問題是不是出在網(wǎng)絡(luò)環(huán)境有一個(gè)很省事的辦法在虛擬機(jī)內(nèi)部自己連自己比如客戶端也跑在虛擬機(jī)里連127.0.0.1。如果能通說明代碼沒有問題剩下的就是網(wǎng)絡(luò)拓?fù)鋯栴}。另外還要檢查Linux防火墻某些發(fā)行版默認(rèn)開啟firewalld可以暫時(shí)關(guān)閉或者放行端口sudo systemctl stop firewalld不需要一上來就懷疑協(xié)議棧先看連通性再看端口監(jiān)聽最后看代碼這個(gè)排查順序能幫你省掉大量時(shí)間。6.3 數(shù)據(jù)收不齊TCP流式協(xié)議沒有消息邊界寫網(wǎng)絡(luò)程序最普遍的困惑就是為什么我的read讀出來的數(shù)據(jù)不完整或者一次性讀到了兩條消息。原因是TCP是流式協(xié)議它只保證字節(jié)按序到達(dá)但不保證字節(jié)的“組合方式”。你可以把TCP想成一根水管水連續(xù)地流你從水管里接水接多少取決于你拿杯子的時(shí)機(jī)而不是取決于誰往水管里倒了多少水。應(yīng)用層如果不好好定義消息邊界就會(huì)出現(xiàn)粘包把兩條消息合成一條讀和半包一條消息被拆成兩次讀。解決思路有很多最常見的是這幾種固定長度消息每條消息長度一樣讀完一個(gè)長度再讀下一個(gè)分隔符協(xié)議用\r\n或自定義分隔符切分消息長度前綴每個(gè)消息前面用幾個(gè)字節(jié)聲明消息體長度接收方先讀長度再讀對(duì)應(yīng)長度的正文。這已經(jīng)屬于應(yīng)用層協(xié)議設(shè)計(jì)的范疇第一篇文章不展開但你要先有這個(gè)意識(shí)光靠TCP自帶機(jī)制無法解決業(yè)務(wù)消息的分界問題。6.4 單線程阻塞帶來的并發(fā)瓶頸最后一個(gè)坑也是從入門到進(jìn)階的必經(jīng)坎阻塞IO。accept會(huì)阻塞read會(huì)阻塞意味著一個(gè)單線程程序同一時(shí)間只能服務(wù)一個(gè)連接。很多新手在這里會(huì)把程序改成多線程為每個(gè)連接開一個(gè)線程但線程多了以后又有資源競爭和上下文切換開銷所以業(yè)界主流做法是用IO多路復(fù)用select/poll/epoll配合非阻塞IO用少量線程管理大量連接。第一篇文章不談實(shí)現(xiàn)細(xì)節(jié)只給你一個(gè)宏觀認(rèn)知網(wǎng)絡(luò)編程的下半場(chǎng)是從“能通”走向“能扛”的過程。當(dāng)你的程序從單連接進(jì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ì)端根本沒啟動(dòng)服務(wù)而不是代碼問題。從那以后我養(yǎng)成了一個(gè)習(xí)慣先抓包、再猜原因。這個(gè)習(xí)慣一直用到現(xiàn)在。如果你也是剛邁進(jìn)Linux網(wǎng)絡(luò)編程的門檻建議把tcpdump這類工具用熟讓真實(shí)的數(shù)據(jù)包成為你排查問題的第一依據(jù)。等腦子里有了這張協(xié)議運(yùn)行的全局圖再看后續(xù)的并發(fā)處理、非阻塞IO、epoll一切都會(huì)順理成章。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲精品国产熟女久久久| 欧美制服网站美腿丝袜| 中国黑人三级片网站上区| 欧美日韩啪啪电影| 老师充足的奶水小说| 可以在线观看AV的网站| 性色AV蜜色av色欲av| 天天在线91| 亚洲情色五月天 | 4虎在线视频| 中文字幕一区二区在线日韩精品| 操一对老熟妇爽上天视频| 伊人大香蕉在线| 久精品无码av一区二免费国产在线观看 | 91亚洲狠狠色| 久久日本熟妇熟色高清 | 人人妻人人爽| 亚洲激情色片| 91丝袜美女| 天天躁日日躁AAAXX| 国产对白刺激视频| 久久久性| 欧美另类精品xxxx| 9久久久久久| 人妻天天爽天天爽三区| 色就色综合| **一级毛片国产| 亚洲瓯美色图| 1024精品在线| 天天色,天天干,天天干| 夜夜爽爽爽| 无卡一区=区| 26uuu久久| 色色五月天激情| 污污污8888| 欧美成人一级麻豆| 丁香五月综合| 99re在线视频国产| 精品一区二区国产日韩| 五月天婷婷色| 天天天天天天天天综合| 亚州国产精品乱| 亚洲欧洲日韩中文字幕一区| 夜夜嗷嗷一区二区| 亚洲AV高潮| 97爱爱官网| av在线免费一区二区| 欧美美女在线高潮999| 伊色久人大在线| ,成人免费啪啪视频| 一区二区三区 丝袜 高跟 美腿| 欧美亚洲在线| 先锋影音av先锋一区| 97国产精品国| 日韩无码一级黄色av片| 大香蕉天天看妹子| 美国黄片aaa| xxx亚洲午夜天堂| 福利视频香蕉免费一区二区在线| 96精品在线| 超碰97最新人妻| 青青草十区九区爱夜| 色情五月综合婷婷| 日韩人妻精品久久久久| 黑人精品欧美一区二区蜜桃| 欧美性爱第一区| 搡老女人老熟女91老熟女综合网| 男人天堂网址| 99天堂网| 涩涩涩综合| 啊…啊…操我用力操我| 国产日韩精品人妻久久久久色欲网站| 欧美激情久久久久| 久久精品美女一区| 国产剧情一区在线观看| 可以在线观看AV的网站| 禁止观看美女黄| 97超碰亚洲| 麻豆精品.欧美精品.日韩精品.| 蜜臀久久99精品久久久久| 最新国产精品久久精品| 欧美综合网1| 18禁网站在线播放| 色臀aV| 久久无码一区二区二三区性色| 深夜激情无码| 欧美熟妇操操视频| 99热在线观看| 国产精品夜夜夜| 不卡啪啪视频| 97视频一区| 草草影院在线视频| 国产丝袜视频| www.yw尤物| 国产精品探花视频| 九九热精品免费视频| 97爱综合| 天天天堂影视日韩亚洲91| 九九成人| 约操熟妇| 久久精品91| 麻豆天美传媒在线视频天堂| 能看的AV| 2020国产精品| 国产美女高潮叫床视频| 亚洲 日韩 丝袜 熟女 变态| 日韩三级伊人| 国产97在线 | 亚洲| 男人天堂毛片| 十八禁黄色成人网站观看| 大香蕉伊人色偷偷在线| 黄色网址久久精品欧美喷水| 欧美婷婷五月天| 欧美熟女操屄| 欧美日韩性爱视屏免费看了| 日韩精品永久在线观看| 亚洲日韩国产欧美综合v| 久久久久国产精品片区无码直播| wuyechaopeng| 91在线限制级| 啊啊啊啊嗯嗯嗯用力好爽| 伊人玖玖网| 综合一区二区影视| 成全动漫视频观看免费下载| 久草视频在线视频在线视频在线观看| 91人妻最真实刺激绿帽| 天美国产三级传媒| 男生女生啊啊啊啊| 蜜桃精品视频一区| 97国产色综合| 中文字幕第页| 性色高清在线| 久超碰这里只有精品| 青草精品视频一日本久久久久网站| 快灬快灬 一下爽蜜桃在线观看| 久草午夜| www.人人cao| 日韩亚洲美州欧洲综三区一品在线| 夜夜操天天肏| 日韩欧美麻豆| 中文字幕精品一区欧美| 婷婷亚洲天堂| 天天躁狠狠躁av| 色网站导航大全| 国产成人亚洲精品无码古代早漏男| 亚洲AV无码乱码在线观看性色| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 亚洲免费成人精品电影| 色五月丁香五月| 国产欧美美女免费观看视频| 国产女人操逼视频| 韩三级a视频在线观看| 十八禁视频网站| 综合久| A久久| 97干色天堂| 欧美亚州色的图| 天天热精品| 2017天天插| 人人干黄色| 国产激情av女片自拍| 精品国产片亚洲一区| 97国产超湿| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 久久久精品视频免费观看| 女同性恋久久| 99自拍B亚洲| 超碰99热中文字幕| 怡红院网站在线视频| 91欧美大片| 国产亚洲精品av一区| 五月婷婷六月天| 丁香婷婷激情五月天无毒不卡| 蜜桃臀一区二区aV| 日韩中文字幕精品一区在线| 丁香五月影院| 黑人干亚洲| 国产精品久久久| 激情综合二| 一区二区三区国产精产| 99热在线只有精品| 国产做?爰片久久毛片?片美国| 啪啪91| 亚州五月| 久久毛卡| 亚洲精品骚逼| 四虎精品永久在线播放| 操逼操操操91| 久久久久元码视频| 免费人成毛片乱码| 黄污污污污| 久九9精品| 欧美真人抽搐一进一出gif | 亚洲精品性爱片| 理论久久婷婷网 8| 男同专区一区二区三区在线| 懂色AV蜜臀无码精品APP| 美女大乳久久久久久久女人18| 97综合激情| 国产剧情一区在线观看| 欧美一区二区三区日韩| www色色色com| 久久av一级av少妇av高潮 | 97超碰久| 久久精品视频一区三区小泽玛利亚| 欧差乱伦二三| 91美女视频。| 日本人妻中文字幕 | 国产精品一区二区密臀| 日韩精品高清资源在线| 极品粉嫩少妇视频| 亚洲欧洲久久天堂| 丁香婷婷激情五月天无毒不卡| 日本 成 人 小说 电影 一区二区| 婷婷五月天激情网| 国产吞精a级片激情电影| 啊啊啊免费| 国际精品久久久| 97网站在线观看| 9997se| 校园春色欧美| 东京热激情视频一二三区| 欧美亚洲情色| 84YTCOM性无码| 精品免费囯产一区二区三区| 91青青在线| 精品人妻一区二区三区蜜桃视频| 无码免费在线观看黄色片| 中文字幕一区二区三区蜜臀| 亚洲色图a| 久插综合| 天美传媒麻豆一区二区三区国产精| 欧美,日韩,中文,另类| 综合自拍| 亚洲精品97| 久久久精品网站| 影音先锋每日最新资源在线观看 | 日本超碰97日韩精品人妻| 狠狠搞 亚洲91| 欧美熟妇精品黑人巨大一二三区| 日韩人妻精品中文字幕| 全国男人天堂网| 97超级久久| 久久粉色| 偷拍三区| 五月天激情网站| 久久久9品一区二区三区| 校园春色综合色| 亚洲人码13| 亚洲日韩狠狠撸视频| 男女啊啊啊啊啊| 99色网| 亚洲日韩美国人妻| 激情专区综合| 久久999久| 精品176精品2| 日日骚一区二区三区| 香蕉视频欧美一卡二卡| 亚洲 自拍偷拍 欧美| 密臀成人视频久久久| 欧美日综合| 欧美色人| 色欲天天综合网| 久久久噜噜噜久久久| 日韩97视频| 91综合色| 久久久 国产精品| 黄页大片在线观看| 十八禁电影伊人网| 精品无人区麻豆乱码1区2区图片| 黄页网站成人免费| 国产辣妈在线视频福利| 天天影视色香色欲| 禁十八久久| 久干9操| 无色无码| 黄呦呦在线| 激情综合 婷婷五月 红杏| 老熟女搡BBBB搡BBBB视频| 免费一级视频特黄色大片| 久久嫩草国产成人一区| 亚洲区小说| 免费观看性欧美一级| 丁香五月性爱| 五月天加勒比啪| 日韩精品国产一区二区| 亚洲 欧美 小说| 夜夜嗨视频| 欧美一级美片在线观看免费| 久99久视频精选| 久夜操| 一区二区三区免费岛国片| 天天α片| 日韩免费三级黄片电影| 91丝袜在线观看视频在线观看| 欧美性第1页| 殴美大黄片| 久久99草| 天天天乱色综合全| 大黄片做爱的大的| 婷婷15月天青娱乐| 岛国AB视频| 91亚州欧美| 国产女同视频在线播放| 91暧暧| 日韩免费簧片| 欧美少妇性乱| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 亚洲图片欧美91N| 麻豆一区二区三区在线看| 偷拍自拍在线视频观看| 精品制服美女中文一区二区三区| 日本不卡二区| 91丝袜激情在线| 国产精品亚洲天堂网址| 热的中文 热的有码 热的国产| 人妻一二三区| 中文字幕一区二区三四五区日日骚| 亚洲无无码αⅴ每日更新| 欧美色997| 操B视频日韩无码| 亚洲、日韩、综合、另类| 97天堂| 青草青青久久久久久国产| 神马久久久久| 久久一二三四不卡| 精品偷拍13p欧美dodk视频| 97在线资源| 99re在线精品78| 一类无码操逼视频| 91成人精品| 在线黄页看毛片| 久久夜夜| 日韩综合97P| 五月婷婷爱六月丁香色| 亚洲色图一区二区三区| 欧美 牲| 欧美天天弄| 色天堂综合| 日本性爱少妇| 午夜性生活av免费在线看| 日本最新免费韩国1区2区视频播放| 99re公开精品免费视频| 久久国产精品一区二区| 成人久久精品| 伊人久久婷婷| 超碰国产精品无码| 南澳成人一级片在线播放| 校园春色制服丝袜中文字亚洲| 亚洲码在线中文在线观看| 久久久久久裸体| 熟妇熟女亚洲天堂网| 免费少妇一区二区| 天天肏夜夜肏| 日日嗨AV一区二区夜夜| 97人妻色| 国产精品午夜高潮呻吟久久av| 国产在线播放成人免费| 激情婷婷丁香网| 美女啊啊啊啊啊啊啊| 日本无码1| 日韩欧美大片免费高清啪啪| 欧美图片校园春色| 老鸭窝黄色视频网站| 久久久亚洲高清不打码| 国产精品91一样| 高清无码 国产精品| 中文字幕在线免费观看 | 欧美操逼熟女| 一级性爱网| 情色大香蕉| 欧美 牲| 成人一二| 在线岛国新天堂8| 嫩草91| 免费视频在线观看啊啊啊啊啊| 69精品久久久久中文字幕| 欧美欧美啪啪视频| 亚洲少妇视频| 骚人妻少妇视频| 欲射影视| 久久香蕉超碰97国产精品| 国产少妇肉丝在线观看| 99免费在线视频| 免费A V在线播放| heyZO天然素人无码AⅤ专区| 午夜美女福利视频| 色激情综合网站| 色约约一区=区三区| 国产精品视频在线播放| 1204av韩国| 大香蕉伊在线久草麻豆天堂故事| 91亚洲影院综合| 啊好爽受不了无码| 欧美中字二区| 曰本91情色| 91九九九逼| 国产午夜福利视频在线| 国产盗摄美女如厕大神作品在线观看 | 午夜男人天堂| 六月丁香五月婷婷| 97精品国产97久久久| 丁香五月性爱| 欧美精品99久久久| 97在线观| 91n欧美| 国产熟妇 码视频户外直播| 探花视频免费观看国产专区| 色黄污美女啪啪啪免费网站| 日韩欧美成人午夜福利| 操婷婷逼| 手机av天堂久久久久| 久久一区无码| 青青草色情网站视频| 91天美传媒精品| 天天日美女的B| 人妻激情视频| 欧美日综合| 欧美日本成人一区二区| 91大神精品长腿在线观看网站| 8x福利精品第一福利视频导航| 精品久久久久久无码| 亚洲欧美在线观看免费| 果冻国产精品麻豆成人av| 中文字幕一区日韩精| 九九热免费国产视频婷婷伊人五月| 这里是精品| 午夜精品久久久久| 97 国产精品| 久久色网| 干干干天天| 亚欧国产无码精品在线| 日韩一区二区精品视频| 精品一久久久| 欧美国产婷婷久久| 国产一级137片内射麻豆| 久久激情五月| 久久夜夜夜夜| 欧美姓爱综合网| 欧美日韩不卡a片| 97av在线视频| 国产人妻一区二区三区欧美毛片| 久久久亚洲精品中文字幕人妻| 激情黄色片在线观看| 亚洲AV无码黄色强奸| 91啪啪| 久久久久国产精品久久久| 国产精品不卡av免费在线观看| 偷拍三区| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 欧美色棕合| 天天享受天天看| 呦女网站| 一级AV性爱| 另类综合另类| 色天天野狼综合社区| A片A5445444| 五月丁香六月激情| 看看日B真人视频| 无遮挡男女激烈动态图| A久久| 热热色色综合| 久久久久夜夜夜夜| 美女黄色一级A视频| 国产热av| 久操网无码在线| 久久不卡一区二区| 色欲久久久久综合网| 欧美日韩性爱精品| 91热色| 搡老女人老妇女AAA一VU麻豆 | 九九热九九| 久久久久国产精品片区无码直播| 91高跟美女在线播放| 五月丁香六月综合缴清无码| 99热超碰| 国产捆绑一区| 亚洲av淫乱| 大乔未久88一区| 亚洲AV成人无码一二三久久 | 熟妇人妻精品一区二区| 亚洲日韩XXX| 久久久亚洲熟妇熟女| 欧美精品999| 97在线/亚洲| 国产大学生高潮在线播放 | 亚州男人天堂| 日韩成人性爱电影在线播放| 亚春色色| 亚洲操操操| 一本色道综合久久欧美日韩精品| 人妻熟女午夜精品在线| 亚洲97在线| 大奶啊啊好爽| 久久久久久加勒比| 人妻少妇精品一区二区三区| 久久黄人人爽视频| 午夜性| 一牛影视成人片免费| 色呦色呦色精品| 伊人女女资源在线观看| 好爽免费视频| 亚洲综合113页| 色黄污美女啪啪啪免费网站| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 热G综合热G中文| 免费人成?大片在线播放| 天美久久久久| 黄色小说亚洲| 人人操人人大香蕉| 熟妇亚洲一区二区三区| 国产丝袜美女在线一区| 国模限制级电影| 大香蕉中文| 国产精品久久发布| 国产操操日韩三级黄| 禁十八久久| 国产精品色哟哟| 人人操人人摸人人骑| 91天美传媒精品| HEYZO高无码国产精品227| 国产午夜精品一区二区三区牛牛| 蜜臀人妻少妇久久在线观看| 激情综合网五月婷婷五月天| 蜜臀99久久国产| 天美传媒在线一区| 久久久国产成人一区二区三区在线| 免费视频一二三区| 亚洲青色欧美| 一区麻豆 高清中文字幕| 精品国产一区二区三区四区在线看| 中文字幕无码不卡啪啪| 欧美色一二三| 亚洲天堂无码| 亚洲伊人久久综合97| av日韩中文字幕| 日日夜夜国产综合| 婷婷五月色| 日韩卡一卡二卡三在线| 色色色日本| 亚洲一区二区av| 330dv亚洲成年视频网| 色噜噜精品一区二区三| 性久久久| 偷拍 亚洲 欧美| 不卡六六在线91| 欧美青青视频| 激情露脸爱| www.婷婷| 久久久国产三级黄色片| 久久精品店| 亚洲成aⅴ人片不卡无码| 日日躁夜夜躁狠狠躁超爽| 日韩精品操少妇| 日本三级久| 国产精品午夜高潮呻吟久久av| 亚洲无码国产精品久久| a片自拍直播视频| 啊啊啊啊好疼| 久久九九97| 偷窥自拍亚洲| 国产夫妻性生活视频| 啊嗯嗯啊好大好爽| 91成人久久| 久久骚| 大香蕉男人的天堂| 大香伊人在线一区| 嗯嗯啊啊好疼| 无码人妻精品一区二区三区九九| 操学生天天| 久久麻豆一区二区| 91丨国产丨白浆| 中文字幕一区 二区三四五 区日 日骚 | 婷婷AV一区二区三区| 亚洲精品性爱片| 另类TS人妖一区二区三区| 91在线免费精品视频| 国产精品一区二区三区在线| 人妻天堂网| 天天伊人| 午夜福利一区二区影院| 嫩呦国产一区二区三区AV| 国产传媒午夜理伦精品| 色y情视频免费看| 色欲天天综合久久久无码网中文| 五月亭亭六月丁香| 天天爽夜夜爽夜夜爽精| 极品国产内射| 日产123区精品免费观看| 久久久久久久久久久久黄色 | 人人艹亚洲| 久久亚洲AV无码专区国产精品 | 天天色综合图片| 校园春色制服丝袜中文字亚洲| 久久久久久大| 日本男人插女人的逼黄色| 91成人社区| 成人九九| 欧亚 另类 久| 欧美色综合图片| 欧美亚洲手机在线| 无码操逼网| 素人美腿视频网站| 色综合1991| 国产在线视频午夜精华在| 免费观看国产小粉嫩喷水精品午| 国产丝袜视频| 风骚少妇视频中文字幕| 秋霞免费无码视频日韩A片| 自拍偷拍2025在线观看| 中出789在线视频| 密臀视频三区免费网站| 顶级丝袜熟女一区二区三区| 久久一二三四不卡 | 国产超碰| 欧美96交| 日日操天天操| 一卡二卡三卡| 天天干一干| 激情在线青青操| 六月激情婷婷| 粉嫩av在线| 五月婷婷色色| 激情小说亚洲色图| 超碰人人妻| 中文操逼字幕| 久草色悠悠在线视频| 91在线免费精品视频| 91精品黄在线观看| 精品人妻一区二区三区免费视频| 久久久免费一级黄片| 欧美国产操逼| 欧美久久草熟女| 日韩免费看在线黄色片| 黑人精品久久97| 日本三级韩三级99久久| 色综合大香蕉| 六月丁操逼| 中文字幕av乱伦| 夜草网站| 欧美色图综合网| 伊人亚洲综合| 日韩三级一区| 91丨熟女丨丰满熟女| 欧美综合自拍亚洲综合图| 久久性视频| A级毛片在线看免费| 久久亚洲AV无码白度| 国产精品不卡一区二区三区| 丁香五月激情网| 国产精品毛片?v一区二区三区| 97免费在线观看| 亚州综合色图| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 性一交一乱一交A片久久四色| 久草尤物| 亚洲色图欧美色图综合| 色偷偷超碰亚洲| 天天天肏屄欧美| a级理论午夜日本| 偷拍亚洲熟女视频播放| 亚洲天天操| 97超碰伊人| 72av视频| 骚货操死你| 超碰在线成人电影| 日本九九久久99| 美女97超碰| 黄色成品网站| 亚洲熟女国产综合另类| 亚洲女毛多水多21P| 少妇一区二区三区高速| 激情欧美97| 男人精品区| 91无码人妻精品一区二区三区蜜桃| 极品色社| 九九成人| 欧美亚洲影视| 色九九九| 六六久久日韩不卡| 欧美 日韩 另类 亚洲| 日日天天久久啊啊aaa| 能看的AV| 国产超碰欧美| 怡红院成人视频| 变态综合色| 久久欧美激情| 男女啪啪网站免费视频| 色官网色综合| 日本三级韩国三级99| 97人人中文网| 人妻熟妇久草在线| 日韩有码中文字幕女同性恋 | 亚洲天堂另类| 免费亚洲黄色视频在线观看| 色婷婷99| 日日干日日操五月天伦理视频| 国产精品不卡一区二区三区| 国产综合久| 九九九精品成人免费视频小说| 97在线观看播放视频| 国产福利在线视频网站| 色欲久久综合| 国产十八禁视频| 哈哈操电影| 黑丝自慰喷水网站| 亚洲国产一区二区三区在线 | 啊啊啊要高潮了| 夜夜欧美 | 女人的久久久| 人人做天天爱| 9997se| 亚洲人在线| 熟女中出视频| 大香蕉一人在线| 激情视频图片| 九九av| 亚洲成人ab| 人妻偷拍一区二区三区| 蜜乳AV色欲AVAV无码| 青青草色情网站视频| 亚洲精品久久久久毛片A片拉屎 | 日韩人妻一二三区视频 | 欧美性爱五月天| av资源在线播放天堂| 亚洲青青草| 粉嫩在线一区二区懂色| 美女91网| 美女人妻色网站| 国产免费一区2区3区| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴| 歐美一級亂黃99在綫精品| 欧美日韩久久精品爱爱| 性生活久久久久久久久久| 中国AV美女| 天天综合站| 99久久网站| 网友自拍第一页| 九九九九精品一区| 国内自拍 日韩激情 99| 蜜乳成人AV| 色69大色97香蕉| 麻豆久久久久久久久丝袜 | 久午视频| 老鸭窝成人| 麻豆激情综合| 伊人成人情色综合| 99re9在线| 中文字幕av乱伦| 亚洲高清无毛一区二区| nuu12国产麻豆精品| 天天透伊人| 天天做日日做| 天天综合网在线观看| 久久综合18p| av在线免费一区二区| 久草加勒比一区在线| 丰满欧美放荡少妇在线| 亚州色阁| 91欧美综合在线| 天天综和| 美女干逼2| 日本黄页视频在线观看| 天天影视综合网欧美精品| 亚洲欧美日韩免费电影| 又大又大又大又粗爽高潮观看 | 日韩99神马视频片| 99re视频在线观看这里只有精品| 香蕉99秘 一区精品蜜桃臀| 国产99999| 久久亚洲日韩国产欧| 国产天天骚| 91jk色拍| 中文字幕精品丝袜| 亚洲免费看片| 亚洲欧洲国产综合av| 97免费在线| 中文色综合| 亚洲日韩美国人妻| 国产女乱淫真高清免费视频| 人人插人人搞人人操| 天天爱天天操| 美女露胸露奶头| 精人妻无码一区二区三区伊人直播| 日韩大香蕉精品在线视频| 久久久一区二区| 人人 操人人 操人人| 人人弄人人摸| 男女激烈网站最新| 亚乱色| 1024香蕉视频| 新视频sss国产| 中文字幕一区二区三区50路| 欧综合网| 乱伦3P视频| 厕所偷拍在线| 极品色综合| 人人性爱视频免费| 欧洲成人性爱视频| 色哟哟综合| aⅴ日韩成人电影av在线免费看av大全 | 婷婷精品| 超碰9 7女人 | 精品91摸| 日本一级不卡一二区| 狠狠久久手机视频精品| 久久国内| 欧美一区二区传媒| 欧美精品精品一区二区| 国产操逼逼网| 男女91| 日韩av熟女一区二区三区成人| 欧美熟女妇同| 日韩av性爱在线播放| 亚洲啪啪视频一区二区| 五月天黄色激情视频| 熟女一区二区| 免费操逼91| 1区2区3区在线视频| 欧美熟妇精品黑人巨大91| 黄色免费网页无码| 歐美性天天| 日本丝袜人妻内射| 一本大道青青| 天天干一干| 90后后入| 91网站18在线观看| 亚洲欧洲av影音| 精品美女少妇一区二区三区| 日本熟女免费視颖| 欧洲精品区| 国产精品久久天天干| 久久鲁夜| 无码聚合| 天天看片青娱乐| 精品国产一区二区久久| 日韩黄片影院| 久久女同性恋一二区| 中国女人内射6XXXXX| 黄片aaaaa一区| 久久熟妇五十路一区| 亚洲AV无码AV吞精久久久久| 色区97| 97碰碰日本乱偷人妻中文的| 蜜臀99999| 思思热久久成人| 欧美日韩在线小说| 男人把坤坤插入女人的下体| 婷婷综合久久| 中文字幕国产| 欧美成熟性爱精品| 伊人九九| 久久系列| 精品视频一区二区| 日韩人妻少妇 一区二区三区| 国产精品懂色tv影视免费观看| 久9久9久9久9久9久9| 神马福利久草| 婷婷五月天在线观看| 国产免a费看黄片在线| 日本免费中文字幕在线| 久操影视| 91在线丝袜| 最新9久久久9免费视频| 乱老熟女一区二区三区| 久久综合九九| 亚洲 图片 综合91| 国产精品麻豆成人AV艾秋| 大香蕉黄色一区| 性色av网站| 亚洲日韩成人性爱视频| 国产探花精品在线| ji熟女.com| 岛国视频免费在线观看| a级理论午夜日本| 国产成人无码久久精品| 日韩精品中文字幕二区| 九九黄色网| ′ !γ}丶。。久久精品欧美一区二区三区| 丰满人妻一区二区三区| 老色69| 综合欧美日韩在线| 亚洲精品九九九九九九| 色路综合| 日韩欧洲操屄视频| 国产一级操B视频| 亚洲 欧美 中文 日韩超碰| 中文字幕片| 中文精品少妇天堂| 91精品人| 国产在线视视频有精品| 午夜精品99久久久久传媒| 国产热av| 成人av性爱电影在线观看| 亚洲最新av无码成人精品区| 另类专区在线观看| 亚洲色图国产另类| 91 天天综合| 亚洲毛片一级带毛片基地| 婷婷五月丁香五月| 亚洲性图91| 日韩有码 一区二区三区| 国产AV超爽| 性九九九九九九| 伊人黄色片| 澳门成人网站久国产日韩| 日本黄色天堂| 亚洲AV无线| 欧美激情片一区二区| 99热在线播放| 国内91熟女人妻丝袜天天精品视频在线| 日韩欧美丝袜诱惑| 国产精品一二三区18| 亚洲天堂中文字幕无码男同| 妇女乱色二区| 我要去看2个日本美女.com曹逼| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 久久婷婷欧美| 九九精品99| 日韩99神马视频片| 亚洲一区日韩精品| 亚州春色| 视频国产欧美在线播放| 久色99999| 午夜偷拍久久熟女| 一级免费精品| 91熟女熟妇视频网站| 天天综合,91入口| 爱射综合| 久草视频在线视频在线视频在线观看| 欧美熟爽综合| 日韩免费高清大片在线| 色在线69堂| 天天射影院| 久久成人国产精品| 道久久五香丁月婷婷激情综合| 亚洲色图日韩精品| 我想要 啊 啊 啊| 老熟女乱伦片| 亚洲日韩肥臀视频在线观看| 亚洲欧洲色情高清| 青青久操| 国产乱婷婷精品二区三区| http://qxhbdz.com| 大香蕉av在线| 丁香五月婷婷色| 欧美做爰无码A片视频| 亚洲精品久久久久久久蜜桃臀| 人妻干天天| 亚洲天堂一区二区久久| 高清国产精品福利网站| 国产91影院| 欧美传媒| 日韩激情毛片一级久久久| 成人小说视频在线精品欧美| 亚洲在线网站| 精品中文字幕一区二区| 波多野42部无码喷潮在线观看 | 制度丝袜99| 一本一道vs波多野结衣| 久草网站免费在线观看| 两性综合网| 爱我干综合| 伊色综合天堂色97| 91久久精品国产| 五十路熟女工口| 国产精品国产| 男生通女生屁股| 大香蕉伊人网| 国产精品人妻一区二区| 91c色| 久操视频资源站公开| 天天插天天射| 丁香色色网| 色婷婷成人综合| 啊啊啊好疼| 国产综合久| 超碰免费人妻人人| 精品成人动漫一区二区| 亚洲天堂 视频你懂的| 乱伦av麻豆| 开心五月激情网| 北京美女一区二区| 我想要啊 啊 啊| 偷拍偷窥与盗摄视频专区| 国产对白刺激视频| 色综合五月天| 男人把坤坤插入女人的下体| 91男人综合| 国产福利视频精品视频| 国产日韩在线播放| julia在线观看久久| 国产十八禁视频| 97爱亚洲| 国产九九九九九九九九| 亚洲精品丝袜-不卡成人免费…… 久久久久成人蜜桃精品 | 97操| 欧美精品成人在线播放| 女人午夜视频777| 91最新综合| 97在线观看免费| 国产亚洲性生活视频播放| 在线观看无码三级少妇| 色综合五月天| 好舒服视频| 少妇精品久久| 92人人操人人| 中文字幕一二三区| 人妻精品一区二区三区| 免费的很黄很污的全部视频| 国产精品色色| 日韩电影免费网站麻豆视频| 免费a v| 狠狠操狠狠爱| 91久久久老司机| a片在线播放| 日韩精品一区二区三区四虎影视| 91天天爱| 久久久久久99AV无码免费网站| 牛黄色久午久| 人妻超碰青青草98| 久久五十路熟女人妻| 黄页大片在线观看| 亚洲欧美伦综合| 亚洲超碰AV| 大香蕉综合在线| 天天插夜夜操| 91女人的网站| 性天堂| 婷婷六月天| 水滴偷拍| 激情五月天丁香| 99在线啪| 女人被男人桶爽视频网站| 狼人综合婷婷激情四射| 色婷婷一区二区三区久久| 五月天黄色激情视频| 中文欧丝袜诱惑| 日美免费黄片| 欧美一级专区免费大片| 亚洲精品人妻在线| 极品内射| 国产东北女人在线视频| 精品成人女人久久| 亚洲成aⅴ人片不卡无码| 日本999精品视频| 日韩少妇无码| 亚州成人a∨| 日韩免费中文字幕视频| 亚洲欧美九九| 100啪啪视频大全| 97国产天堂岛| 亚洲图片日本AⅤ欧美在线| 亚州 综合 色图| 一区不卡在线观看av| 另类视频在线| 日韩精品在线观看网站| 亚洲欧美91√| 综合激情五月天| 91女优在线观看| 操美女高潮抽搐白浆| 97在线视频网站| 亚洲欧美激情另类色图| 精品国产av一区二区三区四区入口| 操香逼| 欧美性爱第一区| 亚洲91射| 色五月婷婷网| 秋霞一集毛片观看| 国产青青美女玩逼视频| 日韩欧美中文日韩欧美色| 午夜九九| 四虎影库国产精品免费| 天天色图| 人妻丝袜肏逼| 久久久免费一级黄片| 五十路三区在线| 国内操逼视频二区| 国产高清在线观看欧美| 午夜福利合集| 亚洲中文字幕乱码无码一区二区 | 99re6久热只有精品6在线直播| 极品国产内射| 久久超碰av在线| 丝袜剧情| 欧美第一页| 色悠久久久av| 天天爽天天| 亚洲色图欧美色图日韩色图| 超碰人人干天天射| 亚洲91av| 欧美日韩中文亚洲v在线综合| 91黑人狂躁丰满熟妇| 97色视频在线| 色婷婷影院| 又大又大又大又粗爽高潮观看| 一区二区三区色综合| 极品五月天噜噜| 亚川综合视频| 91老司机在线| 九九九九97| 1024久久高清视频| baiduhicn.com。| 国产亚洲色婷婷久久99精品91| 精品国产一区探花在线观看| 亚洲加勒比色图| 欧美不卡二区| 另类天堂| 日产中文字幕2020| 97人人草| 国产 无码 一区二区| 成人性生活高清视频在线播放| 大肉棒导航| 爱av免费| 欧美日韩另类激情图片| 色www精品视频在线观看| 日韩精品一区的| 波多野42部无码喷潮在线观看| 久久久久久久九九九九| 日本熟妇精品九九| 中文字幕88av在线| 欧美一区91大爱| 久久精品亚洲成a人天堂| 久久免费99精品久久久久久| 丝袜美腿av女优在线| 加勒比五月天| 在线亚洲精品久久久| 高清不卡国产| 色吧综合网| 久久婷婷综合国际产色怕| 久久首页| 无码久久国产| 中文一区二区三区影院| 亚洲欧美在线丝袜| 久久网亚洲| AV男人天堂网| 色九九综合AV| 97青娱乐超碰久久| 97欧美精品综合| 午夜福利久久久噜久噜久久综合 | 超碰国产在线| 国产超碰国产97| 亚洲成人碰碰| 99精品久久| 强奸乱伦大香蕉网| av在线免费一区二区| 18禁美女裸体无遮挡啪啪| 激情小说日韩无码| 亚洲日韩在线a不卡99精品| 精品人妻一二三| 97超碰9| 伦理第一页| 69精品| 中文乱码字幕观看| 大香蕉一级黄色片久久| 97在线免费视频| 神马久久午夜| www国产无码| 日韩免费a级毛片无码a∨| 国产97在线视频|