用軟件編程】進(jìn)程間的通信方式3【網(wǎng)絡(luò)抓包工具TCP】)
文章目錄一、網(wǎng)絡(luò)抓包工具wireshark二、TCP協(xié)議2.1 TCP的三次握手和四次揮手機(jī)制2.1.1 三次握手2.1.2 數(shù)據(jù)收發(fā)2.1.3 四次揮手2.2 TCP報(bào)文頭部數(shù)據(jù)位2.3 TCP編程2.4 相關(guān)函數(shù)接口connectlistenacceptrecv2.5 TCP機(jī)制2.6 TCP的粘包問題一、網(wǎng)絡(luò)抓包工具wiresharkwireshark網(wǎng)絡(luò)抓包工具可以抓取經(jīng)過網(wǎng)卡的網(wǎng)絡(luò)數(shù)據(jù)從而分析網(wǎng)絡(luò)問題。Linux下安裝wiresharksudo apt-get install wireshark抓包流程:1.啟動(dòng)wireshark :sudo wireshark2.選擇抓取的網(wǎng)卡:any3.選擇抓取數(shù)據(jù)包的過濾條件并觸發(fā):udp.port500004.進(jìn)行網(wǎng)絡(luò)通信二、TCP協(xié)議傳輸層TCP傳輸控制協(xié)議流式套接字TCP特點(diǎn)有連接面向字節(jié)流安全可靠的傳輸協(xié)議三次握手、四次揮手、應(yīng)答機(jī)制、超時(shí)重傳機(jī)制機(jī)制復(fù)雜實(shí)時(shí)性和效率沒有UDP高HTTP、MQTT、FTP2.1 TCP的三次握手和四次揮手機(jī)制2.1.1 三次握手三次握手:TCP建立連接時(shí)通過三次握手來確保通信雙方都已經(jīng)準(zhǔn)備就緒。SYN:請(qǐng)求建立連接標(biāo)志位ACK:效應(yīng)報(bào)文標(biāo)志位2.1.2 數(shù)據(jù)收發(fā)PSH:攜帶數(shù)據(jù)的報(bào)文標(biāo)志位ACK:效應(yīng)報(bào)文標(biāo)志位三次握手由客戶端發(fā)起。2.1.3 四次揮手四次揮手TCP斷開連接時(shí)通過四次揮手確保通信雙方數(shù)據(jù)都已經(jīng)收發(fā)結(jié)束。2.2 TCP報(bào)文頭部數(shù)據(jù)位SYN:請(qǐng)求建立連接標(biāo)志位ACK:效應(yīng)報(bào)文標(biāo)志位PSH:攜帶數(shù)據(jù)的報(bào)文標(biāo)志位FIN:請(qǐng)求斷開連接標(biāo)志位URG:緊急數(shù)據(jù)標(biāo)志位RST:重置標(biāo)志位2.3 TCP編程TCP客戶端創(chuàng)建套接字socket();客戶端請(qǐng)求建立連接connect();發(fā)送數(shù)據(jù)send();接受數(shù)據(jù)recv();關(guān)閉套接字close();TCP服務(wù)端創(chuàng)建套接字監(jiān)聽套接字socket();綁定服務(wù)端的IP和端口號(hào)bind();監(jiān)聽要和自己握手的客戶端listen();接受完成三次握手的客戶端產(chǎn)生一個(gè)通信套接字connfdaccept();接受數(shù)據(jù)recv();發(fā)送數(shù)據(jù)send();關(guān)閉套接字close();2.4 相關(guān)函數(shù)接口connect函數(shù)原型intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);功能請(qǐng)求建立連接參數(shù)sockfd套接字addr 服務(wù)端的地址addrlen地址長(zhǎng)度返回值成功0失敗-1listen函數(shù)原型intlisten(intsockfd,intbacklog);功能監(jiān)聽客戶端的三次握手參數(shù)sockfd: 監(jiān)聽套接字backlog: 最多允許監(jiān)聽的客戶端的個(gè)數(shù)返回值成功0失敗-1accept函數(shù)原型intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);功能接收完成三次握手的客戶端并返回一個(gè)通訊套接字參數(shù)sockfd: 監(jiān)聽套接字addr: 保存接入的客戶端的地址信息的指針addrlen: 地址信息長(zhǎng)度的指針返回值成功通訊套接字失敗-1recv函數(shù)原型ssize_trecv(intsockfd,void*buf,size_tlen,intflags);功能接收網(wǎng)絡(luò)數(shù)據(jù)參數(shù)sockfd: 通訊套接字buf: 存放接收到的數(shù)據(jù)的空間首地址len: 期待接收到的字節(jié)數(shù)flags: 0 默認(rèn)方式返回值成功返回實(shí)際收到的字節(jié)數(shù)失敗-10發(fā)送斷開連接2.5 TCP機(jī)制三次握手機(jī)制四次揮手機(jī)制應(yīng)答機(jī)制TCP為發(fā)送的數(shù)據(jù)進(jìn)行編號(hào)發(fā)送數(shù)據(jù)時(shí)報(bào)文頭部的序列號(hào)是這包數(shù)據(jù)的第一個(gè)數(shù)據(jù)的編號(hào)將來接收方需要給這包數(shù)據(jù)發(fā)送ACKACK報(bào)文中確認(rèn)號(hào)是收到的最后一個(gè)字節(jié)編號(hào)1。超時(shí)重傳機(jī)制TCP每發(fā)送一包數(shù)據(jù) 后都要等待應(yīng)答如果超時(shí)時(shí)間之內(nèi)未收到應(yīng)答則重新發(fā)送這包數(shù)據(jù)。滑動(dòng)窗口機(jī)制緩沖區(qū)保存已發(fā)送并收到應(yīng)答的數(shù)據(jù)、已發(fā)送未收到應(yīng)答的數(shù)據(jù)未發(fā)送但在對(duì)方處理范圍內(nèi)的數(shù)據(jù)。延遲應(yīng)答機(jī)制TCP可以發(fā)送多組數(shù)據(jù)發(fā)送的同時(shí)等待應(yīng)答。流量控制機(jī)制TCP會(huì)根據(jù)發(fā)送端的數(shù)據(jù)處理和接受能力調(diào)整自己的發(fā)送速率根據(jù)ACK中窗口值的大小進(jìn)行動(dòng)態(tài)調(diào)整流量。捎帶應(yīng)答機(jī)制ACK可以和應(yīng)用層發(fā)送的數(shù)據(jù)一起發(fā)出表示對(duì)上包數(shù)據(jù)的響應(yīng)。2.6 TCP的粘包問題粘包發(fā)送端發(fā)送速度太快接受端處理速度比較慢導(dǎo)致數(shù)據(jù)在緩沖區(qū)緩存應(yīng)用層讀出數(shù)據(jù)時(shí)多包數(shù)據(jù)產(chǎn)生了粘連。解決粘包的方法收發(fā)指定大小數(shù)據(jù)收發(fā)結(jié)構(gòu)體structdata{XXXlongnum;}send(sockfd,data,sizeof(structdata),0);recv(sockfd,data,sizeof(structdata),0);注意跨平臺(tái)發(fā)送時(shí)平臺(tái)的位數(shù)。給發(fā)送的數(shù)據(jù)明顯的分隔符應(yīng)用層根據(jù)分隔符解析hello\n world\n hello\nworld\n以自定義方式定義發(fā)送的數(shù)據(jù)幀格式接受方嚴(yán)格按照協(xié)議方式解析幀頭 數(shù)據(jù)長(zhǎng)度 地址 校驗(yàn) 幀尾5A 0101 1010A57EE7EB90消息類型 區(qū)分?jǐn)?shù)據(jù)包的數(shù)據(jù)類型校驗(yàn)8位和校驗(yàn)16位和校驗(yàn)CRC校驗(yàn)地址區(qū)分?jǐn)?shù)據(jù)包的數(shù)據(jù)類型。