Linux下IP――分片与重组
http://blog.csdn.net/Suprman/archive/2006/08/30/1144759.aspx
原理介绍
为一个数据包片再次分片
为数据包分片和为数据包片再次分片之间的细微差别就在于网关处理MF比特的不同。但一个网关为原来为分片的数据包分片时,除了末尾的数据包片,它将其余所有分片上的MF比特都置为一,最后一片为0。然而,当网关为一个非末尾的数据包片再次分片时,它会把生成的所有子分片中的MF比特全部设置为1,因为所有这些子分片都不可能是整个数据包的末尾的数据包片。
对于分片,需要拷贝IP首部和选项,以及数据。而选项的拷贝要注意:根据协议标准,某些选项只应当出现在的一个数据包片中,而其他一些则必须出现在所有的数据包中。
数据包重组
数据结构
为了使数据包的重组效率更高,用于保存数据包的数据结构必须能够做到:
在一组数据包片中快速插入新的数据包片;
有效地判断一个完整的数据包是否已经全部抵达;
具有数据包片超时机制(ip_expire),并且,如果在重组完成之前定时器溢出,则删除数据包片。
为构成某一个特定数据包的一组数据包片快速定位;
互斥操作
重组程序代码使用了一个互斥信号量。Ipfrag_lock
在链表中加入一个数据包片
查找方式:链表的线性查找
溢出时的丢弃
分片列表空间以全满的情况下:丢弃对应的数据包的所有分片。Ip_evictor
测试是否组成一个完整的数据包ip_frag_queue
判断IP_MF位是否为0!
将数据包片组装成完整的数据包LAST_IN,ip_frag_reasm
数据包片链表的维护管理
为了使丢失数据包片的数据包不再浪费存储资源 ,并防止因为标示符字段的重新使用而给IP带来混乱,但已经不可能再受到剩余数据包片时,IP必须定期检查数据包片列表。
Ipq_unlink
Ipq_put
Ipq_kill
Ipqhashfn
Linux下的实现
IP分片
如何提高分片处理的效率
ip_fragment(非UDP使用)
典型调用者
ip_sendà ip_fragment(skb, ip_finish_output);一般从转发来
&nbs
相关文档:
Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......
int Daemon(char* szExecName = NULL)
{
int res = 0;
pid_t pc;
pc = fork();
if(pc < 0)
{
fprintf(stderr,"ERROR_Deamon()_fork(): failed!");
return -1;
}
else if(pc == 0) //sub process
{
}
else if( ......
排队自旋锁(FIFO Ticket Spinlock)是 Linux 内核 2.6.25 版本中引入的一种新型自旋锁,它解决了传统自旋锁由于无序竞争导致的“公平性”问题。本文详细介绍了排队自旋锁的设计原理和具体实现,并与 操作系统采用的类似技术进行比较。最后讨论可能的扩展排队自旋锁的一些想法。
引言
自旋锁(Spinlock)是一种 Lin ......
Ubuntu Linux系统开启TELNET服务的方法
RSS订阅,第一时间获取开源资讯动态
1. sudo apt-get install xinetd telnetd
2. 安装成功后,系统也会有相应提示(好象7.10才有,6.10就没看到)
sudo vi /etc/inetd.conf并加入以下一行
telnet stream tcp nowait telnetd /usr/sbin/tcpd /usr/sbin/in.tel ......