国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

Linux套接字編程基礎(chǔ):IP端口、字節(jié)序與TCP/UDP

Linux套接字編程基礎(chǔ):IP端口、字節(jié)序與TCP/UDP 寫 Linux 網(wǎng)絡(luò)編程的代碼最先卡住人的往往不是多路復(fù)用也不是高性能模型而是 bind 返回失敗、連接超時、對端收到的數(shù)據(jù)是一串亂碼這三件小事。這三個現(xiàn)象背后分別對應(yīng)著端口、地址和字節(jié)序——也就是Linux 網(wǎng)絡(luò)編程里**套接字socket**這套機制最基礎(chǔ)的那層預(yù)備知識。很多人一上手就抄一個 TCP 回顯服務(wù)器的模板代碼跑通了就以為會了等真正要改端口、要跨機器、要自己定協(xié)議的時候立刻原形畢露。這篇內(nèi)容想做的事很明確把套接字這層抽象下面壓著的基本概念一個個翻出來講清楚包括 IP 與端口怎么組合成一個可尋址的通信端點、字節(jié)序為什么必須轉(zhuǎn)換、TCP 和 UDP 的取舍到底在取舍什么、sockaddr這一族結(jié)構(gòu)體為什么要繞這么一圈。它適合剛接觸 Linux 系統(tǒng)編程的同學(xué)也適合寫了幾年業(yè)務(wù)代碼、但一直沒系統(tǒng)梳理過網(wǎng)絡(luò)基礎(chǔ)的人。文中會給出可直接編譯運行的示例、參數(shù)計算過程和我在實際調(diào)試中踩過的坑你可以當(dāng)成一份動手前的檢查清單來用。1. 先把地圖畫清楚套接字在整個網(wǎng)絡(luò)通信里站在哪一層1.1 從一次文件傳輸說起網(wǎng)絡(luò)編程到底在折騰什么假設(shè)你在本機寫了一個程序要把一個文件的內(nèi)容發(fā)給另一臺機器上的程序。最樸素的想法是我打開網(wǎng)卡、把字節(jié)一個個推出去。但這件事在用戶態(tài)根本做不了網(wǎng)卡是硬件訪問它要走驅(qū)動而驅(qū)動屬于內(nèi)核。所以真實的路徑是你的進程調(diào)用一組系統(tǒng)調(diào)用把我要發(fā)這些字節(jié)給某個目標(biāo)這個意圖告訴內(nèi)核內(nèi)核里的協(xié)議棧負(fù)責(zé)封裝、校驗、重傳、路由最后交給網(wǎng)卡。這組系統(tǒng)調(diào)用對外暴露的接口就是套接字。理解這一點非常重要因為它決定了套接字 API 的性格它不是一個函數(shù)調(diào)用就完成通信而是你去內(nèi)核里登記一個通信端點然后對這個端點做讀寫。所以你會看到socket()創(chuàng)建一個東西、bind()給它掛地址、listen()讓它能接客、accept()從它身上取新連接這一串動作本質(zhì)是在內(nèi)核里維護一份數(shù)據(jù)結(jié)構(gòu)而不是在用戶態(tài)算什么東西。判斷一個概念屬不屬于預(yù)備知識我的標(biāo)準(zhǔn)很簡單如果不搞清楚它你寫出來的代碼能跑但一改環(huán)境就崩。IP、端口、字節(jié)序、協(xié)議類型、地址結(jié)構(gòu)體全部符合這個標(biāo)準(zhǔn)。1.2 套接字的本質(zhì)一層被操作系統(tǒng)抽象出來的文件在 Linux 上socket()的返回值是一個int和open()返回的東西是同一類——文件描述符。這不是巧合而是有意為之的設(shè)計把網(wǎng)絡(luò)通信抽象成文件讀寫用戶態(tài)就能復(fù)用同一套 I/O 模型阻塞、非阻塞、select/poll/epoll、O_NONBLOCK等。于是你可以在 socket fd 上做read()/write()也可以用send()/recv()還能把它塞進epoll的監(jiān)聽集合里。但這層像文件的抽象并不完全幾個地方會露餡。文件有偏移量可以lseek到任意位置讀socket 不行它是流讀過就沒了文件有明確長度stat一下就知道多大socket 不知道對端還會發(fā)多少只能一直讀到對端關(guān)閉或按協(xié)議自己定邊界文件關(guān)閉通常沒有副作用socket 的close()會觸發(fā)四次揮手關(guān)閉時機不對會留下TIME_WAIT。這幾個差異點恰恰是后面所有坑的源頭。我個人的建議是初學(xué)時把 socket 當(dāng)文件用完全沒問題能快速跑通但一旦開始調(diào)性能或者排查異常就必須切換到這是一個有狀態(tài)的雙向字節(jié)通道的心智模型。1.3 預(yù)備知識清單為什么這些概念繞不開把要講的東西列個清單后面的章節(jié)就按這個骨架展開通信端點怎么唯一標(biāo)識IP 端口、數(shù)據(jù)在內(nèi)存里怎么排字節(jié)序、通道提供什么保證TCP / UDP、內(nèi)核用什么結(jié)構(gòu)描述端點sockaddr家族、以及這些 API 之間靠什么約定串起來返回值、錯誤碼、阻塞語義。這份清單不是憑空列的。你回頭看那三個典型故障bind失敗八成是端口被占或者地址填錯落在清單第一項連接超時可能是 IP 不可達、防火墻攔了、也可能是監(jiān)聽端bind在127.0.0.1上只收了本機連接還是落在第一項數(shù)據(jù)亂碼幾乎必然是字節(jié)序或者結(jié)構(gòu)體對齊落在第二項。換句話說套接字編程里絕大多數(shù)看起來詭異的問題都能在這份清單里找到歸屬。把清單吃透調(diào)試就從猜變成查。2. IP 與端口給通信雙方一個能寄到的地址2.1 IP 地址定位到哪臺機器IP 地址解決的是哪臺主機的問題。IPv4 是 32 位寫成點分十進制是為了人看比如192.168.1.10本質(zhì)上就是四個字節(jié)。理解這一點很關(guān)鍵因為代碼里sin_addr.s_addr存的就是這 32 位整數(shù)不是字符串。你要么用inet_pton()把字符串轉(zhuǎn)成整數(shù)要么用htonl()把主機序的整數(shù)轉(zhuǎn)成網(wǎng)絡(luò)序絕不能直接把字符串memcpy進去。幾個必須分清的特殊地址0.0.0.0INADDR_ANY作為bind的參數(shù)時表示綁定本機所有網(wǎng)卡的所有 IP。服務(wù)端幾乎都用它因為一臺機器可能有回環(huán)、有線、無線多個地址寫死某一個會導(dǎo)致?lián)Q網(wǎng)就收不到連接。127.0.0.1回環(huán)地址只在本機內(nèi)部有效數(shù)據(jù)不出網(wǎng)卡。作為bind參數(shù)時只有本機進程能連上作為connect目標(biāo)時只能連本機的服務(wù)。255.255.255.255受限廣播地址只有開啟SO_BROADCAST才能發(fā)。私有地址段10/8、172.16/12、192.168/16內(nèi)網(wǎng)使用跨網(wǎng)段需要轉(zhuǎn)換。這里有個經(jīng)典誤解很多人以為bind到0.0.0.0就等于對外開放。實際上它只決定監(jiān)聽哪個地址能不能被外部連上還取決于路由和鏈路上的訪問控制。反過來如果你在開發(fā)機上把服務(wù)bind到127.0.0.1然后用另一臺機器去連會一直超時——這不是代碼 bug是本就沒打算讓你連。2.2 端口號定位到哪個進程IP 只到機器機器上跑著幾十上百個進程數(shù)據(jù)到了該交給誰靠端口。端口是 16 位無符號整數(shù)范圍 0 到 65535和 IP 組合成IP:Port這個二元組才能唯一標(biāo)識一個通信端點。不過嚴(yán)格來說標(biāo)識一個 TCP 連接的完整四元組是源IP : 源端口 : 目的IP : 目的端口。這也是為什么同一臺服務(wù)器可以同時接受成千上萬個連接目的 IP 和目的端口相同但客戶端的源 IP 和源端口不同四元組依然唯一。理解這個四元組你就明白了為什么服務(wù)端只監(jiān)聽一個端口卻能服務(wù)大量客戶端這件事在邏輯上是成立的也就不容易被一個端口只能一個連接這種錯誤直覺誤導(dǎo)。端口在 Linux 上分三段用途和權(quán)限完全不同范圍名稱典型用途權(quán)限要求0 - 1023知名端口HTTP(80)、SSH(22)、DNS(53)傳統(tǒng)上需要特權(quán)Linux 可通過net.ipv4.ip_unprivileged_port_start放寬1024 - 49151注冊端口各類中間件、數(shù)據(jù)庫默認(rèn)端口普通用戶可用49152 - 65535動態(tài)/臨時端口客戶端connect時內(nèi)核自動分配普通用戶可用寫代碼時有一個細(xì)節(jié)容易被忽略bind的端口傳 0表示讓內(nèi)核幫我挑一個空閑端口內(nèi)核挑完后可以用getsockname()讀出來。這個技巧在寫測試用例、寫需要動態(tài)端口的服務(wù)時特別有用能徹底避免端口沖突導(dǎo)致測試隨機失敗這種情況。2.3 IP 與端口的組合方式以及結(jié)構(gòu)體里為什么要留一個sin_zero在代碼層面IPv4 的地址信息裝在struct sockaddr_in里核心三個成員sin_family地址族填A(yù)F_INET、sin_port16 位端口網(wǎng)絡(luò)字節(jié)序、sin_addr32 位 IP網(wǎng)絡(luò)字節(jié)序。這三個字段的填法幾乎決定了bind和connect能不能成功。struct sockaddr_in里還有個sin_zero[8]很多人不知道它是干嘛的。原因是歷史上的struct sockaddr總長 16 字節(jié)而sockaddr_in的實質(zhì)內(nèi)容只占 8 字節(jié)剩 8 字節(jié)用它填充對齊保證兩者大小一致這樣bind(sockfd, (struct sockaddr *)addr, sizeof(addr))這種強制轉(zhuǎn)換才安全。這個字段必須清零標(biāo)準(zhǔn)做法是定義后立刻memset(addr, 0, sizeof(addr))否則殘留的棧上垃圾數(shù)據(jù)在某些實現(xiàn)上會引起地址比較異常。我見過有人省略 memset 之后在bind時偶發(fā)EINVAL排查了很久最后就是這 8 個字節(jié)沒清干凈。2.4 端口相關(guān)的三個高頻坑端口被占用EADDRINUSE。最常見的原因是上一個進程沒退干凈或者進程重啟太快、舊連接還處于TIME_WAIT。TIME_WAIT是主動關(guān)閉方才會進入的狀態(tài)持續(xù) 2MSLLinux 上約 60 秒目的是保證最后一個 ACK 能被對端收到、并讓舊連接的殘留報文在網(wǎng)絡(luò)中消散。服務(wù)端頻繁重啟時幾乎必然撞上解決辦法是給監(jiān)聽 socket 設(shè)置SO_REUSEADDRint on 1; setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on));注意SO_REUSEADDR解決的是地址處于 TIME_WAIT 時仍可綁定不是兩個進程同時綁同一個端口。后者在 Linux 上需要SO_REUSEPORT語義完全不同不要混用。綁定地址寫死。開發(fā)時圖省事寫inet_addr(127.0.0.1)上線后容器內(nèi)其他服務(wù)連不上。這類問題在容器化環(huán)境里尤其常見因為容器的回環(huán)和其他容器的網(wǎng)絡(luò)命名空間是隔離的。用inet_addr()判斷錯誤。這個函數(shù)轉(zhuǎn)換失敗時返回INADDR_NONE而INADDR_NONE的值恰好是255.255.255.255也就是說你無法區(qū)分輸入非法和輸入就是廣播地址。新代碼一律用inet_pton()它的返回值語義清晰1 成功、0 格式不對、-1 地址族不支持。3. 字節(jié)序跨機器傳數(shù)據(jù)繞不過去的第一個坑3.1 大端與小端到底差在哪一個 32 位整數(shù)0x01020304在內(nèi)存里占四個字節(jié)。如果低地址存01、高地址存04叫大端Big-Endian如果低地址存04、高地址存01叫小端Little-Endian。x86 和大部分 ARM 是小端部分嵌入式平臺和網(wǎng)絡(luò)協(xié)議規(guī)定的是大端。這件事在單機程序里毫無存在感因為讀取和寫入用的是同一套規(guī)則自己跟自己永遠(yuǎn)對得上。但一旦跨機器發(fā)送方按小端把0x01020304鋪到內(nèi)存里發(fā)出去接收方按大端解讀得到的就是0x04030201——數(shù)字完全變了。這也是收到的數(shù)據(jù)是亂碼最常見的成因之一而且它很陰險數(shù)據(jù)長度對得上、校驗也能過只是數(shù)值錯了排查時容易往業(yè)務(wù)邏輯上想??梢赃@樣驗證自己機器的字節(jié)序#include stdio.h #include stdint.h #include arpa/inet.h int main(void) { uint32_t host 0x01020304; uint32_t net htonl(host); unsigned char *p; p (unsigned char *)host; printf(host: %02x %02x %02x %02x\n, p[0], p[1], p[2], p[3]); p (unsigned char *)net; printf(net : %02x %02x %02x %02x\n, p[0], p[1], p[2], p[3]); return 0; }在小端機上輸出是host: 04 03 02 01和net: 01 02 03 04兩個結(jié)果不一樣說明轉(zhuǎn)換確實發(fā)生了在大端機上兩者相同。這段代碼我建議每個初學(xué)網(wǎng)絡(luò)編程的人都親手跑一遍比看十遍文字描述管用。3.2 為什么網(wǎng)絡(luò)字節(jié)序規(guī)定為大端協(xié)議在設(shè)計時需要一個統(tǒng)一約定否則每個實現(xiàn)都要在運行時協(xié)商成本太高。選大端有歷史和工程上的原因早期參與制定規(guī)范的主流機器多為大端架構(gòu)而且大端在抓包和人工閱讀十六進制時更符合直覺——高位在前和書寫順序一致。這個選擇一旦定下來就成了硬約定后來無論本機是什么字節(jié)序網(wǎng)絡(luò)上傳輸?shù)臄?shù)值一律按大端解釋。落實到代碼就是四個函數(shù)htonshost to network short16 位、htonl32 位、ntohs、ntohl。規(guī)律很好記端口是 16 位用sIP 和大多數(shù)整型字段是 32 位用l。這些函數(shù)在同類字節(jié)序的機器上會被編譯成空操作所以不用擔(dān)心性能。3.3 轉(zhuǎn)換邊界在哪里只轉(zhuǎn)數(shù)值不轉(zhuǎn)字節(jié)流這是最容易被搞混的一點。字節(jié)序轉(zhuǎn)換只對多字節(jié)數(shù)值類型有意義對字節(jié)數(shù)組沒有意義。你發(fā)一個字符串hello它就是五個字節(jié)逐字節(jié)發(fā)送接收方逐字節(jié)接收順序天然一致不需要任何轉(zhuǎn)換。你發(fā)一個uint32_t長度字段就必須轉(zhuǎn)換。由此推出一條實操原則自定義協(xié)議時把所有多字節(jié)字段明確用固定寬度類型uint16_t、uint32_t、uint64_t聲明并在序列化時逐個轉(zhuǎn)換。不要圖省事把整個結(jié)構(gòu)體memcpy進緩沖區(qū)發(fā)出去原因有兩個一是結(jié)構(gòu)體里可能有字節(jié)序不同的字段二是編譯器會在成員之間插入對齊填充填充內(nèi)容是不確定的接收方按同樣的結(jié)構(gòu)體解析可能對得上換編譯器、換優(yōu)化等級、換平臺就可能錯位。htons/htonl只覆蓋 16 位和 32 位64 位沒有標(biāo)準(zhǔn)函數(shù)??缙脚_項目里常見的做法是自己寫一對#include stdint.h static uint64_t hton64(uint64_t v) { #if __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ return ((uint64_t)htonl((uint32_t)(v 0xFFFFFFFF)) 32) | htonl((uint32_t)(v 32)); #else return v; #endif }或者干脆在協(xié)議設(shè)計階段避開 64 位字段用兩個 32 位拼省掉這一層。我在實際項目里更傾向后者協(xié)議越簡單跨語言實現(xiàn)時出錯概率越低。3.4 浮點數(shù)和長時間戳的額外注意點浮點數(shù)不要直接發(fā)二進制。IEEE 754 的位模式雖然也是定長的但不同平臺的實現(xiàn)細(xì)節(jié)、NaN 表示、擴展精度都可能不同直接傳字節(jié)在不同編譯器之間不一定可靠。穩(wěn)妥做法是轉(zhuǎn)成定點整數(shù)比如金額用分為單位存int64_t或者轉(zhuǎn)成十進制字符串發(fā)送犧牲一點帶寬換確定性。時間戳同理。推薦統(tǒng)一用自紀(jì)元起的秒數(shù)或毫秒數(shù)作為int64_t轉(zhuǎn)換后傳輸避免傳struct timeval、struct timespec這類結(jié)構(gòu)體——它們的成員寬度和布局在各平臺上并不一致。這一點在寫跨平臺通信協(xié)議時值得單獨列一條規(guī)范比事后調(diào)試省事得多。4. 協(xié)議的選擇TCP 和 UDP 的取舍不是在選技術(shù)是在選責(zé)任4.1 TCP面向連接、可靠、字節(jié)流SOCK_STREAM對應(yīng)的就是 TCP。它提供的保證可以概括成四條連接是有狀態(tài)的三次握手建立、四次揮手關(guān)閉、數(shù)據(jù)不丟不重不亂序、有流量控制和擁塞控制、傳輸?shù)氖亲止?jié)流而非消息。字節(jié)流這三個字是理解 TCP 的關(guān)鍵也是后面所有粘包討論的根源。TCP 只保證你寫進去的字節(jié)會按順序到達不保證邊界。你在發(fā)送端write了兩次每次 100 字節(jié)接收端可能一次read到 200 字節(jié)也可能分三次讀到 60、60、80。這不是 bug是設(shè)計如此——TCP 把自己定位成一根可靠的水管水管不負(fù)責(zé)告訴你這一杯水到哪里結(jié)束。所以任何基于 TCP 的應(yīng)用層協(xié)議都必須自己定義邊界常見三種做法方案做法適用場景缺點固定長度每條消息定長消息長度恒定的場景不靈活浪費帶寬長度前綴先發(fā) 4 字節(jié)長度再發(fā)內(nèi)容通用二進制協(xié)議需要處理長度字段本身的字節(jié)序分隔符用\r\n或\0結(jié)束文本協(xié)議、命令行內(nèi)容里出現(xiàn)分隔符需要轉(zhuǎn)義長度前綴是我最常用的方案簡單、高效、無歧義。實現(xiàn)上有兩個細(xì)節(jié)長度字段必須用htonl轉(zhuǎn)換讀取時必須循環(huán)讀滿因為read可能只返回部分?jǐn)?shù)據(jù)。static int read_full(int fd, void *buf, size_t n) { size_t got 0; while (got n) { ssize_t r read(fd, (char *)buf got, n - got); if (r 0) return 0; /* 對端關(guān)閉 */ if (r 0) { if (errno EINTR) continue; /* 被信號打斷重試 */ return -1; } got (size_t)r; } return 1; }這段代碼短但包含了三個新手經(jīng)常漏掉的點處理短讀、處理EINTR、區(qū)分讀滿和對端關(guān)閉兩種情況。漏掉任何一個在高負(fù)載或者有信號的環(huán)境下就會出現(xiàn)隨機失敗而且極難復(fù)現(xiàn)。4.2 UDP無連接、不可靠、數(shù)據(jù)報SOCK_DGRAM對應(yīng) UDP。它沒有連接、不保證送達、不保證順序、可能重復(fù)但保留了消息邊界你發(fā)一個數(shù)據(jù)報接收方要么收到完整的一個要么收不到不會出現(xiàn)半截。這一點和 TCP 正好相反。UDP 的優(yōu)勢在于開銷小、延遲低、沒有隊頭阻塞。一個數(shù)據(jù)報丟了只影響它自己不會卡住后面的數(shù)據(jù)TCP 則因為要保證順序前面一個包丟了后面全得等重傳。所以在實時性優(yōu)先、能容忍少量丟包的場景里UDP 是更合理的選擇。另外 UDP 天然支持一對多廣播、組播TCP 做不到。需要注意的是UDP 的簡單只體現(xiàn)在協(xié)議層應(yīng)用層的復(fù)雜度一點沒少要自己做超時重傳、自己做序號去重、自己做擁塞控制否則一旦網(wǎng)絡(luò)擁塞就是災(zāi)難。很多人在 UDP 上重新實現(xiàn)了一遍 TCP 的可靠性機制結(jié)果比直接用 TCP 還差。這不是說不能做而是要有清醒判斷——如果你的需求是可靠傳輸先問問自己為什么不用 TCP。4.3 選型不是選技術(shù)是選你要承擔(dān)哪部分責(zé)任我判斷的方式是問三個問題丟一個包會怎樣如果業(yè)務(wù)上完全不能接受比如轉(zhuǎn)賬指令用 TCP讓協(xié)議棧幫你扛。延遲敏感嗎如果晚到不如不到比如實時語音、游戲位置同步UDP 更合適應(yīng)用層做有限的補償。是不是一對多廣播、組播只能用 UDP。其余情況默認(rèn)選 TCP把精力放在業(yè)務(wù)上。選 UDP 通常是經(jīng)過權(quán)衡后的主動決策而不是因為它快。4.4 粘包這個詞其實起錯了名字社區(qū)里常說TCP 粘包嚴(yán)格講這個說法不準(zhǔn)確TCP 沒有粘它本來就是流從未承諾過邊界。真正的問題是應(yīng)用層沒有定義消息邊界。所以解決粘包的正確姿勢不是去調(diào)什么 socket 參數(shù)而是在協(xié)議設(shè)計階段就把邊界規(guī)則寫清楚然后在接收端按規(guī)則切分。理解了這一點你就不會再去找關(guān)閉粘包的選項——那東西不存在。4.5 一個常被忽略的細(xì)節(jié)send返回值和發(fā)完了不是一回事send()返回的是成功拷貝進內(nèi)核發(fā)送緩沖區(qū)的字節(jié)數(shù)不等于對端已經(jīng)收到。緩沖區(qū)滿了它會阻塞阻塞模式下或者返回EAGAIN非阻塞模式下。所以正確寫法同樣是循環(huán)直到全部寫完static int write_full(int fd, const void *buf, size_t n) { size_t sent 0; while (sent n) { ssize_t w send(fd, (const char *)buf sent, n - sent, 0); if (w 0) { if (errno EINTR) continue; if (errno EAGAIN || errno EWOULDBLOCK) { /* 非阻塞模式下應(yīng)交給事件循環(huán)處理此處僅示意 */ continue; } return -1; } sent (size_t)w; } return 0; }在非阻塞模式下EAGAIN的處理不能靠死循環(huán)必須回到事件循環(huán)里等可寫事件。這段邏輯在寫高性能服務(wù)時是繞不開的但在預(yù)備知識階段先建立send 不代表送達這個認(rèn)知就夠了。5. 地址結(jié)構(gòu)體與 socket API 的整體輪廓5.1sockaddr家族的三個成員很多人第一次看 socket 代碼最困惑的就是為什么要在一堆結(jié)構(gòu)體之間來回強轉(zhuǎn)struct sockaddr_in addr; bind(fd, (struct sockaddr *)addr, sizeof(addr));原因是設(shè)計上做了一層通用殼。struct sockaddr是抽象的地址表示只有一個 16 位的地址族字段和一段通用的地址數(shù)據(jù)struct sockaddr_in是 IPv4 的具體表示struct sockaddr_in6是 IPv6 的struct sockaddr_un是本地 Unix 域的。所有 API 的參數(shù)統(tǒng)一收struct sockaddr *這樣一套接口能同時支持多種地址族代價是調(diào)用方必須自己強轉(zhuǎn)并把真實大小通過第三個參數(shù)傳進去。這個設(shè)計的用意是擴展性代價是類型安全為零——強轉(zhuǎn)錯了編譯器不會報錯運行時bind直接返回EINVAL。所以我寫這類代碼時有個習(xí)慣結(jié)構(gòu)體變量名統(tǒng)一加后綴addr4、addr6強轉(zhuǎn)的地方一眼能看出對應(yīng)關(guān)系減少誤用。三層結(jié)構(gòu)之間還有一個細(xì)節(jié)sin_addr的類型是struct in_addr里面只有一個s_addr成員。多套一層純粹是歷史原因?qū)嶋H用時直接操作sin_addr.s_addr就行。IPv6 那邊sin6_addr是 16 字節(jié)的聯(lián)合體轉(zhuǎn)換要用inet_pton(AF_INET6, ...)inet_ntop也需要傳AF_INET6用錯了會靜默失敗。5.2 一份能跑起來的最小骨架把前面所有概念串起來一個最小的服務(wù)器骨架長這樣#include stdio.h #include string.h #include unistd.h #include errno.h #include arpa/inet.h #include netinet/in.h #include sys/socket.h int main(void) { int lfd socket(AF_INET, SOCK_STREAM, 0); if (lfd 0) { perror(socket); return 1; } int on 1; setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, on, sizeof(on)); struct sockaddr_in addr; memset(addr, 0, sizeof(addr)); addr.sin_family AF_INET; addr.sin_port htons(8080); addr.sin_addr.s_addr htonl(INADDR_ANY); if (bind(lfd, (struct sockaddr *)addr, sizeof(addr)) 0) { perror(bind); return 1; } if (listen(lfd, 128) 0) { perror(listen); return 1; } for (;;) { struct sockaddr_in peer; socklen_t len sizeof(peer); int cfd accept(lfd, (struct sockaddr *)peer, len); if (cfd 0) { if (errno EINTR) continue; perror(accept); break; } char ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, peer.sin_addr, ip, sizeof(ip)); printf(client %s:%u\n, ip, ntohs(peer.sin_port)); char buf[1024]; ssize_t n read(cfd, buf, sizeof(buf)); if (n 0) write(cfd, buf, (size_t)n); close(cfd); } close(lfd); return 0; }三十來行但每一行都能對應(yīng)上前面的概念socket的第一個參數(shù)是地址族第二個是套接字類型決定 TCP 還是 UDPSO_REUSEADDR解決TIME_WAITmemset清sin_zerohtons/htonl處理字節(jié)序INADDR_ANY監(jiān)聽所有地址listen的第二個參數(shù)是等待隊列長度accept返回的是新的fd和監(jiān)聽 fd 是兩個東西peer里的地址是網(wǎng)絡(luò)字節(jié)序打印前必須ntohs。編譯命令記一下gcc -Wall -Wextra -o srv srv.c然后另開一個終端用nc 127.0.0.1 8080連上去試試。這段代碼只處理一個連接就關(guān)閉不是完整的服務(wù)器但足夠用來驗證環(huán)境、驗證端口、驗證字節(jié)序轉(zhuǎn)換是否正確。5.3listen的 backlog 到底影響什么listen(fd, 128)里的 128 不是最大連接數(shù)而是未完成連接隊列 已完成連接隊列的上限參考值。未完成隊列放的是收到 SYN、還沒完成三次握手的連接已完成隊列放的是握手完成、等待accept取走的連接。如果服務(wù)端accept太慢已完成隊列滿了后續(xù)新連接的行為取決于tcp_abort_on_overflow的配置默認(rèn)是靜默丟棄客戶端表現(xiàn)為連接超時或重試。實際取值不用太糾結(jié)Linux 上還會被net.core.somaxconn限制最終生效的是兩者較小值。我一般寫 128 或 512配合及時accept就夠了。真正的瓶頸幾乎從來不是這個數(shù)字而是accept之后每個連接的處理邏輯是不是阻塞的。5.4read/write與send/recvclose與shutdownsocketfd 可以用read/write也可以用send/recv。前者是通用文件接口后者多了個flags參數(shù)能指定MSG_NOSIGNAL避免對端關(guān)閉時觸發(fā) SIGPIPE 直接殺掉進程、MSG_PEEK窺探不取走、MSG_WAITALL盡量讀滿。生產(chǎn)代碼里我強烈建議用send并帶上MSG_NOSIGNAL或者干脆在啟動時signal(SIGPIPE, SIG_IGN)否則對端異常斷開就可能導(dǎo)致整個服務(wù)進程退出這類事故非常典型。close和shutdown的區(qū)別也值得單獨說。close減少引用計數(shù)減到 0 才真正關(guān)閉而且它是全雙工的——讀寫一起斷。shutdown(fd, SHUT_WR)只關(guān)閉寫方向?qū)Χ藭盏?EOF但仍然可以繼續(xù)發(fā)數(shù)據(jù)過來這在我發(fā)完了等你回復(fù)的場景里是必需的。用close替代shutdown會導(dǎo)致你再也讀不到對端的回復(fù)很多人調(diào)試時遇到發(fā)完就收不到響應(yīng)原因就在這里。5.5 阻塞與非阻塞預(yù)備階段至少要建立的直覺默認(rèn)創(chuàng)建的 socket 是阻塞的accept沒連接就卡住、read沒數(shù)據(jù)就卡住、write緩沖區(qū)滿就卡住。單連接場景沒問題一旦要同時處理多個連接就必須改。兩條路一是每連接一個線程簡單但線程開銷大、連接數(shù)上千就撐不住二是非阻塞 事件循環(huán)epoll一個線程管成千上萬個連接。預(yù)備知識階段不需要把epoll吃透但必須理解阻塞語義是怎么來的以及EAGAIN意味著什么。因為不管你后面用哪種模型這兩個概念都會反復(fù)出現(xiàn)。我的建議是先寫一個阻塞版本跑通邏輯再改成非阻塞觀察錯誤碼的變化這個對比過程比直接抄epoll模板有收獲得多。6. 常見問題與排查技巧實錄6.1 一份能直接對著查的速查表現(xiàn)象最可能原因排查動作bind返回EADDRINUSE端口被占或處于TIME_WAITss -lntp看占用加SO_REUSEADDRbind返回EINVAL結(jié)構(gòu)體沒清零 / 地址族填錯 / 長度傳錯檢查memset、sin_family、第三個參數(shù)connect一直超時目標(biāo)不可達、被防火墻攔、服務(wù)bind在回環(huán)ping、telnet ip port、檢查bind地址connect返回ECONNREFUSED目標(biāo)端口沒有監(jiān)聽確認(rèn)服務(wù)是否啟動、端口是否寫錯收到的數(shù)值不對字節(jié)序沒轉(zhuǎn)檢查htonl/htons/ntohl/ntohs收到的結(jié)構(gòu)體錯位直接memcpy結(jié)構(gòu)體含對齊填充改為逐字段序列化大流量下偶發(fā)讀不完整沒處理短讀包一層read_full循環(huán)進程莫名退出對端關(guān)閉觸發(fā)SIGPIPE用MSG_NOSIGNAL或忽略SIGPIPE端口傳 0 后不知道實際端口沒調(diào)getsockname綁定后用getsockname讀回重啟服務(wù)立刻報端口占用TIME_WAITSO_REUSEADDR或等待 2MSL這張表覆蓋了我實際調(diào)試中八成以上的情況遇到問題先對一遍能省掉大量瞎猜的時間。6.2 幾個只有踩過才知道的細(xì)節(jié)用ss而不是netstat。ss -lntp看監(jiān)聽、ss -antp看所有 TCP 連接、ss -s看匯總統(tǒng)計比netstat快得多字段也更清楚。排查連接狀態(tài)分布時ss輸出的State列能直接告訴你有多少連接卡在SYN-SENT、多少在TIME_WAIT。strace是定位 socket 調(diào)用的利器。strace -f -e tracenetwork ./srv能把所有網(wǎng)絡(luò)相關(guān)的系統(tǒng)調(diào)用和返回值打出來bind到底傳了什么地址、accept返回了哪個 fd、read返回了幾個字節(jié)一目了然。我第一次搞不清為什么bind失敗就是靠它看到sin_port傳的是主機序直接定位。地址打印一定要在轉(zhuǎn)換之后。printf(%s, inet_ntoa(addr.sin_addr))這種寫法在單線程里能用但inet_ntoa返回的是靜態(tài)緩沖區(qū)多線程下會互相覆蓋。老老實實用inet_ntop加自己的char buf[INET_ADDRSTRLEN]雖然多寫一行但省掉的是那種日志里 IP 隨機變化的詭異問題。測試用固定端口遲早出事。CI 環(huán)境里并發(fā)跑多個測試用例固定端口必然沖突。全部改成綁定端口 0 再getsockname拿實際端口這個改動很小收益很大。超時一定要設(shè)。connect默認(rèn)超時可能長達一分鐘以上recv默認(rèn)永不超時。生產(chǎn)代碼里SO_RCVTIMEO、SO_SNDTIMEO或者非阻塞 事件循環(huán)的超時機制至少要有一種。我見過因為缺超時導(dǎo)致工作線程被一個僵死連接永久占住最后整個服務(wù)雪崩的案例代價非常大??鐧C器自測要趁早。別總在127.0.0.1上測。兩個終端在本機互通會掩蓋掉地址綁定、防火墻、路由、MTU 等一系列問題。哪怕只是拿另一臺同網(wǎng)段的機器連一下也能提前暴露不少東西。6.3 我個人建議的學(xué)習(xí)路徑我的體會是套接字這層?xùn)|西不適合先學(xué)完理論再動手也不適合抄完模板就完事比較舒服的節(jié)奏是三輪。第一輪跑通寫一個阻塞的 TCP 回顯服務(wù)用nc連通確認(rèn)端口、地址、收發(fā)都正常。第二輪加約束自己定義一個帶長度前綴的協(xié)議收發(fā)結(jié)構(gòu)體強制做字節(jié)序轉(zhuǎn)換用tcpdump或者strace驗證字節(jié)層面的樣子。第三輪改模型把阻塞改成非阻塞觀察EAGAIN然后引入epoll理解事件驅(qū)動下的收發(fā)循環(huán)。這三輪走下來再去看那些高性能框架的代碼會發(fā)現(xiàn)它們做的事情無非是把這三輪的細(xì)節(jié)做到極致緩沖區(qū)管理、零拷貝、批量收發(fā)、連接復(fù)用。基礎(chǔ)概念打牢了上層的東西就只是工程取舍不再是黑魔法。最后分享一個我常用的自查習(xí)慣寫完任何一段 socket 代碼我都會問自己四個問題——這個數(shù)值轉(zhuǎn)字節(jié)序了嗎這個read會不會短讀這個send失敗我能處理嗎對端關(guān)閉時我會不會崩四個問題全過代碼基本就能在真實環(huán)境里扛住了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
好屌色综合| 99久久久er直播网址| 超碰91在线| 欧美97视频| 亚洲天堂男人| 亚州色交| 搡老女人老91妇女老熟女| 亚洲成人免费在线| 欧美精品日韩久久久九 | 欧美国产精品久久九九| 17c嫩草51久久91嫩草| 久久久 国产精品| 久久久免费懂色| 黄片免费日韩| 欧美色图成人网一区二区 | 久热69九色熟妇97| 久久久久久九九九| 国产女人高潮视频| 欧美色图 色综合图| 日本福利社| 亚洲国产综合图区中文字幕| 校园春色综合| 免费岛国一级片| 成人夜夜爽| 久久久久少妇| 浓厚中出中文字幕在线| 久久久三区二区一区| 艳尻美人妻| 激情小说五月天| 熟女六十路| 岛国激情视频在线观看| 中英熟女操女| 亚洲熟妇一,二,三期| 狠狠爱夜夜| 欧美同性恋 的搜索结果 - 91n| 2017大香蕉国产精品久久| 热九九精品| 蜜臀久久99'精品久久久| 久久精彩免费视频| 色婷网| 天堂中文日本在线观看| 欧美国产伊人久久久久| 全免费a敌肛交毛片免费| 成人a大片在线观看| 免费看黄片现成| 国产又黄又粗又猛大片| 免费一级性爱久久| 国产精品免费日韩| 黄骗免费网站| 欧美精品成人一区二区在线观看 | 欧洲精品二区| 中文一区二区三区影院| www国产无码| 九九九精品成人免费视频小说| 欧美v日韩v亚洲v最新在线| 成 人 A V免费视频在线观看| 国产成年女黄特黄| 六月色婷婷| 亚州操操穴网| 欲射影视| 日韩欧美加勒比| 亚洲综合校园春色| 亚洲第一在线视频| 久久精品欧美一区蜜桃| 99热只有| 人人搡人人肉久久精品| 精品国产乱码久久久久久久| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 99热只有这里有精品| 亚洲欧综合另类无码一区| 成人网址在线观看| 后入内射蜜桃臀| 欧美高潮在线| 欧美呦呦性爱| 精品久久久av| 91狠狠狠| av网站免费线看| 黄色一级视| 99热免费| 嗯嗯啊啊日韩精品| 国产福利电影| 五月丁香网站| 91性感网站| 偷窥自拍亚洲| 97人妻免费中文字幕| 任你爽视频| 午夜啊啊啊| 色色九区| 色综合尤物| 夜夜操夜夜爽夜夜高潮| 亚洲天堂精品日韩电影| 一级黄色影片| 91久热| 蜜乳视频网站| 中文高清一区二区的| 性生活无遮挡纯毛片在线看| 免费A片三p视频| 日本123区操B视频| 综合久久99亚洲人妻中文在线| 中国91AV| 色欲日韩欧美在线一区| 天天日天天屌天天操| 性色综合网| 日韩人妻免费精品| 久久综合激情| 黄片com.| 亚洲AV无码国产精品久久久久| 天天夜躁日日躁狠狠2002| 久热热| 亚洲欧美清纯| 日本一区二区三区四区免费观看| 精品久久視頻在线| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | a级理论午夜日本| 欧美白嫩在线放| 亚洲男人综合| 久久夜色一区二区| 男人a天堂手机在线版| 禁十八久久| 老外又粗又长一晚做五次| 欧美综合骚| 人妻丝袜一区二区三区在线| www.狠狠操| 国产91美女视频| 免费操逼视频下载| 国内毛片四区| 国产欧美日韩女同性恋ww喷水精品| 后入式福利| 探花精品视频| 久久老女人| 丰满翘臀美女影院视频| 约操熟妇| 亚洲日韩资源| 国产在线不卡导航| 91站街按摩店老熟女熟女| 欧美三级偷拍| 九九热免费国产视频婷婷伊人五月| 91色亚洲| 亚洲五区熟女| 色婷婷基地| 欧美黄页| 神马久久啊啊| 久久大香蕉手机高清| 精品人妻免费观看| 97丝袜亚洲在线播放| 操逼啊啊啊91| 97人人夜夜精品视频| 亚洲成人妻日韩在线| 女人喷水视频在线观看| 亚洲欧美清纯| 久久99999| 日本高清_区二区三区| 97伊人超碰| 天天摸夜夜摸| 一区二区娱乐网站| 国产精品久久aV| 亚洲色图伊人网| 婷婷色色五月天| а√天堂资源官网在线资源| 国内一区二区三区| 视频在线观看一二三区| 久青草影院| 久久久免费的精品| 亚洲中文日韩欧美大香蕉视频| 亚洲少妇综合| 欧美国产操逼| 青青草视频爽一爽| 日韩一级片| 国产亚洲精品一区二区三区| 九久久九九久视频| 色欧美在线| 青青草伊人久久| 99久久精品国产高潮| 久久成年片色大黄全免费网站| 色综和网| 日本青青草在线| 无套内射性感少妇视频| 国产视频一区二区免费| 操逼啊啊啊91| 老司机老司机午夜影院| 色哟哟综合| se..亚洲欧美| 久久久无码精品人妻二区| 婷婷色香| 超碰亚洲欧美日韩无| 玖玖玖玖精品国产剧情| 激情接吻视频久久久久久| 操操吧亚洲乱伦视频| 日日摸日日碰夜夜爽视频| 成人在线视频一区| 2018天天干在线视频| 久操视频在线| 超碰久久网| 天美欧美国产| 一区 欧美 日韩 麻豆| 五月婷婷六月激情| 久久国产视频性吧| 十八禁网站在线| 黄色片A级一区二区三区| 99re这里| 91精品免费| 国产精品久久久久久久久久久久久久久久 | 亚洲精品电影| 99超碰碰| 久久久久久十| 精品九九九| 久久久久久久9| 伊人性在线视频| 久久久性少妇| 亚春色色| 97国产|免费| 亚洲在线A| 亚洲 欧美 综合 91| 亚洲熟女乱综合一区二区三区| 欲射影视| 美女上床网站| 亚洲一二三四区| 国产在线视频午夜精华在| 国产久久久久久| 欧美亚洲中文| 中文字幕美女91| 乳欲人妻办公室奶水| 欧美性爱1080p| 天堂无码精品国产久| 粉嫩av一区二区三区天美传媒 | 波多野结衣被操50分钟免费视频| 国产欧美成人第一页在线观看| 久久riav中文精品| 五月天玖玖资源站| 99色色网| 日韩精品99久久久久久中文字幕 | 亚洲春色欧美激情自拍| 国产欧美成人第一页在线观看| 青娱乐国产盛宴视频| 久久精品美女一区| 97一区二区蜜臀| 精国久久一区二区三区98| 四虎精品一区| 久久这里只有精品9| 国产福利合集| 免费看A片毛毛片在线播| 欧美日韩操逼嗦吊| 色呦呦、国产精品| 91精品免费| 麻豆天美一区二区| 18禁免费视频| 日韩有码一区三区| 蜜桃狠狠色伊人亚洲综合 | 国产午夜无码片在线观看影视 | 亚洲综合贴图91| 少妇xx精品| 屁股久久久久久久久久| 国产精品一区二区后入| 久久深夜无码| 欧美日韩成人在线| 5252色欧美在线男人的天堂| 日韩成人人妻网站| 亚洲国产精品99久久久| 性欧美另类高清| 97精品综合久久网| 精品高潮| 亚洲色婷婷| 极品色电影院| 中日韩免费看男女操逼大全| 激情五月天婷婷| 国产少妇高潮| 日韩一级性爱无码| 麻豆黄色五月天| 亚洲女人毛茸茸91| 一级片在线观看高清无码| 丁香激情网| 91日日夜夜| 国模私拍一区二区三区神乳| 老色69| 四虎精品永久在线观看| 岛国免费黄色网址| 韩国女主播青草在线| 少妇精品久久| 婷婷激情五月| 精品国产乱码久久久影院| 影音先锋视频在线| www.高清无码诱惑一区.com| 自拍偷拍第26| 亚洲成人精品久久久| 亚洲久9| 婷婷深爱五月| 伊人国产AV| 日本在线视频导航| 中文精品少妇天堂| 日韩激情中文字幕有码| 欧洲一区二区| 97人人干| 久久久精品网站| 欧美亚洲综合色| 久操免费电影| 久久99综合| 成人无码欧美一级A片狼牙直播| 亚洲AV无码成人精品久久| 成人在线午夜视频一区| 久久直播国产| 精品二区三四区五电影 | 91熟女丨91老女人| 99热免费| 免费AV中文网在线观看| 一牛影视久久久一区二区三区| 91亚洲人| 一区中文字幕二区日韩| 日本操BAV| 伊人九九| 亚洲欧洲另类| 另类天堂| 天天综合影院91| 北京美女一区二区| 97久久久久久久久久| 亚洲另类色综合网站| AV色女综合| 国产强奸乱伦无码视频| 蜜桃精品视频一区| 欧美性爱另类综合| 超碰97精品| 久久久性爱视频| 超碰成人最新最好看| 草B在线| 97亚洲性爱| 国产a片操逼| 91狠狠狠| 成人熟女区| 成人综合久久精品色婷婷| 69一区二区三区| 亚洲第一页欧美| 日韩国产乱子伦App| 亚洲无码一区成人免费午夜| 欧美一区二区成人一卡| 色婷网| 日韩精品资源专区二区| 人妻 欧美亚洲| 五月婷婷综合在线| 国产精品久久久无码AV网站| 男女无套 免费网站| 国产精品久久久久久久久久久久久久久久 | 国产精品久久久久无码AV会牛| 超碰在线91| 性爱欧美五月| 老熟女91av| 国产午夜无码片在线观看影视| 无码78| 综合九九| 超碰97网址| 日本久久99| 黄色电影在线播放综合网站 | 东北夫妻性偷拍| 一区二区三区激情在线观看| 370p日韩欧美亚洲精品| yw尤物av无码点击进入麻豆| 超碰久超碰久| 日韩欧美久久婷婷网站| 欧美天堂第二区| 久jiu久神马影院| 最新日韩黄片| A片 AV一级在线播放观看免费| 精品免费视频国产一区| 男人综合网| 亚洲97网站| 国产第25页在线观看| 白天啪啪晚上啪啪视频| 精品美女人人干| 老司机午夜福利视频一区二区| 亚洲色图综合网| 天天狂操夜夜狂日| 超碰人妻天天干| 激情五月天婷婷| 久神马| 97超碰9| 小视频玖玖| 人妻少妇视频在线播放| 久草久日| 91av一区二区在线观看| 久草成人福利导航| 亚州,欧美在线| 操逼日批| 成人无码专区精品视频| 国产999精品久久久| 精品欧美А∨无码黑人大荫蒂| 一本久道久久综合狠狠爱| 日韩美女高潮喷水视频| 翔田千里AV无码秘 三区| 久久九九国产精品| 亚州熟妇精品| 夜夜操美女| 久久综合日韩亚洲欧美| 91内射| 大香蕉碰碰| 新怡红院| 99热精品在线| 东京太热男人的天堂久久久| 免费毛片在线播放| 青草伊人久久| 簧片免费看视频| 久久亚洲一区女同性恋中文字幕| 免费啪啪啪网站18岁| 超碰偷拍| 97超碰国产亚洲精品资源| 天天影视91看看| 强奸乱伦动态污图免费| 亚洲天天自拍| 97人人操人人干| 中文字幕乱亚洲美女精品一区| 色五月婷婷五月天| 中文AV制服乱伦| 欧美999999| 欧美黄片视频在线观看免费| 综合第一页| 成 人 影视 一区 二区 三区 四区| 婷婷丁香激情| 福利天堂| 丁香五月成人| 天天操夜夜操狠很操| 91AV天美在线视频| 久久精彩免费视频| 天天弄天天操| 亚洲在饯| 人妻无码一区二区三区久久99| 色婷视频| 亚洲自拍天堂| 亚洲综合91| 久久久久久久久久久久欧美日| 久久久com| 欧美极品美女aaaaaa级黄片| 欧美色图在线视频少妇| 欧美无圣光在线| 99热精品在线| 日本熟妇人妻中出视频| 熟女探花啪啪| 1024日韩| 日韩欧美国产高清视频| 国产精品高潮呻吟av久久4虎| 欧美青青草视频| 啊啊啊啊啊操我视频| 激情久久av一区av二区av| 欧美少妇色图| 蜜臀Av一区二区三区| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 中文字幕五区| 最新欧美色网| 女优视频第10页| 日韩免费性爱视频在线观看| 国产精品亚洲高清在线| 久久久精品91八戒| 亚洲影院365| 国产剧情在线| 在线观看中文字幕| 伊人天天久久动态图| 久一区久久蜜桃| 麻豆视频一区二区| 欧美精品三区| 国产精品嫩草影院午夜两性 | 中文字幕AV乱伦| 东京热视频网| 蜜乳AV.COM| 精品国产一区二区三区四区在线看| av爱爱爱| 综合久久六月久久婷婷| 翔田千里av一区二区三区| 久久98| 欧美熟爽综合| 国产精品久久久久久久久久久久久久久久久久 | 欧美伦乱爱| 久久一本大香蕉 | 激情第四色| 蜜桃精品一区二区三区ww| 男生女生啊啊啊啊| 久久精品综合| AAAA级日本片免费视频| 不卡av在线中文字幕| 国产精品无码AV网站| 一区二区你上我| 欧美综合在线91| 人人射人人操人人摸| 青木玲在线不卡| 最新av在线| 欧美专利1区2区3区4区5区免费| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产成人精品必看| 99re只有精品| 国语av最新自产拍在线观看| 天天操熟妇| 亚洲中文字幕97久久精品少妇| 理论久久婷婷网8| 啊啊啊啊嗯嗯嗯用力好爽 | 人人超碰在线观看黄| 亚洲精品人伦一区二区| 97电影院超碰| 欧美最婬乱婬爆婬性视频 | 久久欧美性爱视频| 欧美人人AAA| 婷婷色一区| 日韩精品第3页| 欧美精品亚洲精品日韩传电影| 日本一久是| 亚州黄站| 亚洲97成人在线观看| 久久精品国产Aⅴ| 精品偷拍13p欧美dodk视频| 国产又粗又长又大的视频| 免费成人自拍视频在线| 91色综合| www.高清无码诱惑一区.com | 欧美经典一区二区三区| 艹少妇网站| 亚洲av无码成人精品国产| 五月丁香婷婷啪啪| 麻豆区99999| 9999久久久久| 人妻色偷色噜| 色婷亚洲五月在线观看| 曰本熟女视频| 中文字幕视频在线观看| 伊人操你| 95人妻爽爽人人做人人澡| 97欧美| 国产区日韩区在线观看| 青青国产精品在线| 国产东北女人在线视频| 九九九国产精品| 无码9区| 国产91亚洲精品一区二区三区| 青青青青草av在线观看| 久久久精品无码亚免费| 欧洲精品一级二级精品综合视频综合| 在线天堂999| 一线黄色免费性爱片| 亚洲人妻精品一区二区| 97精品国产精品免费观看| 国产一区二区视频在线播放| 亚洲日韩精品久久久久一区壹牛| 久久久久幕乱码| 九九玖玖精品| 黄aaaaaaaaaaaaaaaaaa色网站| 亚洲drav色图| 国产操伦| 操淫穴亚洲五月丁香| 天天干天天燥| 69视频福利导航| 久久久久久AⅤ无码免费肉站| 久久69| 蜜臀AV一区二区三区激情综合| 欧美一级黄片视频在线| 在线a亚洲视频播放在线| 综合性视频99| 亚av顶级裸体一区二区三区四区五区 | 色综合加勒比| 超碰97 线线 在现| 男人成人黄色视频在线观看免费下载| 久久久久久久久久久人妻| 亚欧性爱ab| 中文人妻av高清一区| 欧美色欧美| 一区二区三区一亚洲中文字幕、综合区灬 | 亚洲精品一区二区三区在线播放| 亚洲第一页第二页激情| 国产精品一区二区三| 天美麻豆黄色录像| 九草九九九| 岛国999| 五月开心久久AV官网| 欧洲亚洲人妻无码中字久久三区四区 | 美女视频尤物网在线看| A一区片| 夜夜操美女| 精品国产91内射久久| 国产精品精品系列在线观看| 中国一级αV| 麻豆国产97在线| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 亚洲精品蜜桃久久久| 欧美丝袜亚洲| 国产极品馒头逼| 波多野结衣AV无码一区| 久久av一级av少妇av高潮| 福利操逼| 国模精品娜娜一二三区| 亚洲欧美大| 久久熟妇五十路一区| 熟女精品一区二区在线观看| 夜夜操夜夜高潮夜夜爽国产精品区| 秋霞一区二区三区四区五区六区七区| 色超碰综合| 中文字幕午夜精品久久久| 999国产精品999久久久久久| 亚洲色图欧美色图另类图片| 亚洲免费成人在线高清无码视频| 夜夜免费视频| 黄片免费日韩| 人妻激情偷乱视三区频一区二区| 亚洲青青青视频在线| 青青伊人加勒比海| 色五月AV| a在线视频免费观看| 久久伊人网视频一区二区三区| 秋霞福利网| 欧美色就是色| 综合激情婷婷| 91激情综合| 天堂v无码免费视频| 中国乱伦一区二区| 性生活久久久久久久久久| 夜夜春夜夜操| www国产天美久久久| 美女的肌被草喷水视频| 成人小电影网站tex| 国产高清在线观看欧美| 丁香五月天久久精品视频一区二区三区| 快播久久人人aV| 极品尤物女神在线观看| 91天美传媒在线观看| 亚洲国产另类在线中文| 91亚·色| 女人天堂av在线播放| 日日夜夜天天| 91爱| 亚洲AO在线| 啪啪性爱免费视频| 97色色色综合网站| 青青免费在线视频一区| 女人一区| 手机在线中文字幕国产| 国产视频小说| 3p国产色噜噜一区| 亚洲熟女诱惑| 密臀在线免费观看| 国产日韩区| 嗯嗯啊啊啊啊轻点视频| ?亚洲伊人伊成久久人综合网| 伊人嫩草| 91天天日| 奇米四色影视777久久久| 极品色电影院| 色香蕉影院| 久久大黄片| 青青伊人久久| 91丨九色丨熟女高潮| 亚洲熟女人妻中文字幕一区二区| 精品久久久久9999| 日韩国产乱子伦App| 农村少妇久久久久久久| 五月天春色激情网| 蜜乳AV网址| 中文字幕后石码四区五区| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 美中日韩无码| 久久风骚城市| 99精品伊人| 蜜臀操逼黄色视频操的好爽| 亚洲精品国产精品成人| 国产乱子伦一区二区三区免看| 国产精品一二三免费网站| 国产精品女生av| 青青草色AV| 69精品人人人人| 欧洲亚洲天堂精品| 欧美日韩*字幕一区| 日本一区三级韩国| 91成人久久| 人人弄人人摸| 色哟哟av| 九九九九九九九九九五码| 97香蕉碰碰人妻国产欧美| 亚州伊人色综台| 免费97视频| 91精品国久久久久久无码| 欧美天天谢综合网| 用力操死我| 美女啊啊啊啊pc| 少妇国产不卡| 骚乳在线| 精品久久久久黄少妇| 伊人色综合超碰| 亚洲人在线| 天天弄欧美| 欧美亚洲一区二区久久久婷精品大包诱| 婷婷色一区| 丝袜夫妻自拍| 亭亭丁香激情| 99re在线观看| 国产妇女精品视频青青草| 亚洲欧美日韩国产丝袜自拍中文| 亚洲欧美在线综合| 国产熟女自拍| 天天天干977| 舔足天天操天天射| 97在线视频观看| 人人看黄色视频| 看免费一级在线播放毛片| 亚洲av无码成电影在线播放| 伦激情人妻另类人妻| 一级性爱啪啪视频| 99久久久er直播网址| 日本精品第一视频在'| 超碰人妻在线| 18精品一区| 91高跟美女在线播放| 色男人色天堂东京热| 久热99999| 91日韩国产欧美亚洲另类精盘州至城都| 高清孕妇孕交 交| 精品国产Av无码久久久伦古装| 亚洲黄片免费在线播放| 国产综合永久精品日韩鬼片| 99日韩| 91狠婷| laoshunv91| 久久风骚城市| 亚洲第一页第二页激情| 国产AV激情无码久久无码| 啪啪一区| 色 婷97| 加勒比性爱成人在线| 青草一区二区| 国产传媒午夜理伦精品| 精品一区二区成人动漫| 久久久久骚| 欧洲精品欧洲精品| 五月丁香激情四射| 色婷婷激一区二区三区| 麻豆天美国美国产AV| 亚洲色图欧美另类在线| 南澳成人一级片在线播放| 免费国产电影一区二区| 高清无码国产亚洲| 熟女欧美日韩综合婷婷| 亚洲天堂电影网99999| 精品国产三级av韩国在线| 囯产乱伦一区二区三女| 好湿好紧好爽 视频| 日韩精品一区,二区 九九...老司机| 97伊人网| 久久精品国产72国产精品福利| 天天综合网国产| 夜夜嗨免费视频| 亚洲一区二区三区春色| 五月丁香综合啪啪| 精品人妻一区二区三区视频| 亚洲91色| 亚洲综合成人网| 国产精品午夜福利视频| 国产在线播放成人免费| 色色婷婷丁香| 久久视频,这里只有精品 | 久久精品国产99国产精品亚洲| 嗯嗯不要 视频| 亚洲无吗在线视频| 91日日| 欧洲久久一二线| 超碰在线91| 欧美一区二区三熟女剧情| 亚洲小电影免费涩涩成人在线高清 | 综合久久久久久久综合网| 欧美日韩国产中文超碰| 校园春色第一页| 亚洲一区二区中文字幕| 老司机久久| 日韩免费三级黄片电影| 人妻精品综合中文字幕在线 | 亚洲性少妇| 久久久久久一日韩字幕无码| 热天堂一区二区| 国产一区在线看| 色优久久| 男同专区一区二区三区在线| 日本韩欧美在线播放a| 成人天天爽| 精品亚洲国产成人精品| 亚洲涩涩| 久久国产热视频97电影| 亚州欧美总和| 3d成人精品一区二区| 啊啊啊好舒服视频在线观看| 国产特级毛片AAAAAA高潮流水| 天天综合欧美综合| 国产第12页| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 久久性爱视频99| 69综合网| 波多野结衣一级视频| 午夜福利在线合集| 殴美大黄片| 国产91丝袜 在线播放| 九热视频| 探花精品 一区二区| 亚洲免费精品一区| 日韩黄色片子| 色综合20p| 精品性爱无码在线播放| 三四中文字幕| 久久女人视频| 亚洲熟女精品| 蜜桃臀一区二区aV| 国产激情综合五月久久| 舔足天天操天天射| 中文字幕丝袜美腿| 亚洲图片婷婷五月天| 老鸭窝日丰县女人| 无码99| 久久久久亚洲熟妇熟女| 国产久久一区二区| 熟女乱伦二区| 蜜臀一区二区三区在线 | 加勒比大香蕉视频在线| 思思热国产高清| 夜夜综合| 97色婷婷| 亚洲AV无码翔田千里网站| 国产精品97超碰| 亚州伊人色综台| 都市久久精品激情亚洲| 性感美女啊啊啊在线| 又黄又爽在线观看视频 | 欧美一二三| 国产精品第二页| 乱老女人一区二区视频| a片自拍直播视频| 蜜桃臀AV在线| 九九九午夜| 国产av美女被艹的乱叫| 亚洲色图亚洲| 久久影视二区三区行押| 日本免费不卡二区| 国产激情av女片自拍| 欧美激情久操网| 骚逼自拍99| 免费视频在线观看啊啊啊啊啊| 啪啪视频亚洲第一| 久久无码精品| 人人操人人射人人干| 色爽爽文学| 人人操人人叉人人插人人| 国产一国产一级毛片古装| 大屁股熟女一区二区三区| 久久a久久| 99啪啪视频| 国产精品国产自产高清AV| 黄页av| 91在线国产后入风骚翘臀美女素人| 任我爽视频在线观看| 99啪啪视频| 午夜福利在线合集| a片自拍直播视频| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 天堂资源欧美| a网站免费观看| 熟女色综合久久| 性暴力欧美猛交在线直播| 夜夜嗨视频| 高精欧美色| 夜夜嗨老熟女AV一区二区三区| 蜜桃视频一区二区三区在线观看| 狠狠狠狠狠干| 亚洲一区二区性爱电影| 日韩乱伦AⅤ| 国产精品直播在线观看直播| 60秒不遮不挡| 91N综合网| 国产热av| 中文字幕伊人| 亚洲一区二区 麻豆传媒| 日本精品88888888| 欧洲天天在线| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 成人在线视频网| 国产乱码精品一区二区三区四川| 国产操逼视频在线观看| 日本爽爽爽爽爽爽免费视频| 午夜毛片亚洲精品片国产久久久| 欧美色91| 一级AAA片一区二区三区| 懂色av中文字幕| 很狠操| 国产吹潮女在线观看| 成人一区二区三区四区| 免费久久9999| 绑缚麻绳人妻寝取完整版| 一牛影视久久久一区二区三区| 亚洲日本成人动漫| 亚洲不卡AV在线| 亚洲不卡AV在线| 91 亚洲 欧洲| 嗯嗯啊啊操死我| 国产精品熟女AV中文字幕在线播放| 又黄又爽在线观看视频| 国产一区二区三区中文字幕| 懂色AV一区二区三区| 奸色色 男人天堂 天天射| 殴美性色a级欧美| 99超碰色| 97人人爱人人做人人乐| 欧州激情视频在线一区二区| 有码色中文字幕在线观看| 亚洲在高跟鞋自慰久久在色线| 日本东京热大香蕉a片| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 国产欧美日产一区二区三区 - 国产欧美日| 午夜后入| 97精品视频在线播放| 久久精品操| 亚洲色阁| 一区操逼| 天天天天天天天天天天干美女| 91干熟女| 久久精品人体| 欧美性爱网97| 精品无码一区二区三区| 日本熟妇人妻一区二区三区| 97操| 狼狼色丁香久久婷婷综合五月| 成人免费福利在线观看| 久热久| 精品v1区| 少妇久久久免费| 密臀视频三区免费网站| 日B操| 亚洲欧美一区二区三区一猛片| 激情五月婷| 躁躁日曰躁2020| 夜夜操夜夜高潮夜夜爽国产精品区| 麻豆熟妇乱妇熟色A片在线看| 懂色aV一区二区天美传媒| 变态乱伦伪娘灌肠一区二区| 天天肏夜夜肏| 偷拍亚洲高清图片| 香蕉大久久久| 国产操逼网站亚洲一级黄色| 日韩乱中文| 9久综合网| 丝袜亚洲91| 精品在线蜜臀| 日韩人成网站在线播放| 久久久一热在线播放| 久久美国毛片| 亚洲成a人v欧美综合天堂下载| 亚洲AV无码翔田千里网站| 97在线精品| 91在线色| 在线不欧美| 超97在线精品视频| 国色天香av| 国产不卡的视频| 国产强奸AV在线| 色情五月丁香| 91nbbbbbb| 中文字幕欧美丝袜07资源| 日韩不卡在线一区二区| 日韩丝袜人妻AV| 色偷偷综合91久久噜噜| 操逼无码操逼| 天天做天天爱天天高潮| 精品视频久久区| 无遮挡男女激烈动态图| 色五月亚洲| 风月影院男女十八禁| 视频一区二区免费在线| 国产日比| 熟女露脸激情自拍视频| 91成人高清在线观看| 超踫中文字幕| 九九这里只有精品| 操逼www.| 欧美精品 - 91爱爱| 91骚熟女| 婷婷香蕉| 久草毛片| 一区二区视频在线播放| 久久AV无码1区2区3区| 加勒比综合网| 五月天婷婷久久| 欧美亚洲清纯| 成人 日本A片无码8888| 韩国三级三级BD在线| 97这里只有精品| 色色色综合网| 国产农村妇女毛片精品久久| 国产熟女免费观看久久| 人人妻人人色| 成人a v在线播放免费| 日本人体九九九九九九| 亚洲综合在线91| 五月天丁香网| 日本久久久久久久久久| 五月综合婷婷久久网站| 中国黄色特级精品一区二区三区片| 不卡中文字幕aⅴ在线| 久久发布国产伦子伦精品| 九色黄站| 91亚洲黑人| 大香蕉99999| 中亚av| 国产97在线 | 亚洲| 五月丁香六月婷| 999久久久国产精品| 激情五月天婷婷| 人妻天堂网| 中文字幕日韩综合| 女性91网站| 区一在线观看| 人妻丰满熟妇一区二区三| 自拍欧美| 综合欧美激情网| 欧美综合色综合| 久久婷婷亚洲| 超碰在线一区| 97 超碰 人人做 人人爱| 日本三级A片网站com| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 久久久久久亚洲Av无码| 中国小夫妻勾搭露脸淫荡对白 | 91人人| 欧美亚洲国产自久久| 精品日韩中文在线| 另类成人首页一区| 综合久| 天天上日日上日韩精品| 国产 大胆 对白| 久久精品美女一区| 天天综合网网欲色| 四季AV一区二区凹凸精品小说| 操逼视频亚洲| 亚洲日韩美女丝袜美腿人妻视频| 美女啊啊啊啊啊啊啊| 国产AV色黄看到爽| 淫穴高潮色图| 国产欧美美女免费观看视频| 熟女这里只有精品6| 高清孕妇孕交 交孕妇| 中亚av| 手机在线中文字幕国产| 欧美综合色图网| 熟女色图在线| 人人透人人操| 成人26uuu| 密臀成人视频久久久| 另类图片五月天| 被男人添B超爽视频| 91精品国产91久久久久久久久久久久| 日本人体九九九九九九| 国产一级高跟丝袜| 日本Suv精品一区二区| 麻豆影音天美视频| 3p国产欧美99热| 日韩一级欧美一级国产一级台湾 | 亭亭丁香激情| 亚洲成?V人片在线观看福利| 超碰97丝袜| 午夜精品人妻二区三区| 97爱免费插| 色爱三区| 天天视频网站黄| 超碰97伊人| 涩涩久久精品| 热天堂一区二区| 国产又爽又黄| 巨爆乳一区二区爆乳区| 天天综合网~91| 99热国产| 99啪啪| 校园春色综合| 日欧操屄视频| 国产成年免费大片黄在线观看| 不卡在线观看视频| 97久久天天综合色天天综合色电影| 香一区二区三区| 色狠狠综合| 国产日韩欧美亚洲精品95| 日本欧美中文字幕| 国产成人五月天丁香花| 日本中文字幕熟妇| 国模不卡一本二本三电影| 五月婷婷六月丁香| 黄色视频特级毛片| 91精品久久久久五月天精品| 亚洲97在线| av2014 日韩在线中文字幕| av东京热男人的天堂| 麻豆九九九| 青青草在线成人视频| 久久综合五月天| 大香蕉乱伦视频网| 亚洲五码一区二区三区| 大香蕉视频一二三区| 亚洲影院成人| 亚洲综合影院| 久久久久白虎| 国产精品第一区第一页| 中文字幕一区二区三区人妻不卡| 亚洲宗合网| 国产精品久久久久久久久久久久久久久 | 欧美真人抽搐一进一出gif| 人妻久久一区二区三区| 久久丝袜| 日韩91网站| 久久黄人人爽视频| sewuyueav| 91老司机精品| 97这里有精品| 精品久久久久综合无码| 男人的天堂1024| 超碰97男女| 久久岛国| 91w欧美| 99人妻| 国产乱伦视频污| 69视频入口| 蜜乳中文字幕a在线| 日韩精品中文字幕人妻| 亚洲一区在线观看欧洲| 欧美特大AA级黄片| 午夜视频久久久久一区| 素人一区二区三区日韩| 国产av强奸美女| 综合 欧美 亚洲 日本| 日本欧美一区二区三区免费| 日韩 欧美 另类 人妻| 熟女人妇一区二区三区| 国产精品自在自拍视频| 天美麻花大全视频| 日本三级大片| 国产精品久久久亚洲一区| 神马久久久久眼| 人妻大相焦在线| 青青草日韩免费观看高清在线| 久草老司机| 欧美激情精品| A级在线视频| 国产日韩在线播放av| 一区二区影院| 99久久婷婷国产综合| 亚洲熟妇极品| 夜夜狠狠躁日日躁色视频| 成人精品欧洲亚洲| 欧美激情 亚洲色图| 亚州综合网| 亚洲国产ⅴ高清在线观看| 欧美性爱十八禁| www.91色综合| 又黄又粗又硬又长又大| 97国产精品久久久久 | 中文字幕精品专区搜索结果91| 欧洲综合色| 无码久久亚洲高清,| 伊人五月天激情| 日本三级黄页| 嫩草伊人久久精品| 97国产精品在线观看| 99人妻| 日韩国产在线观看av| 丁香五月天激情综合| 午夜欧美J进J出白浆流出久久久| 欧洲亚洲天堂精品| 中文字幕乱码在线观看| 欧美五十路熟| 99热这里只有精品99| 91在线色|