Linux-net
ordeder
关注Linux&TCPIP&Nginx&Redis
展开
-
union共用体及其实例分析
【共用体定义】百度百科共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。【Kernel中的一个实例】struct dst_entry{ struct dst_entry *next; ...}...struct rtabl原创 2013-08-18 22:53:43 · 1924 阅读 · 0 评论 -
TCP带外数据(URG,MSG_OOB)
为何不直接将一个字节的紧急数据放在紧急指针哪里呢?答:因为TCP数据包在ip层可能被拆包,成为多个数据段。一个包含紧急数据的数据包被拆成两个数据包,那么这两个包有的tcp头部有相同的紧急指针(和UGR)。如果将紧急数据直接放在紧急指针的内存处,那么将多出一个紧急数据!所以,不该将紧急数据放在TCP头部。 同时,在拆包后,对端将收到两个包,第一个包到达的时候就知道了UGR和紧急指针。如果紧急指针所指的位置已在该包的数据段中,那么紧急数据就到达了。否则,要等到第二个包到达的时候,才能去得到紧原创 2015-01-28 22:48:38 · 12894 阅读 · 3 评论 -
服务器端预先创建子进程(work)同时监听服务端口和惊群现象
1.进程A在n端口上监听,即调用listen(listenfd,backlog);2.之后A调用fork产生子进程B,此时B拷贝了A的listenfd,该描述符使用的是相同的“文件表项”(具体参考 http://blog.csdn.net/ordeder/article/details/21716639)3.那么A进程和B进程将共享一个socket。多个服务进程同时阻塞在accept等待监听套接字已建立连接的信息,那么当内核在该监听套接字上建立一个连接,那么将同时唤起这些处于accept阻塞的服务进程原创 2014-03-21 15:45:15 · 4061 阅读 · 0 评论 -
listen()函数中backlog参数分析
0. accept()函数不参与三次握手,而只负责从已建立连接队列中取出一个连接和服务程序的sockfd进行“映射”,并获取对端主机的ip信息(通过分片sk_buff);1. backlog参数决定了未完成队列和已完成队列中连接数目之和的最大值(从内核角度看,是否这个和就是等于sock->recv_queue ?);2. accept()函数调用,会从已连接队列中取出一个“连接”(可以是一个描述连接的数据结构,listensocket->sock->recv_queue[sk_buff] ? ),未完成原创 2014-03-19 19:57:50 · 29583 阅读 · 7 评论 -
Linux socket 读写接口返回值分析
首先说明:recv()/send(),recvfrom()/sendto(),recvmst()/sendmsg()最终系统入口是sock_sendmsg()/sock_recvmsg()。他们的返回值是统一的。对于sock_sendmsg()/sock_recvmsg(),不同的family具备各自的实现总结如下:对于读返回值的优先级: return copied?:err;原创 2013-12-30 12:53:28 · 4083 阅读 · 0 评论 -
TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系
TCP发送数据的接口有send,write,sendmsg。在系统内核中这些函数有一个统一的入口,即sock_sendmsg()。由于TCP是可靠传输,所以对TCP的发送接口很容易产生误解,比如sn = send(...); 错误的认为sn的值是表示有sn个字节的数据已经发送到了接收端。其实真相并非如此。原创 2013-12-10 11:00:51 · 23164 阅读 · 0 评论 -
Linux2.4-net源码学习笔记 IP层协议栈的实现(II IP数据报路由)
1写在前面路由器是从一个物理网向另一个物理网发送数据包的装置,路由器通常被称为网关,它承但着分发数据包的任务。查看主机当前的路由表$ netstat -rn $ route查看主机的网络信息$ netstat2 路由表2.1 路由表的构成一个路由表的每一项至少包含两个信息:路由表项:|目的主机IP地址 | 下一个路由的IP地址 | ....|原创 2013-08-19 12:14:47 · 1755 阅读 · 0 评论 -
Linux2.4-net源码学习笔记 IP层协议栈的实现(I 数据接收)
【前言】Linux的网络层次如图所示:网络的各个层具有严格的限定。其中BSD Socket是UNIX系统中通用的网络接口,它不仅支持各种不同的网络类型,而且也是一种内部进程之间的通信机制。可以将BSD层看做面向用户的通用接口,可以具有不同类型的Family,比如AF_UNIX:域套接字,仅在单台机子上不同进程间的socket通信;AF_INET:网络域套接字,不同机子间的进程通原创 2013-08-18 09:51:36 · 1847 阅读 · 0 评论 -
Linux内核-从sk_buff{}结构学习“双循环双链表”的实现
【背景】sk_buff{}结构是linux 网络协议栈的重要结构体,本结构描述的数据包(package)穿梭于运输层~链路层之间。每个数据包都有对应的sk_buff进行描述,而系统对这么多的sk_buff的处理时以循环双链表的形式组织的。见如下图:【数据结构】//链表表头,维护一个表,作为一个链表的标杆,不做具体数据的存储struct sk_buff_head {原创 2013-09-14 14:19:02 · 2364 阅读 · 4 评论 -
TCP带外数据(URG,MSG_OOB)
http://blog.csdn.net/ordeder/article/details/43243425原创 2015-01-29 09:47:29 · 1232 阅读 · 0 评论