tcp/udp伪首部的问题


伪首部里面包含源ip和目标ip, 这个是在那一层加入的? 传输层还是网络层?
看了卷2:实现的能不能贴下实现代码

5 个解决方案

#1


伪首部在实际数据包中并不存在,这个东西是传输层计算checksum时凭空加上的。
实现其实很简单的,无非是在传输层数据的前面补一个伪头部结构,将所得数据整体计算checksum。真正传输的时候,这个伪头部是不会发送的。

#2


引用 1 楼 nossiac 的回复:
伪首部在实际数据包中并不存在,这个东西是传输层计算checksum时凭空加上的。
实现其实很简单的,无非是在传输层数据的前面补一个伪头部结构,将所得数据整体计算checksum。真正传输的时候,这个伪头部是不会发送的。

你没看懂我的问题, 我说的是伪首部中包含了发送端ip地址和目的ip地址, 我知道真正传输时并没有包含伪首部, 但计算校验和总得需要它吧? 计算校验和是在udp层做的, 那伪首部中包含的目的ip和发送端ip怎么获取? 这该是ip层的事吧?

#3


引用 2 楼 jaxenix 的回复:
 计算校验和是在udp层做的, 那伪首部中包含的目的ip和发送端ip怎么获取? 这该是ip层的事吧? 

理想化的模型往往都是逻辑上的,真正实现起来,很多地方要模糊一些。况且协议栈一般在内核中运行,效率是很重要的。
往上层说,你在socket layer都能拿到双方IP,那传输层拿到IP又有什么大不了的。
往底层说的话,其实传输层和网络层的实现是紧密关联的,在UDP层拿到IP信息其实不是什么麻烦事。
数据包一般只在逻辑上分层,物理上仍然存在于同一块数据缓冲区里。以freebsd的实现来说,各层之间传递的数据都是同一个package buffer(即mbuf)的指针。IP层会按IP的偏移量去处理数据,UDP层就用UDP层的偏移量处理数据。这样做能省掉相当多的内存复制与拷贝。

#4


引用 3 楼 nossiac 的回复:
Quote: 引用 2 楼 jaxenix 的回复:

 计算校验和是在udp层做的, 那伪首部中包含的目的ip和发送端ip怎么获取? 这该是ip层的事吧? 

理想化的模型往往都是逻辑上的,真正实现起来,很多地方要模糊一些。况且协议栈一般在内核中运行,效率是很重要的。
往上层说,你在socket layer都能拿到双方IP,那传输层拿到IP又有什么大不了的。
往底层说的话,其实传输层和网络层的实现是紧密关联的,在UDP层拿到IP信息其实不是什么麻烦事。
数据包一般只在逻辑上分层,物理上仍然存在于同一块数据缓冲区里。以freebsd的实现来说,各层之间传递的数据都是同一个package buffer(即mbuf)的指针。IP层会按IP的偏移量去处理数据,UDP层就用UDP层的偏移量处理数据。这样做能省掉相当多的内存复制与拷贝。


明白了, 谢谢!

#5


总算弄明白了,谢谢
关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com