上一页 1 2 3 4 5 6 7 ··· 11 下一页
  2012年1月17日
摘要: 网卡本身是有内存的,每个网卡一般都有4K以上的内存,用来发送,接收数据。数据在从主内存搬到网卡之后,不是立即就能被发送出去的,而是要先在网卡自身的内存中排队,再按照先后顺序发送;同样的,数据从以太网传递到网卡时,网卡也是先把数据存储到自身的内存中,等到收到一帧数据了,再经过中断的方式,告诉主CPU(不是网卡本身的微处理器)把网卡内存的数据读走,而读走后的内存,又被清空,再次被使用,用来接收新的数据,如此循环往复。而网卡本身的内存,又多是按照256字节为1页的方式,把所有内存分页,之后把这些页组成队列,大致的结构如图:一般会划分一小部分页面作为发送数据用的,大部分用于接收网络数据,大致如图:蓝色 阅读全文
posted @ 2012-01-17 17:03 image eye 阅读(4210) 评论(0) 推荐(0) 编辑
  2012年1月16日
摘要: 链路层经过对数据包的优先级进行排队后,把本次需要发送的数据包从优先级最高的队列的头部抽取出来,并下传给网卡驱动程序的数据发送函数,一般命名为xxx_hard_xmit(),由于硬件各个不同,写法也会各个不同,无法抽象出一个标准的写法,但其流程、目的是不变的,是可以抽像出来的,大致的流程如下:1.通过设备结构体net_device中的tbusy(transmit busy)来判断网卡现在是否忙,如果等于1,表示网卡在忙,即目前仍然有数据在传输数据,此时是不能传输数据的,而是判断是否超时,如果未超时,则表示网卡正在忙,正在发送数据包,此时直接返回;如果是超时了,则重新初始化相关寄存器,之后设置 t 阅读全文
posted @ 2012-01-16 15:49 image eye 阅读(2019) 评论(0) 推荐(0) 编辑
  2012年1月12日
摘要: Skb_buff数据包从IP层下传到链路层后,链路层开始对数据包进行处理首先,判断skb_buff数据包是不是不在skb_buff链表中,如果还在(即skb_buff->next!=NULL),则说明上面的处理有问题,代码要避开(人为的避开,代码还是有问题),即不能发送这个数据包,处理方式是,指定发送数据包的设备被指定为NULL,即数据包没有设备真实发送。第二步,判断是否已知下一跳的MAC地址,即skb->arp=1,如果不是,则需要调用arp_find来查找IP地址对应的MAC地址,如果找不到,则直接返回,不再进行发送。第三步,前面两步都正常了,则说明数据包正常,此时判断数据是否 阅读全文
posted @ 2012-01-12 16:15 image eye 阅读(1021) 评论(0) 推荐(0) 编辑
摘要: Tcp层把数据从传输层下传到网络层,之后,网络层将对下传的数据进行处理。首先,要对下传的数据进行排列。经过TCP层的处理,现在的数据已经被放置到skb_buff结构体中的数据空间部分,TP层就要对这个skb_buff进行必要的排列,使得数据有个先来后到的顺序,从而达到公平。对skb_buff的排列,是通过skb_buff对应的sock结构体成员sock->send_tail , sock->send_head 和skb_buff->link3 这三个成员来完成的,大致的排列图示如下:当前sock的所有skb_buff结构体都被按照 图 1 /2 /3 的方式插入到队列中,so 阅读全文
posted @ 2012-01-12 12:09 image eye 阅读(713) 评论(0) 推荐(0) 编辑
  2012年1月11日
摘要: Connect函数之分解1.首先,connect函数从参数获得远端的IP,把这个地址赋值给对应的sock结构体的对应变量,并设置了sock结构体中的一些其他变量后,首先分配(skb_buff+用户空间)大小内存,这两部分是通过调用kmalloc(sizeof(struct skb_buff)+size,priority)来分配的,分配后两个数据块是连续的地址;分配后的内存如下接下来,就是初始化这个刚刚分配好的skb_buff结构体的一些指针成员,之后,把整个数据空间的首地址返回给一个skb_buff指针,以后对skb结构体的操作,就通过这个指针来完成了。接着,把skb_buff跟sock关联起 阅读全文
posted @ 2012-01-11 18:42 image eye 阅读(865) 评论(0) 推荐(0) 编辑
  2012年1月9日
