![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
网络协议栈分析
文章平均质量分 84
wangpengqi
这个作者很懒,什么都没留下…
展开
-
网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
1、先说一下sk_buff结构体这个结构体是套接字的缓冲区,详细记录了一个数据包的组成,时间、网络设备、各层的首部及首部长度和数据的首尾指针。下面是他的定义,挺长[cpp] view plaincopystruct sk_buff { /* These two members must be first. */转载 2013-08-06 18:53:24 · 1355 阅读 · 0 评论 -
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 · 1749 阅读 · 0 评论 -
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 · 1085 阅读 · 0 评论 -
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 · 936 阅读 · 0 评论 -
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 · 1880 阅读 · 0 评论 -
读写锁
读写锁 在线程同步系列的第一篇文章里已经说过, 读写锁是因为有3种状态, 所以可以有更高的并行性.1. 特性: 一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁. 正是因为这个特性,当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.当读写锁在读加锁状态时, 所有试图以读模式对它进行转载 2013-08-09 15:25:09 · 735 阅读 · 0 评论 -
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 · 1256 阅读 · 0 评论 -
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 · 1047 阅读 · 0 评论 -
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 · 1136 阅读 · 0 评论 -
网络协议栈深入分析(四)--套接字内核初始化和创建过程
1、系统初始化过程中会调用sock_init函数进行套接字的初始化,主要是进行缓存的初始化[cpp] view plaincopystatic int __init sock_init(void) { int err; //初始化.sock缓存 sk_init();转载 2013-08-07 10:44:26 · 1177 阅读 · 0 评论 -
网络协议栈深入分析(五)--套接字的绑定、监听、连接和断开
1、套接字的绑定创建完套接字服务器端会在应用层使用bind函数进行套接字的绑定,这时会产生系统调用,sys_bind内核函数进行套接字。系统调用函数的具体实现[cpp] view plaincopySYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int转载 2013-08-07 18:38:35 · 1073 阅读 · 0 评论 -
网络协议栈深入分析(三)--BSD socket和传输层sock
Linux内核中协议族有INET协议族,UNIX协议族等,我们还是以INET协议族为例。下面是内核中的协议族声明:[cpp] view plaincopy/* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Un转载 2013-08-06 19:29:48 · 1108 阅读 · 0 评论 -
网络协议栈深入分析(二)--sk_buff的操作函数
1、alloc_skb()函数该函数的作用是在上层协议要发送数据包的时候或网络设备准备接收数据包的时候会调用alloc_skb()函数分配sk_buff结构体,需要释放时调用kfree_skb()函数。[cpp] view plaincopystatic inline struct sk_buff *alloc_skb(unsigne转载 2013-08-06 18:56:10 · 1332 阅读 · 0 评论 -
Linux内核网络协议栈8—socket监听
几个问题 了解以下几个问题的同学可以直接忽略下文:1、listen 库函数主要做了什么? 2、 什么是最大并发连接请求数? 3、什么是等待连接队列? socket 监听相对还是比较简单的,先看下应用程序代码:listen( server_sockfd, 5);其中,第一个参数 server_sockfd为服务端 socket所对应的文件描述符,第二个参数5 代表监听转载 2013-08-14 09:51:13 · 937 阅读 · 0 评论