自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wangpengqi的专栏

希望我的博客可以给你带来财富

  • 博客(81)
  • 资源 (3)
  • 收藏
  • 关注

转载 linux下ip协议(V4)的实现(四)

这次主要介绍的是ip层的切片与组包的实现。 首先来看一下分片好的帧的一些概念: 1 第一个帧的offset位非0并且MF位为1 2 所有的在第一个帧和最后一个帧之间的帧都拥有长度大于0的域 3 最后一个帧MF位为0 并且offset位非0。(这样就能判断是否是最后一个帧了). 这里要注意在linux中,ip头的frag_off域包含了 rfcip头的定义中的

2013-08-30 18:43:32 1093

转载 linux下ip协议(V4)的实现(三)

这次我们来看数据包如何从4层传递到3层。 先看下面的图,这张图表示了4层和3层之间(也就是4层传输给3层)的传输所需要调用的主要的函数:  我们注意到3层最终会把帧用dst_output函数进行输出,而这个函数,我们上一次已经讲过了,他会调用skb->dst->output这个虚函数(他会对包进行3层的处理),而最终会调用一个XX_finish_output的函数,从而

2013-08-27 17:54:21 979

转载 linux下ip协议(V4)的实现(二)

这次主要介绍下forward和local delivery。 上次我们提到当ip_rcv_finish完成后后调用相关的发送函数ip_forward或者ip_local_deliver.这次就主要介绍这两个函数。 先来看forward。 forward一般由下面几部组成: 1 执行ip option 2 确定这个包能被forward 3 减小ttl,当ttl为0时,丢掉这个

2013-08-26 18:24:57 783

转载 linux下ip协议(V4)的实现(一)

首先来看校验相关的一些结构: 1 net_device结构: 包含一个features的域,这个表示设备的一些特性(比如控制校验),下面的几个flag就是用来控制校验: #define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */ #define NETIF_F_NO_CSUM 4 /

2013-08-23 09:45:38 1275

转载 linux下ip层的一些概念

首先来看这个ip层的结构: 这里看到非常多的netfilter hook,这是因为netfilter主要是针对ip层的。 ip层的主要任务有下面5个方面: 1 ip数据包的校验 2 防火墙的处理(也就是netfilter子系统) 3 处理options(这里的options包含了一些可选的信息。比如时间戳或者源路由option). 4 切

2013-08-22 12:15:00 1160

转载 Spanning Tree Protocol介绍

Spanning Tree Protocol(STP)主要是用在网桥上,用来避免网络回路,并制造冗余连接(也就是保证网络的可靠性). 这里只是一个大概的介绍,具体的还是要去看IEEE 的 802.1D STP的文档。 先看下面的图: 我们可以看到在stp中,只有一个根节点,然后root port指的是将此网桥和root连接起来的那个端口,而designated

2013-08-20 18:09:46 880

转载 Linux下获取本地IP地址-getifaddrs函数

#include #include #include #include #include #include #include int main(int argc, char *argv[]){ struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getif

2013-08-20 17:33:35 5153

转载 链路层到网络层的数据传递

