浅析LinuxSocket套接字编程中的 5 个隐患( 三 )


浅析LinuxSocket套接字编程中的 5 个隐患文章插图
图 的上部说明一个 UDP 客户端和服务器 。 左边的对等层完成两个套接字的写操作 , 每个 100 字节 。 协议栈的 UDP 层追踪写的数量 , 并确保当右边的接收者通过套接字获取数据时 , 它以同样数量的字节到达 。 换句话说 , 为读者保留了写者提供的消息边界 。
现在 , 看图的底部.它为 TCP 层演示了相同粒度的写操作 。 两个独立的写操作(每个 100 字节)写入流套接字 。 但在本例中 , 流套接字的读者得到的是 200 字节 。 协议栈的 TCP 层聚合了两次写操作 。 这种聚合可以发生在 TCP/IP 协议栈的发送者或接收者中任何一方 。 重要的是 , 要注意到聚合也许不会发生 —— TCP 只保证数据的有序发送 。
对大多数开发人员来说 , 该陷阱会引起困惑 。 您想要获得 TCP 的可靠性和 UDP 的帧同步 。 除非改用其他的传输协议 , 比如流传输控制协议(STCP) , 否则就要求应用层开发人员来实现缓冲和分段功能 。
查看网络子系统的细节
netstat 工具提供查看 GNU/Linux 网络子系统的能力 。 使用 netstat , 可以查看当前活动的连接(按单个协议进行查看) , 查看特定状态的连接(比如处于监听状态的服务器套接字)和许多其他的信息 。netstat 提供的一些选项和它们启用的特性 。
netstat 实用程序的用法模式
View all TCP sockets currently active$ netstat --tcpView all UDP sockets$ netstat --udpView all TCP sockets in the listening state$ netstat --listeningView the multicast group membership information$ netstat --groupsDisplay the list of masqueraded connections$ netstat --masqueradeView statistics for each protocol$ netstat --statistics尽管存在许多其他的实用程序 , 但 netstat 的功能很全面 , 它覆盖了 route、ifconfig 和其他标准 GNU/Linux 工具的功能 。
监视流量
可以使用 GNU/Linux 的几个工具来检查网络上的低层流量 。 tcpdump 工具是一个比较老的工具 , 它从网上“嗅探”网络数据包 , 打印到 stdout 或记录在一个文件中 。 该功能允许查看应用程序产生的流量和 TCP 生成的低层流控制机制 。 一个叫做 tcpflow 的新工具与 tcpdump 相辅相成 , 它提供协议流分析和适当地重构数据流的方法 , 而不管数据包的顺序或重发 。tcpdump 的两个用法模式 。
tcpdump 工具的用法模式
Display all traffic on the eth0 interface for the local host$ tcpdump -l -i eth0Show all traffic on the network coming from or going to host plato$ tcpdump host platoShow all HTTP traffic for host camus$ tcpdump host camus and (port http)View traffic coming from or going to TCP port 45000 on the local host$ tcpdump tcp port 45000tcpdump 和 tcpflow 工具有大量的选项 , 包括创建复杂过滤表达式的能力 。
【浅析LinuxSocket套接字编程中的 5 个隐患】tcpdump 和 tcpflow 都是基于文本的命令行工具 。 如果您更喜欢图形用户界面(GUI) , 有一个开放源码工具 Ethereal 也许适合您的需要 。 Ethereal 是一个专业的协议分析软件 , 它可以帮助调试应用层协议 。 它的插入式架构(plug-in architecture)可以分解协议 , 比如 HTTP 和您能想到的任何协议(写本文的时候共有 637 个协议) 。