摘要: Connect函数的执行流程,就是按照上图的顺序,一步一步的由各个协议层来封装或解封数据的而构成的,所以这些数据,都是在分配skb_buff这个结构体空间时加入的数据空间中,按照MAC/IP/TCP的先后顺序,把数据封装好,而不是按照TCP/IP/MAC的顺序来的,在connect中,系统会调用ip_send()的函数,返回MAC的数据,此时,有可能远端地址还没有知道(本地路由是否有记录),那么在数据即将发送之前,系统还会调用ARP协议,来解析地址并填充相应字段,如果ARP发送没有结果,就会调用ICMP协议还报告错误。创建完MAC首部之后,在把指针移动IP首部位置,填充IP地址,其中的IP数据 阅读全文
posted @ 2012-01-09 11:32 image eye 阅读(954) 评论(0) 推荐(0) 编辑
摘要: 在使用socket函数创建套接字时,系统创建socket/sock两个结构体,用于本地数据的管理,组织,而这两个数据结构是不会被传送到网络上的,而真正被用来携带数据的结构体是skb_buff,系统在开辟skb_buff结构体空间时,同时把用户数据所需要的空间一起开辟了,也就是一次malloc(sizeof(struct skb_buff)+size)这么多空间,即skb_buff本身的大小,加上用户空间所需要的size大小的空间,由于malloc分配,所以这些空间时连续的一片空间的,也就是说skb_buff结构体数据结束后,接着就是用户的数据,因此,skb_buff结构体的最后成员unsign 阅读全文
posted @ 2012-01-09 10:35 image eye 阅读(1876) 评论(0) 推荐(0) 编辑
  2012年1月8日
摘要: IP(网络层)下传的数据就传输到了链路层,对于我们常用的设备来说,这个层次最主要的设备,就是网卡了,完整的称号是以太网卡,因为网卡有多种格式的,而我们常见到的是以太网卡。以太网的首部如下:数据结构如下struct ethhdr { unsigned char h_dest[ETH_ALEN]; /*目标MAC地址*/ unsigned char h_source[ETH_ALEN]; /* 源MAC地址*/ unsigned short h_proto; /*帧中数据协议类型*/};其中成员h_proto可以使用的数据#define ETH_P_LOOP 0x0060 /* Ethernet 阅读全文
posted @ 2012-01-08 11:41 image eye 阅读(1289) 评论(0) 推荐(0) 编辑
摘要: 网络协议栈7:connect()函数之前之IPTcp的下一层,就是IP(internet protocol,网络协议),IP的结构图和结构体如下:Ip首部结构体struct iphdr {#if defined(LITTLE_ENDIAN_BITFIELD) __u8 ihl:4,/*首部长度*/ version:4;/*版本号,V4、V6*/#elif defined (BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4;#else#error "Please fix <asm/byteorder.h>"#endif __u8 阅读全文
posted @ 2012-01-08 11:01 image eye 阅读(762) 评论(0) 推荐(0) 编辑
  2012年1月7日
摘要: 从connect开始,就涉及到各种各样的协议了,目前先把TCP/IP协议理清。首先,先把TCP(transmit control protocol, 传输控制协议)的结构图跟结构体对上:#define HEADER_SIZE 64 /* maximum header size */struct tcphdr {/*tcp头部*//*发送端端口号:16 比特标识该数据包源端数据发送进程。*/ __u16 source;/*目的端端口号:16 比特标识该数据包目的端数据接收进程。*/ __u16 dest;/*序列号:32比特本端发送的数据包中所包含数据的第一个字节的序列号。*/ __u32 se 阅读全文
posted @ 2012-01-07 15:38 image eye 阅读(1217) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 11 下一页