udp伪首部

     《tcp/ip详解 卷一 协议》,其中介绍到了UDP和TCP伪首部,由于书中介绍短小精悍,因此有必要扩充理解一下。关于TCP/UDP伪首部我是这么理解的:首先,要时刻谨记一个“伪”字,既然是“伪”首部,也就是假的,不仅是“假”首部,而且“假”到连地址空间都没有。也就是说伪首部是不占地址空间的,在实际传输中不存在这样的字段。只是在使用的时候把它拿出来一下。其次,既然设置了伪首部,那么肯定就是有用的——为了计算检验和!书中原话“其目的是让UDP两次检查数据是否已经正确到达目的地”,具体是那两次呢?我们注意伪首部字段:32位源IP地址、32位目的IP地址、8位协议、16位UDP长度。由此可知,第一次,通过伪首部的IP地址检验,UDP可以确认该数据报是不是发送给本机IP地址的(即确认该数据包确实是传给该主机的);第二,通过伪首部的协议字段检验,UDP可以确认IP有没有把不应该传给UDP而应该传给别的高层的数据报传给了UDP(即确认该数据确实是传给udp的)。从这一点上,伪首部的作用其实很大。


补充:计算校验和是在udp层做的, 那伪首部中包含的目的ip和发送端ip怎么获取? 这该是ip层的事吧?
理解:理想化的模型往往都是逻辑上的,真正实现起来,很多地方要模糊一些。况且协议栈一般在内核中运行,效率是很重要的。往上层说,你在socket layer都能拿到双方IP,那传输层拿到IP又有什么大不了的。往底层说的话,其实传输层和网络层的实现是紧密关联的,在UDP层拿到IP信息其实不是什么麻烦事。数据包一般只在逻辑上分层,物理上仍然存在于同一块数据缓冲里。以freebsd的实现来说,各层之间传递的数据都是同一个package buffer(即mbuf)的指针。IP层会按IP的偏移量去处理数据,UDP层就用UDP层的偏移量处理数据。这样做能省掉相当多的内存复制与拷贝。从这个角度来说,udp的校验和应该是在ip或者ip层以下进行的,即在ip层填充好数据之后进行的,仅仅是猜测,需要后期看源码验证。

转载:
http://wenku.baidu.com/link?url=nCnXHkioZtVpIFEcUQAxpBmTIvb3nlhfxL_SSINixH8QnZd7k3sDBedDHmjFDszm784Tk9tfr9w2EpZ20bceytR9LVuTdxKviaBMOwR5t0e
http://bbs.csdn.net/topics/390470645

posted @ 2014-04-04 15:21  3me  阅读(4520)  评论(0)    收藏  举报