标签:信息 from rom 用户 函数 tcp set 序列 offset
struct sock
sock->sk_receive_queue
协议栈负责把数据放到sk_receive_queue中,进程通过recvmsg_from去从协议栈中读数据,
在sk_receive_queue中的都是一个完整的从用户发过来的skb数据包了,里面有完整的tcp的控制信息位于:tcp_skb_cb中,其中有个关键的信息就是序列号了,这tcp_skb_cb->seq
这个skb中内容在IP层和MAC层是如何合并的,还有在skb_receive_queue中的数据包都是有顺序的吗?
以下面一条log为例:测试程序codebox:find_ok_skb.stp
解释下,其中红色部分标志的是一个socket,其中蓝色部分标志的是skb的地址,offset为啥是0一下子就很清楚了,是因为在tcp_recvmsg函数中,对一个skb的读可能是粉尘过了好多次:详细可以看下面的前四条记录,这个skb中有102个字节,这102个字节是通过4次copy读出来的,每次分别读了5\91\5\1个字节读出来,其中每一次的offset分别是0/5/96/101,正好对应,这个也从侧面表明了到tcp_recvmsg中读出来sk_receive_queu队列中的skb都是排好顺序了这个时候读出来的数据都是连续的数据。
Socket Thread ffff8800a5b87800:2383359782 len:1 skb:ffff8800a8b6dd00 curSeq: 2383359782 offset(0) len(102) size(5) Socket Thread ffff8800a5b87800:2383359787 len:1 skb:ffff8800a8b6dd00 curSeq: 2383359782 offset(5) len(102) size(91) Socket Thread ffff8800a5b87800:2383359878 len:1 skb:ffff8800a8b6dd00 curSeq: 2383359782 offset(96) len(102) size(5) Socket Thread ffff8800a5b87800:2383359883 len:1 skb:ffff8800a8b6dd00 curSeq: 2383359782 offset(101) len(102) size(1) Socket Thread ffff8800a5b87800:2383359884 len:1 skb:ffff8800a8b6cb00 curSeq: 2383359884 offset(0) len(45) size(5) Socket Thread ffff8800a5b87800:2383359889 len:1 skb:ffff8800a8b6cb00 curSeq: 2383359884 offset(5) len(45) size(40) Socket Thread ffff8800a5b87800:2383359929 len:1 skb:ffff8800a8b6d200 curSeq: 2383359929 offset(0) len(421) size(5)
标签:信息 from rom 用户 函数 tcp set 序列 offset
原文地址:https://www.cnblogs.com/honpey/p/9029503.html