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