【linux应用软件编程】进程间的通信方式3【网络抓包工具TCP】 📅 发布时间:2026/9/3 6:19:56 👁 浏览次数: 文章目录一、网络抓包工具wireshark二、TCP协议2.1 TCP的三次握手和四次挥手机制2.1.1 三次握手2.1.2 数据收发2.1.3 四次挥手2.2 TCP报文头部数据位2.3 TCP编程2.4 相关函数接口connectlistenacceptrecv2.5 TCP机制2.6 TCP的粘包问题一、网络抓包工具wiresharkwireshark网络抓包工具可以抓取经过网卡的网络数据从而分析网络问题。Linux下安装wiresharksudo apt-get install wireshark抓包流程:1.启动wireshark :sudo wireshark2.选择抓取的网卡:any3.选择抓取数据包的过滤条件并触发:udp.port500004.进行网络通信二、TCP协议传输层TCP传输控制协议流式套接字TCP特点有连接面向字节流安全可靠的传输协议三次握手、四次挥手、应答机制、超时重传机制机制复杂实时性和效率没有UDP高HTTP、MQTT、FTP2.1 TCP的三次握手和四次挥手机制2.1.1 三次握手三次握手:TCP建立连接时通过三次握手来确保通信双方都已经准备就绪。SYN:请求建立连接标志位ACK:效应报文标志位2.1.2 数据收发PSH:携带数据的报文标志位ACK:效应报文标志位三次握手由客户端发起。2.1.3 四次挥手四次挥手TCP断开连接时通过四次挥手确保通信双方数据都已经收发结束。2.2 TCP报文头部数据位SYN:请求建立连接标志位ACK:效应报文标志位PSH:携带数据的报文标志位FIN:请求断开连接标志位URG:紧急数据标志位RST:重置标志位2.3 TCP编程TCP客户端创建套接字socket();客户端请求建立连接connect();发送数据send();接受数据recv();关闭套接字close();TCP服务端创建套接字监听套接字socket();绑定服务端的IP和端口号bind();监听要和自己握手的客户端listen();接受完成三次握手的客户端产生一个通信套接字connfdaccept();接受数据recv();发送数据send();关闭套接字close();2.4 相关函数接口connect函数原型intconnect(intsockfd,conststructsockaddr*addr,socklen_taddrlen);功能请求建立连接参数sockfd套接字addr 服务端的地址addrlen地址长度返回值成功0失败-1listen函数原型intlisten(intsockfd,intbacklog);功能监听客户端的三次握手参数sockfd: 监听套接字backlog: 最多允许监听的客户端的个数返回值成功0失败-1accept函数原型intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen);功能接收完成三次握手的客户端并返回一个通讯套接字参数sockfd: 监听套接字addr: 保存接入的客户端的地址信息的指针addrlen: 地址信息长度的指针返回值成功通讯套接字失败-1recv函数原型ssize_trecv(intsockfd,void*buf,size_tlen,intflags);功能接收网络数据参数sockfd: 通讯套接字buf: 存放接收到的数据的空间首地址len: 期待接收到的字节数flags: 0 默认方式返回值成功返回实际收到的字节数失败-10发送断开连接2.5 TCP机制三次握手机制四次挥手机制应答机制TCP为发送的数据进行编号发送数据时报文头部的序列号是这包数据的第一个数据的编号将来接收方需要给这包数据发送ACKACK报文中确认号是收到的最后一个字节编号1。超时重传机制TCP每发送一包数据 后都要等待应答如果超时时间之内未收到应答则重新发送这包数据。滑动窗口机制缓冲区保存已发送并收到应答的数据、已发送未收到应答的数据未发送但在对方处理范围内的数据。延迟应答机制TCP可以发送多组数据发送的同时等待应答。流量控制机制TCP会根据发送端的数据处理和接受能力调整自己的发送速率根据ACK中窗口值的大小进行动态调整流量。捎带应答机制ACK可以和应用层发送的数据一起发出表示对上包数据的响应。2.6 TCP的粘包问题粘包发送端发送速度太快接受端处理速度比较慢导致数据在缓冲区缓存应用层读出数据时多包数据产生了粘连。解决粘包的方法收发指定大小数据收发结构体structdata{XXXlongnum;}send(sockfd,data,sizeof(structdata),0);recv(sockfd,data,sizeof(structdata),0);注意跨平台发送时平台的位数。给发送的数据明显的分隔符应用层根据分隔符解析hello\n world\n hello\nworld\n以自定义方式定义发送的数据帧格式接受方严格按照协议方式解析帧头 数据长度 地址 校验 帧尾5A 0101 1010A57EE7EB90消息类型 区分数据包的数据类型校验8位和校验16位和校验CRC校验地址区分数据包的数据类型。