
网络协议栈
文章平均质量分 64
chensichensi
这个作者很懒,什么都没留下…
展开
-
数据包的发送流程——基于RTL8139网卡(2)
我们知道对应每一个设备都有一个或几个发送的队列,它们是在驱动加载的时候就初始化的。RTL8139的发送队列只有一个,在alloc_netdev_mq中初始化:tx = kcalloc(queue_count, sizeof(struct netdev_queue), GFP_KERNEL); if (!tx) { print原创 2009-03-09 20:08:00 · 1931 阅读 · 0 评论 -
TCP三步握手建立连接(3)-----被动连接方接收ACK处理
2010-01-30 21:34:55 和前面一样,被动连接方也进入tcp_v4_hnd_req函数处理,不过由于前面受到SYN时已经建立了连接请求(假设SYNCOOKIES没启用),inet_csk_search_req函数返回建立的连接请求结构request_sock。流程进入tcp_check_req处理/* * Process an incoming packet原创 2010-01-30 21:34:00 · 3577 阅读 · 0 评论 -
TCP三步握手建立连接(1)-----主动连接syn包发送
2010-01-30 13:25:52 TCP连接的建立一般是服务器端进入监听状态,然后客户端调用connect来连接。本文分析connect调用的过程,也即第一个syn报文的发送。 connect对应的系统调用是sys_connectSYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,原创 2010-01-30 13:23:00 · 5976 阅读 · 1 评论 -
TCP 发送流程
socket编程中tcp发送的调用有好几个:send, sendmsg, sendpage。不过这些调用都可以归结到内核函数tcp_sendmsg。int tcp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size){ struct sock *sk = sock->原创 2010-02-23 19:15:00 · 4455 阅读 · 2 评论 -
Linux TCP数据包接收流程
TCP接收方存在3种队列:1 Backlog Queue (sk->backlog)2 Prequeue Queue (tp->ucopy.prequeue)3 Receive Queue (sk->receive_queue) 然后来看3个队列的区别。 首先sk_backlog队列是当当前的sock在进程上下文中被使用时,如果这个时候有数据到来,则将数据拷贝到sk_ba原创 2010-02-23 20:30:00 · 6767 阅读 · 3 评论 -
Linux TCP 拥塞控制实现机制
几个重要的计数器:packets_out : snd.una后面的数据包sacked_out :由SACK确认的数据包(当没有SACK时,duplicate ack 也使该计数+1)lost_out :网络中丢失的数据包的估计retrans_out :重传数据包计数 其中lost_out是一个估计值, 取决于具体实现。驻留于网络中原创 2010-02-25 14:53:00 · 3525 阅读 · 2 评论 -
Linux TCP数据包接收处理
在接收流程一节中可以看到数据包在读取到用户空间前,都要经过tcp_v4_do_rcv处理,从而在receive queue中排队。在该函数中,我们只分析当连接已经建立后的数据包处理流程,也即tcp_rcv_established函数。 tcp_rcv_established函数的工作原理是把数据包的处理分为2类:fast path和slow path,其含义显而易见。这样分类的目的原创 2010-02-25 14:54:00 · 12147 阅读 · 1 评论 -
EPOLL 内核实现
epoll是由一组系统调用组成。 int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int time原创 2010-03-02 14:13:00 · 5765 阅读 · 4 评论 -
数据包发送与邻居子系统
<br />数据包从L4传到IP后,IP调用路由子系统来查询路由,并且在查询到路由后,创建一个新的邻居项(struct neigh)<br />与该路由项绑定。该neigh的初始状态为INCOMPLETE,此时在调用发送函数ip_finish_output2中调用<br />if (dst->hh)<br /> return neigh_hh_output(dst->hh, skb);<br /> else if (dst->neighbour)<br /> return dst->neighbour-原创 2010-06-21 21:39:00 · 1490 阅读 · 0 评论 -
TCP连接中断检测
tcp保持一个keepalive定时器,在连接空闲了一定时间间隔后发送一个keepalive数据报给对方:1 如果对方主机可达到并且对方应用程序在运行,对方TCP就会响应一个ACK;本地TCP重置keepalive定时器2 如果对方主机可达但是对方应用程序关闭,对方TCP就会以RST报文响应;本地TCP断开连接并且返回RCONNREST错误给应用程序;3如果对方主机没有发送ACK或原创 2010-01-27 14:38:00 · 1128 阅读 · 0 评论 -
网络广播类型
1 有限广播目的地址为255.255.255.255,该类广播只在本地,不会被路由器转发 2 网络直接广播目的地址有网络号和全1的主机号组成。这种数据报传播给目的网络的所有主机。路由器默认转发此类数据报 3 子网直接广播目的地址有网络号,子网号以及全1的主机号组成;CIDR不区别对待3和2 4 全子网直接广播已废弃。原创 2010-01-27 13:02:00 · 950 阅读 · 0 评论 -
网卡驱动数据包接收流程——基于RTL8139网卡
1 中断函数static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance) 所有有网卡产生的中断都会引起该中断函数的调用,这是在static int rtl8139_open (struct net_device *dev){ struct rtl8139_private *tp = netdev_priv(dev原创 2009-03-08 11:20:00 · 3090 阅读 · 0 评论 -
数据包的发送流程——基于RTL8139网卡(1)
int dev_queue_xmit(strcut sk_buff *skb){ struct net_device *dev = skb->dev; struct Qdisc *q; int rc = -ENOMEM; if (netif_needs_gso(dev,skb))原创 2009-03-09 19:47:00 · 3077 阅读 · 0 评论 -
内核中断机制
Only one old-style bottom half can run at any time, regardless of the number of CPUs 旧式的BH不能并行执行 Only one instance of each tasklet can run at any time. Different tasklets can run concurren转载 2009-07-12 10:46:00 · 715 阅读 · 0 评论 -
Nagle算法
Nagle算法的目的是避免TCP发送大量的小数据包。TCP在接收到前一个小段的ACK消息之前,一直保存小数据包。Nagle算法通常在实现时要求做到,如果存在任何未确认的数据就不能发送小数据包。BSD的实现是允许在空闲链接上发送大的写操作剩下的最后的小段。 Nagle算法是silly window syndrome(SWS)预防算法的一个半集。SWS算法预防发送少量的数据,N原创 2010-01-27 19:25:00 · 3262 阅读 · 0 评论 -
shutdown详解
int shutdown(int socket, int how);shutdown函数可以实现半关闭。当参数how为0时,关闭该socket的接收。Linux丢弃接收缓冲区中的数据,并且对新到的数据确认后直接丢弃;当how为1时,关闭socket的发送。应用程序在此之后不能发送任何数据;当发送缓冲中的数据全部发送后,TCP发送一个FIN给对方。该关闭较常用。how为2相当原创 2010-01-27 20:08:00 · 1159 阅读 · 0 评论 -
TIME-WAIT状态
关于time-wait状态只有发起主动关闭的一方进入此状态。例外情况是双方同时关闭,这时都进入此状态在此状态中停留的时间是2MSL,MSL定义为30秒到2分钟,linux定义的是30秒,所以停留1分钟如果此状态下有数据达到,就重置该定时器。time-wait状态下按理对方关闭了连接,不会有数据到来的。下面是time-wait存在的必要性:对于主动关闭方,最后要发原创 2010-01-27 21:34:00 · 2585 阅读 · 0 评论 -
socket编程相关
发送缓冲区至少为3倍的MSS,可使网络充分利用sockaddr_in结构体使用前要清零使用connect后的UDP性能可以得到提升原创 2010-01-28 10:57:00 · 986 阅读 · 0 评论 -
recv选项MSG_PEEK
如果在recv的时候,flag字段设置了MSG_PEEK,则读取数据包的时候,不会把该数据包从缓存队列中删除;下次读取时还是这个数据包。tcp_recvmsg源代码 if (!(flags & MSG_PEEK)) { sk_eat_skb(sk, skb, copied_early); copied_early = 0; } /** * sk_eat_skb原创 2010-01-27 11:01:00 · 4609 阅读 · 0 评论 -
TCP/UDP 分片问题
<br />区别:<br />应用层调用TCP发送一个数据包,如果大小超过MTU,在TCP层会分片(其中会应用到PMTU Probe),然后调用函数ip_queue_xmit<br />来直接组装成IP包,发送出去;<br />如果是UDP,则直接调用ip_append_data,该函数把用户输入的一整个数据包分片,在接收方则IP组片成原来的UDP数据包。<br /> <br />直接的效果是:<br />TCP数据包是流式的,用户无法在应用层对数据包定界<br />而UDP包如果不超过IP包的最大(655原创 2010-06-21 21:04:00 · 1437 阅读 · 0 评论