Chinaunix首页 | 论坛 | 博客
  • 博客访问: 301638
  • 博文数量: 94
  • 博客积分: 2163
  • 博客等级: 大尉
  • 技术积分: 932
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-20 09:23
文章存档

2012年(2)

2011年(92)

分类: LINUX

2011-09-09 10:53:03

数据包接受通道创建概况
方法就是下层向上层提供发送接口
    从应用层 write()->sock_write() (net/socket.c)->inet_write() (net/inet/af_inet.c)->tcp_write() (net/inet/tcp.c)真正处理。
前两个如前所说只是作一些检查。在传输层进行处理所原因在于:数据的封装只有在传输层才行。
   
    tcp_write()函数完成数据的封装,将用户缓冲区赋值到内核缓冲区,封装到sk_buff结构。如果网络拥塞,则暂时缓存到 write_queue队列中,稍后发送;否则则可以不经过write_queue直接发送出去。传输层协议调用ip_queue_xmit()函数将数 据包发送到网络层进行处理。

   ip_queue_xmit()函数 对数据帧进行完善,调用dev_queue_xmit()函数将数据包送往链路层进行处理。同时将此数据包缓存到sock_send队列,保证可靠传输, 此时,数据包已经从write_queue中删除。write_queue:从用户层结束新的数据包,没有用ip_queue_xmit传输出去。而 send_queue则调用了ip_queue_xmit传输。ip_queue_xmit()直接调用dev_queue_xmit()函数进行发送。

   dev_queue_xmit()完成本层处理后,调用设备结构device的hard_start_xmit函数指针指向的具体硬件发送函数。对于 NE系列网络设备的ei_start_xmit()函数,其首先将数据从内核赋值到网卡设备硬件缓冲区,操作具体的硬件寄存器,最终完成发送。
阅读(1908) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~