云计算百科
云计算领域专业知识百科平台

Linux软件编程:wireshark抓包工具和TCP通信

一、Wireshark抓包工具的使用

Wireshark是一款功能强大的网络协议分析器,能够实时捕获网络接口的数据包,并详细解析各层协议头部,对于理解网络通信过程、调试网络程序非常有帮助。

1. 安装方法

在Ubuntu系统中,若网络已连通且apt源配置正确,可通过以下命令安装:

sudo apt-get install wireshark

安装完成后,通常需要以root权限启动才能捕获所有网络接口的数据包。

2. 启动与基本操作

  • 启动命令:sudo wireshark,图形界面打开后选择要监听的网卡(如ens33),点击开始捕获。

  • 捕获过程中,所有经过该网卡的数据包都会被显示。

  • 通信结束后,可停止捕获,并在过滤栏输入规则筛选感兴趣的数据包。

3. 常用过滤规则

过滤规则基于BPF语法,常用示例:

  • tcp:仅显示TCP协议包。

  • udp:仅显示UDP协议包。

  • udp.port == 50000:显示源或目的端口为50000的UDP包。

  • tcp.port == 50000:显示源或目的端口为50000的TCP包。

  • ip.addr == 192.168.0.165:显示源或目的IP为192.168.0.165的包。

补充:Wireshark支持多种表达式组合,例如 tcp.port == 80 && ip.src == 192.168.1.1 可进一步精确筛选。掌握过滤规则能极大提高分析效率。


二、TCP通信编程

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。编程时需严格遵循其连接建立、数据传输和连接释放的流程。

1. TCP通信的基本流程

根据角色不同,分为服务器端和客户端。

服务器端流程:

  • 创建套接字(socket)

  • 绑定地址与端口(bind)

  • 设置监听(listen)

  • 接受连接请求(accept)

  • 接收数据(recv)或发送数据(send)

  • 关闭连接(close)

  • 客户端流程:

  • 创建套接字(socket)

  • 向服务器发起连接(connect)

  • 发送数据(send)或接收数据(recv)

  • 关闭连接(close)

  • 2. 关键函数接口详解

    (1)socket

    int socket(int domain, int type, int protocol);

    • domain:协议族,AF_INET表示IPv4。

    • type:套接字类型,SOCK_STREAM表示流式套接字(TCP)。

    • protocol:通常传0,自动选择对应协议。

    • 返回值:成功返回文件描述符,失败返回-1。

    (2)bind

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    • 将套接字与本地IP和端口绑定。服务器端必须调用此函数,客户端通常不需要(系统自动分配临时端口)。

    (3)listen

    int listen(int sockfd, int backlog);

    • 使套接字变为被动监听状态,等待客户端连接。

    • backlog:未完成连接队列的最大长度(即已完成三次握手但未被accept取走的连接数+尚未完成握手的连接数)。

    (4)accept

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    • 从已完成连接队列中取出第一个连接,返回一个新的套接字用于与该客户端通信。

    • addr 和 addrlen 用于获取客户端的地址信息,若不需要可传NULL。

    (5)connect

    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    • 客户端主动向服务器发起连接请求,触发三次握手。

    (6)send 和 recv

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
    ssize_t recv(int sockfd, void *buf, size_t len, int flags);

    • 用于已建立连接的套接字上发送或接收数据。

    • flags一般设为0。

    • recv 返回0表示对端关闭连接,-1表示出错。

    补充说明:TCP协议为保证可靠传输,内置了确认、重传、流量控制等机制,因此编程接口相对简单,但底层实现复杂。


    三、UDP与TCP的区别对比

    基于课堂笔记及个人理解,整理UDP与TCP的主要差异如下表:

    对比维度UDP (User Datagram Protocol)TCP (Transmission Control Protocol)
    连接性 无连接,发送前无需建立连接 面向连接,需经过三次握手建立连接
    可靠性 不可靠,可能丢包、乱序,无确认重传 可靠,通过确认、重传、排序保证数据正确到达
    资源开销 小,包头仅8字节 大,包头至少20字节,且需维护连接状态
    传输效率 高,无连接建立延迟,适合实时应用 相对较低,有连接建立和拥塞控制
    流量控制 有滑动窗口机制进行流量控制
    拥塞控制 有慢启动、拥塞避免等算法
    数据边界 保留消息边界,每次recvfrom对应一个sendto 面向字节流,无边界,需应用层处理分包
    适用场景 视频直播、DNS查询、简单请求/响应等实时性要求高、允许少量丢包的应用 文件传输、邮件、网页浏览等对可靠性要求高的应用

    补充:笔记中提到“TCP包头至少占20个字节”,实际TCP选项字段可能使头部扩展,但最小确实为20字节。UDP头部固定8字节,体现了其轻量级特点。


    四、今日练习思考

    1.编写收端和发端利用TCP实现发送一个文件

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux软件编程:wireshark抓包工具和TCP通信
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!