存档

文章标签 ‘linux’

linux 内核tcp拥塞处理(二)

2012年10月21日 4 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: linux 内核tcp拥塞处理(二)

这篇接的是我最早在javaeye的那篇blog. http://simohayha.iteye.com/blog/614258

首先我们要知道在linux下分为5个拥塞状态,定义如下:

enum tcp_ca_state {
	TCP_CA_Open = 0,
#define TCPF_CA_Open	(1<<TCP_CA_Open)
	TCP_CA_Disorder = 1,
#define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
	TCP_CA_CWR = 2,
#define TCPF_CA_CWR	(1<<TCP_CA_CWR)
	TCP_CA_Recovery = 3,
#define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
	TCP_CA_Loss = 4
#define TCPF_CA_Loss	(1<<TCP_CA_Loss)
}

TCP_CA_OPEN这个就是初始状态,也就是没有检测到任何拥塞的情况.
TCP_CA_Disorder 顾名思义,这个状态就是当第一次由于收到SACK或者重复的ack而检测到拥塞时,就进入这个状态.
TCP_CA_CWR 由于一些拥塞通知事件而导致拥塞窗口减小,然后就会进入这个状态。比如ECN,ICMP,本地设备拥塞。
TCP_CA_Recovery 当CWND减小
TCP_CA_Loss 超时或者SACK被拒绝,此时表示数据包丢失,因此进入这个状态.
阅读全文…

Share
分类: kernel, 协议 标签: , , ,

打开tcp_tw_recycle引起的一个问题

2012年7月4日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: 打开tcp_tw_recycle引起的一个问题

今天普空说了一个问题就是如果设置了tcp_tw_recycle ,那么如果客户端是NAT出来的,那么就可能会出现连接被直接rst的情况。然后我google了下,在内核列表也有人说了这个问题 https://lkml.org/lkml/2008/11/15/67

The big problem is that both are incompatible with NAT. So if you
ever talk to any NATed clients don’t use it.

阅读全文…

Share
分类: kernel 标签: , ,

一个out of socket memory的问题

2012年7月3日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: 一个out of socket memory的问题

今天同事遇到一个问题,就是server(read hat 5, kernel 2.6.18)的dmesg打出了下面两个信息

TCP: too many of orphaned sockets
Out of socket memory

一般我们看到这个信息,第一反应肯定是需要调节tcp_mem(/proc/sys/net/ipv4)了,可是根据当时的内存使用情况,使用的内存并没有超过 tcp_mem。然后我先去看了最新的内核代码,3.4.4,其中涉及到socket 内存报警在这里

bool tcp_check_oom(struct sock *sk, int shift)
{
	bool too_many_orphans, out_of_socket_memory;

	too_many_orphans = tcp_too_many_orphans(sk, shift);
	out_of_socket_memory = tcp_out_of_memory(sk);

	if (too_many_orphans && net_ratelimit())
		pr_info("too many orphaned sockets\n");
	if (out_of_socket_memory && net_ratelimit())
		pr_info("out of memory -- consider tuning tcp_mem\n");
	return too_many_orphans || out_of_socket_memory;
}

上面的代码很简单,就是如果孤儿socket太多,则打印警告,然后如果socket memory超过限制,也打印出警告。
阅读全文…

Share
分类: kernel, 源码阅读 标签: , ,

路由的基本概念介绍

2011年3月27日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: 路由的基本概念介绍

这里主要是针对linux下的路由一些基本概念.

1 路由是位于L3(ip层)。

2 路由表(routing table)也叫做Forwarding Information Base(FIB).

3 路由器之间通过路由协议(routing protocols)进行信息的交换.

4 一个路由表包含了一大堆的路由,一个路由就是存储了一些传输数据包到给定地址的必须信息。在linux里面一个路由主要包括了这三个参数,分别是目的网络地址,需要使用的设备以及下一跳网关(next hop gateway)。
阅读全文…

Share
分类: kernel, 协议 标签: , , ,

introduction to linux kernel tcp/ip procotol stack

2011年1月28日 没有评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: introduction to linux kernel tcp/ip procotol stack

今天给公司同事做的分享.

Share
分类: kernel 标签: ,

linux kernel中如何保证append写的原子性

2010年11月2日 1 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: linux kernel中如何保证append写的原子性

先来描述一下,write系统调用的大体流程,首先内核会取得对应的文件偏移,然后调用vfs的write操作,而在vfs层的write操作的时候会调用对应文件系统的write方法,而在对应文件系统的write方法中aio_write方法,最终会调用底层驱动。这里有一个需要注意的就是内核在写文件的时候会加一把锁(有些设备不会加锁,比如块设备以及裸设备).这样也就是说一个文件只可能同时只有一个进程在写。而且快设备是不支持append写的。

而这里append的原子操作的实现很简单,由于每次写文件只可能是一个进程操作(计算文件偏移并不包含在锁里面),而append操作是每次写到末尾(其他类型的写是先取得pos才进入临界区,而这个时间内有可能pos已经被其他进程改变,而append的pos的计算是包含在锁里面的),因此自然append就是原子的了.
阅读全文…

Share
分类: kernel 标签: , ,

linux kernel中如何得到当前的进程信息

2010年10月2日 8 条评论

原创文章,转载请注明: 转载自pagefault

本文链接地址: linux kernel中如何得到当前的进程信息

我这里内核版本是2.6.35,cpu架构是x86_32.先来看linux下进程的结构。

首先我们要知道在linux中第一个进程是内核进程,pid为0,它是所有的进程的父进程。这个进程也叫swapper,或者说是idle.
阅读全文…

Share
分类: kernel 标签: , , ,