- 博客(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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人