一、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的主要差异如下表:
| 连接性 | 无连接,发送前无需建立连接 | 面向连接,需经过三次握手建立连接 |
| 可靠性 | 不可靠,可能丢包、乱序,无确认重传 | 可靠,通过确认、重传、排序保证数据正确到达 |
| 资源开销 | 小,包头仅8字节 | 大,包头至少20字节,且需维护连接状态 |
| 传输效率 | 高,无连接建立延迟,适合实时应用 | 相对较低,有连接建立和拥塞控制 |
| 流量控制 | 无 | 有滑动窗口机制进行流量控制 |
| 拥塞控制 | 无 | 有慢启动、拥塞避免等算法 |
| 数据边界 | 保留消息边界,每次recvfrom对应一个sendto | 面向字节流,无边界,需应用层处理分包 |
| 适用场景 | 视频直播、DNS查询、简单请求/响应等实时性要求高、允许少量丢包的应用 | 文件传输、邮件、网页浏览等对可靠性要求高的应用 |
补充:笔记中提到“TCP包头至少占20个字节”,实际TCP选项字段可能使头部扩展,但最小确实为20字节。UDP头部固定8字节,体现了其轻量级特点。
四、今日练习思考
1.编写收端和发端利用TCP实现发送一个文件





网硕互联帮助中心








评论前必须登录!
注册