linux系统下如何查看数据包

linux系统下如何查看数据包,第1张

linux上有两种比较好的抓包工具:ethereal和tcpdump

对于ethereal,有图形界面和字符界面两种方式。

到linux系统上执行rpm -qa | grep ethereal-gnome可查看是否安装了图形版本

但是如果服务器上没有xwin图形环境,那么就只能用字符界面了

命令:tethereal

可选参数:-V、-f

如果只执行tethereal,那么将只抓取数据包的包头,不显示里边的内容。加上-V参数后,即可显示内容。

-f 参数用于过滤,默认情况下将抓取tcp和udp所有协议。

如果想抓取UDP数据包并显示内容,则执行tethereal -V -f udp 即可

另外还可以配合grep命令提取需要的关键内容

tcudump命令是另外一个有用的工具,只能在字符下使用,

tcpdump -n -nn -vv -XX -tttt -c 10 -e

参数:

-n:数字端口

-nn:数字地址

-vv:输出详细信息

-c:抓取包的数量

-e:打印以太网报头信息

-i:选择适配器

*** 作系统的UDP接收流程如下:收到一个UDP包后,验证没有错误后,放入一个包队列中,队列中的每一个元素就是一个完整的UDP包。当应用程序通过recvfrom()读取时,OS把相应的一个完整UDP包取出,然后拷贝到用户提供的内存中,物理用户提供的内存大小是多少,OS都会完整取出一个UDP包。如果用户提供的内存小于这个UDP包的大小,那么在填充慢内存后,UDP包剩余的部分就会被丢弃,以后再也无法取回。

这与TCP接收完全不同,TCP没有完整包的概念,也没有边界,OS只会取出用户要求的大小,剩余的仍然保留在OS中,下次还可以继续取出。

socket编程虽然是事实上的标准,而且不同平台提供的接口函数也非常类似,但毕竟它不存在严格的标准。所以各个平台的实现也不完全兼容。下面就从recvfrom()这个函数看看Window平台和Linux平台的不同。

Windows平台的表现

int

WSAAPI

recvfrom(

_In_ SOCKET s,

_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,

_In_ int len,

_In_ int flags,

_Out_writes_bytes_to_opt_(*fromlen, *fromlen) struct sockaddr FAR * from,

_Inout_opt_ int FAR * fromlen

)

再看MSDN说明:

If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost.

可以看出,buf大小小于UDP包大小的时候,recvfrom()会返回-1,并设置错误WSAEMSGSIZE。

实际编程测试验证确实是这样的表现。

Linux平台的表现

__extern_always_inline ssize_t

recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags,

__SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)

可以看出与Windows平台的函数原型相同。但是在其man手册里,没有看到UDP包大于接收缓冲区情况的特殊说明。

写代码测试表明,buf小于UDP包大小的时候,recvfrom()仍然返回复制到缓冲区的字节数,调用者无法得知UDP包被截断的情况。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8632199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存