我们知道在tcp/ip模型中,基本每一层都可以处理多重协议类型,那么当一个输入帧到达后,内核的每一层是如何来取得相应的处理函数呢?也就是说当我要把包传递给上层的时候,如何取得相应协议的处理函数。 我们这里先来看从二层如何把把数据传递给三层。struct sk_buff { .................................... __be16

2013-08-20 15:04:49 1416

转载 网络性能优化(NAPI)

发送路径上的优化  TSO (TCP Segmentation Offload)  TSO (TCP Segmentation Offload) 是一种利用网卡分割大数据包,减小 CPU 负荷的一种技术,也被叫做 LSO (Large segment offload) ,如果数据包的类型只能是 TCP,则被称之为 TSO,如果硬件支持 TSO 功能的话,也需要同时支持硬件的 TCP

2013-08-19 19:01:40 1039

转载 NAPI 技术在 Linux 网络驱动上的应用和完善

前言:NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收的服务程序,然后 POLL 的方法来轮询数据,(类似于底半(bottom-half)处理模式);从我们在实验中所得到的数据来看,在随着网络的接收速度的增加,NIC 触发的中断能做到不断减少,目前 NAPI 技术已经在网卡驱动层和网络层得到了广泛的应用

2013-08-19 18:14:08 952

转载 NAPI 方式的实现

Linux 内核协议栈中报文接收的设计思路:NAPI接口和旧接口两者有一下相同点:  (1)、对报文的处理都应该放在软中断中处理。  (2)、两者都有存储报文的队列,NAPI的队列是由网卡来管理的,旧接口的队列是由内核管理的。每个NAPI设备都有一个轮询函数来由软中断调用,来进行轮询处理报文。我们可以建立一个虚拟的NA

2013-08-19 18:08:00 2751

转载 内核网络输出帧的处理

首先来看如何打开和关闭一个输出队列。 帧的输出状态是通过device->state设为__LINK_STATE_XOFF来表示的。而打开和关闭队列也就是通过这个状态位来处理。 Java代码  static inline void netif_start_queue(struct net_device *dev)  {      netif_tx_st

2013-08-19 11:58:57 860

转载 内核中接收网络帧的处理

我这里描述的只是2层的处理。 首先,我们来看softnet_data这个结构,每个cpu都有这样的一个队列,它主要是用来存储incoming frame。由于他是每个cpu都有一个队列,因此在不同的cpu之间我们就不要任何锁来控制并发的处理这个帧队列。我们在操作系统层要取得帧数据,都是通过这个数据来读取。 Java代码  /*  * Incoming

2013-08-18 17:13:57 857

转载 pci设备的初始化

我们先来看下pci_driver结构,它的id_table是一个指向当前驱动所能处理的pci设备的id列表,由于每个pci设备都有一个唯一的标记,因此我们通过pci_device_id结构就可以标记不同的pci设备。 driver则指向下一个pci驱动。 Java代码  struct pci_driver {      struct list_head 

2013-08-18 10:59:59 1029

转载 linux下的网桥介绍

网桥用来连接不同的网段。使不同的网段能够相互通信,看起来很像三层的路由。它能够有多个port,从而能够将数据帧从一个port复制到另一个port。 这里要注意一点,linux下的网桥只能用于以太网。 来看下示意图:  其中一个是bridge,一个是route。 网桥的主要工作是从输入帧学习主机的位置,建立一个地址的表(也就是表明这个主机(mac地址)属于那个

2013-08-18 10:45:40 967

转载 网桥在内核的实现

我们知道netdevice有一个priv域,这个域用来保存设备的私有数据,当这个设备是一个网桥的时候,priv域也就指向一个struct net_bridge. 接下来看net_bridge以及相关的数据结构: Java代码  struct net_bridge  {  ///自旋锁      spinlock_t          lock;  

2013-08-18 10:33:57 853

转载 cdev_alloc和cdev_init

内核中每个字符设备都对应一个 cdev结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev {struct kobject kobj;          // 每个 cdev都是一个 kobjectstruct module *owner;       //指向实现驱动的模块const struct file_op

2013-08-17 12:01:17 654

转载 字符设备驱动之cdev_init()系列函数

字符设备驱动之cdev_init()系列函数1.内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev {  13        struct kobject kobj;  14        struct module *owner;  15        const s

2013-08-16 19:13:49 2079

转载 netlink的内核实现原理

注:     当用户态进程发送数据时,调用sendmsg实现,其调用内核netlink_sendmsg函数完成,新建了sk_buff,然后给其cb私有缓存中保存了源地址信息,然后把数据拷贝到sk_buff中[nlmsghdr头部已经附在数据部分前面,作为数据部分了]然后利用netlink_unicast发送出去      而当内核态发送时,新建了一个sk_buff,头部填写了nlmsghd

2013-08-16 18:52:22 2770

原创 shell简单的交互式脚本

使用tftp服务从192.168.3.164服务器上下载haha.txt文件到本机目录下来测试shell#!/bin/bash/usr/bin/tftp <<upload_rtt_flags192.168.3.165get haha.txtquitupload_rtt_flags自己测试通过

2013-08-16 15:32:59 2113

转载 向shell脚本中传入参数

写一个 程序名为    test.sh    可带参数为 start 和 stop执行  test.sh start执行  start 内容的代码执行 test.sh stop执行 stop 内容的代码#!/bin/bashif [ $1 == "start" ]  then     echo "do start"  co

2013-08-16 14:48:34 98028

转载 netlink 学习笔记 3.8.13内核

网上有很多netlink的教程,但多针对2.6.*的内核,3.8.13内核的netlink API做了很多改动,但总体上差不多学习netlink除了看别人的教程,感觉要写出个能跑的程序还得自己去读内核代码,就比如netlink_kernel_create这个函数,各版本间有很大不同,如2.6.18和2.6.34都不同,教程上的代码只能作参考下面主要写一下3.8.13内核相比2.6.

2013-08-15 19:33:47 6312

原创 Linux-3.2.0.24中内核的Netlink测试使用

Netlink在2.6版本的内核中变化也是很大的,在最新的2.6.37内核中,其定义已经改成下面这种形式,传递的参数已经达到6个。其中第一个参数和mutex参数都是最新添加的。Mutex也可以为空。这里主要是关于内核空间中的netlink函数的使用。extern struct sock *netlink_kernel_create(struct net *net,

2013-08-14 18:41:44 4174

转载 Linux内核网络协议栈8—socket监听

几个问题 了解以下几个问题的同学可以直接忽略下文:1、listen 库函数主要做了什么? 2、 什么是最大并发连接请求数? 3、什么是等待连接队列? socket 监听相对还是比较简单的,先看下应用程序代码:listen( server_sockfd, 5);其中,第一个参数 server_sockfd为服务端 socket所对应的文件描述符,第二个参数5 代表监听

2013-08-14 09:51:13 938

转载 Linux内核网络协议栈7-socket端口管理

一、前情回顾上一节《socket 地址绑定 》中提到,应用程序传递过来的端口在内核中需要检查端口是否可用:if (sk->sk_prot->get_port(sk, snum)) { inet->saddr = inet->rcv_saddr = 0; err = -EADDRINUSE; goto out_release_sock; }  按照

2013-08-13 18:46:23 1759

转载 CPU亲和性(affinity)sched_setaffinity() 和 sched_getaffinity()

简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。2.6 版本的 Linux 内核还包含了一种机制,它让开发人员可

2013-08-12 19:19:07 1449

转载 深入了解epoll 函数

一、 介绍Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至三次方的下降,而epoll的性能不会随socket数量增加而下降。标准的linux-2.4.20内核不支持epoll,需要打patch。本文主要从linux-2.4.32和linux-2.6.10

2013-08-12 18:57:29 16037 1

转载 epoll_create, epoll_ctl和epoll_wait & select函数分析

man epoll之后,得到如下结果:NAME        epoll - I/O event notification facilitySYNOPSIS        #include DEscrīptION        epoll is a variant of poll(2) that can be used either as Edge or Level 

2013-08-12 18:13:10 1039

转载 Linux内核网络协议栈6-socket地址绑定(2)

三、根据不同的协议来完成绑定 上面代码中的第3步是根据应用程序在创建socket时传递到内核的协议域及socket类型来决定调用采用哪个方法,具体可以参考 创建socket 一文,这里不再赘述;下面以AF_IENT及SOCK_STREAM为例来说明绑定的过程; 1、调用链: net/Socket.c:sys_bind()->net/ipv4/Af_inet.c:inet_bind();

2013-08-12 11:05:50 1089

转载 Linux内核网络协议栈5-socket地址绑定

一、socket绑定入口1、示例代码C代码  struct sockaddr_in server_address;  server_address.sin_family = AF_INET;  server_address.sin_addr.s_addr = inet_addr("0.0.0.0");  server_address.sin_po

2013-08-12 10:11:13 939

转载 Linux内核网络协议栈4-创建socket(2)

接上篇“创建socket” 一文; 5、分配sock结构:本文中的例子会调用inet_family_ops.create方法即inet_create方法完成socket的创建工作;其调用链如下:net/Socket.c:sys_socket()->sock_create()->__sock_create()->net/ipv4/Af_inet.c:inet_cr

2013-08-11 19:40:49 1882

转载 读写锁

读写锁    在线程同步系列的第一篇文章里已经说过, 读写锁是因为有3种状态, 所以可以有更高的并行性.1. 特性:    一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.当读写锁在读加锁状态时, 所有试图以读模式对它进行

2013-08-09 15:25:09 736

转载 Linux内核网络协议栈3-创建socket(1)

1、示例及函数入口:1) 示例代码如下:C代码  int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);  2) 入口:net/Socket.c:sys_socketcall(),根据子系统调用号,创建socket会执行sys_socket()函数;2、分配socket结构:1)

2013-08-09 11:15:57 1137

转载 Linux内核网络协议栈2-socket从库函数到内核

一、socket()库函数到系统调用,再到内核1、Linux运行的C库是glibc;2、socket()调用如下:1) socket()->__socket():glibc-2.3.6/sysdept/generic/socket.c (weak_alias(name1, name2))2) __socket():glibc-2.3.6/sysdept/unix/sysv/linu

2013-08-08 19:04:09 1049

转载 Linux内核网络协议栈1- socket文件系统注册

一、注册时机1、在内核初始化时完成;2、内核初始化过程(init/main.c):kernel_init()->do_basic_setup()->do_initcalls()->do_one_initcall();3、socket文件系统注册过程(net/socket.c):core_initcall(sock_init);1) core_initcall宏定义如下:

2013-08-08 18:58:54 1257

转载 Linux的capability深入分析(2)

一)capability的工具介绍在我们的试验环境是RHEL6,libcap-2.16软件包中包含了相关的capability设置及查看工作,如下:rpm -ql libcap-2.16-5.2.el6.i686 /lib/libcap.so.2/lib/libcap.so.2.16/lib/security/pam_cap.so

2013-08-07 18:46:38 18317 1

转载 Linux的capability深入分析(1)

一)概述:1)从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作.2)capability可以作用在进程上(受限),也可以作用在程序文件上,它与sudo不同,sudo只针对用户/程序/文件的概述,即sudo可以配置某个用户可以执行

2013-08-07 18:46:05 11965 1

转载 深入了解epoll

一、 介绍Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至三次方的下降,而epoll的性能不会随socket数量增加而下降。标准的linux-2.4.20内核不支持epoll,需要打patch。本文主要从linux-2.4.32和linux-2.6.10

2013-08-07 18:43:08 1206

转载 网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开

1、套接字的绑定创建完套接字服务器端会在应用层使用bind函数进行套接字的绑定,这时会产生系统调用,sys_bind内核函数进行套接字。系统调用函数的具体实现[cpp] view plaincopySYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int

2013-08-07 18:38:35 1078

原创 静态库-动态库混合编译

一部分静态连接,一部分动态连接的方法是:-Wl,-dn后面是静态链接-Wl,-dy后面是动态连接,具体如下:cc -g -o test_server main_server.o main_db.o err_me.o -Wl,-dn -L/usr/local/mysql/lib/ -l mysqlclient -Wl,-dy -lpthread -lm -ldl -lcrypt

2013-08-07 18:22:34 1692

ICMP ping 实现

ping 实现 ICMP

2015-06-01

candence16.6安装破解文件

自己安装candence16.6过程中使用的破解文件,希望可以给大家有帮助。哈哈

2013-04-06

candence16.6安装破解记录

个人安装candence16.6记录,已经破解成功,希望给大家做参考

2013-04-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除