
TCP/IP
文章平均质量分 91
我恨天
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
TIME_WAIT状态的意义
客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢?有没有什么情况使主动关闭的socket直接进入CLOSED状态呢? 主动关闭的一方在发送最后一个ack 后就会进入TIME_WAIT 状态 停留2MSL(max segment lifetime)时间转载 2013-07-29 13:37:16 · 628 阅读 · 0 评论 -
linux内核定时器的实现
由于linux还不是一个实时的操作系统,因此如果需要更高精度,或者更精确的定时的话,可能就需要打一些实时的补丁,或者用商用版的实时linux,. 这里内的定时器最小间隔也就是1个tick. 这里还有一个要注意的,我这里的分析并没有分析内核新的hrt 定时器.这个定时器是Monta Vista加入到内核的一个高精度的定时器的实现. 先来看几个相关的数据结构. ///这个是转载 2013-08-20 22:27:45 · 866 阅读 · 0 评论 -
内核协议栈tcp层的内存管理
我们先来看tcp内存管理相关的几个内核参数,这些都能通过proc文件系统来修改: Java代码 ///内核写buf的最大值. extern __u32 sysctl_wmem_max; ///协议栈读buf的最大值 extern __u32 sysctl_rmem_max; 这两个值在/proc/sys/net/core 下。这转载 2013-08-20 22:28:04 · 2926 阅读 · 0 评论 -
内核tcp协议栈SACK的处理
上一篇处理ack的blog中我们知道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理。这篇blog就主要来介绍内核如何处理sack段。 SACK是包含在tcp的option中的,由于tcp的头的长度的限制,因此SACK也就是最多包含4个段,也就是32个字节。我们先来看tcp中的SACK段的表示: Java代码 str转载 2013-08-20 22:29:45 · 1769 阅读 · 0 评论 -
linux下ip协议(V4)的实现(四)
这次主要介绍的是ip层的切片与组包的实现。 首先来看一下分片好的帧的一些概念: 1 第一个帧的offset位非0并且MF位为1 2 所有的在第一个帧和最后一个帧之间的帧都拥有长度大于0的域 3 最后一个帧MF位为0 并且offset位非0。(这样就能判断是否是最后一个帧了). 这里要注意在linux中,ip头的frag_off域包含了 rfcip头的定义中的转载 2013-08-15 22:37:46 · 1827 阅读 · 0 评论 -
linux下ip协议(V4)的实现(五)
这次主要介绍一些ip层管理以及统计相关的东西. 首先来看 long-living ip peer information. 我们知道ip协议是无状态的协议.这里内核为了提升性能.为每个目的ip地址(换句话说,也就是和本机进行通信过的主机)保存了一些信息. peer子系统一般是被tcp,或者routing子系统所使用. 这个信息的数据结构是inet_peer,它是一棵转载 2013-08-15 22:39:25 · 1360 阅读 · 0 评论 -
ip层和4层的接口实现分析
首先来看一下基于3层的ipv4以及ipv6实现的一些4层的协议: 这里要注意并没有IGMPV6,这是因为在ipv6中,它是作为iCMPv6的一部分实现的. 首先我们要知道输入数据包的ip头中的protocol域标识了,将要传递的4层协议. 我们这里主要介绍的是ip数据包从3层传递到4层的接口(也就是输入帧接口).而输出帧的处理,我前面的blog都已经转载 2013-08-15 22:40:58 · 826 阅读 · 0 评论 -
linux内核中socket的实现
首先来看整个与socket相关的操作提供了一个统一的接口sys_socketcall. 下面就是它的代码片段: Java代码 asmlinkage long sys_socketcall(int call, unsigned long __user *args) { unsigned long a[6]; unsigned转载 2013-08-15 22:42:28 · 2504 阅读 · 0 评论 -
tcp connection setup的实现(一)
bind的实现: 先来介绍几个地址结构. struct sockaddr 其实相当于一个基类的地址结构,其他的结构都能够直接转到sockaddr.举个例子比如当sa_family为PF_INET时,sa_data就包含了端口号和ip地址(in_addr结构). Java代码 struct sockaddr { sa_family_转载 2013-08-16 09:45:14 · 1493 阅读 · 0 评论 -
tcp协议栈处理各种事件的分析
首先我们来看socket如何将一些状态的变化通知给对应的进程,比如可读,可写,出错等等。 先来看sock结构中这几个相关域: Java代码 struct sock { .......................... wait_queue_head_t *sk_sleep; ............................转载 2013-08-20 22:28:34 · 2735 阅读 · 0 评论 -
linux内核中tcp连接的断开处理
我们这次主要来分析相关的两个断开函数close和shotdown以及相关的套接口选项SO_LINGER。这里要注意SO_LINGER对shutdown无任何影响。它只对close起作用。 先来坎SO_LINGER所对应的数据结构: Java代码 struct linger { ///linger的开关 int l_onoff;转载 2013-08-20 22:27:20 · 7944 阅读 · 0 评论 -
linux内核tcp的定时器管理(二)
这次我们来看后面的3个定时器; 首先是keep alive定时器。 这个定时器主要是由于一条连接可能长时间idle,此时就需要发送探测包,来探测对端是否存活,如果对端收到这个探测包,它会立即相应一个ack,而当接受到ack之后,我们就能确认对端是存活的。否则我们会认为这个连接除了问题。 这个定时器是当一个新的连接变为establish状态的时候被激活,如果在当定时器超时还没转载 2013-08-20 22:27:10 · 998 阅读 · 0 评论 -
tcp connection setup的实现(二)
首先来看下内核如何处理3次握手的半连接队列和accept队列(其实也就是server端的三次握手的状态变换).而半连接队列和accept队列在内核如何表示,我们上次已经介绍过了,这里就不介绍了. 首先我们知道当3层的数据包到达之后会调用4层的协议handle,tcp的话就是tcp_v4_rcv.如何调用可以看我前面的blog: 而在tcp_v4_rcv中,则最终会调用tcp_v转载 2013-08-20 13:49:38 · 1077 阅读 · 0 评论 -
tcp connection setup的实现(三)
先来看下accept的实现. 其实accept的作用很简单,就是从accept队列中取出三次握手完成的socket,并将它关联到vfs上(其实操作和调用sys_socket时新建一个socket类似).然后返回.这里还有个要注意的,如果这个传递给accept的socket是非阻塞的话,就算accept队列为空,也会直接返回,而是阻塞的话就会休眠掉,等待accept队列有数据后唤醒他.转载 2013-08-20 13:50:28 · 1117 阅读 · 0 评论 -
linux 内核tcp数据发送的实现
在分析之前先来看下SO_RCVTIMEO和SO_SNDTIMEO套接口吧,前面分析代码时没太注意这两个.这里算是个补充. SO_RCVTIMEO和SO_SNDTIMEO套接口选项可以给套接口的读和写,来设置超时时间,在unix网络编程中,说是他们只能用于读和写,而像accept和connect都不能用他们来设置.可是我在阅读内核源码的过程中看到,在linux中,accept和connect转载 2013-08-20 13:51:00 · 5170 阅读 · 0 评论 -
tcp的输入段的处理
tcp是全双工的协议,因此每一端都会有流控。一个tcp段有可能是一个数据段,也有可能只是一个ack,异或者即包含数据,也包含ack。如果是数据段,那么有可能是in-sequence的段,也有可能是out-of-order的段。如果是in-sequence的段,则马上加入到socket的receive队列中,如果是out-of-order的段,则会加入到socket的ofo队列。一旦当我们接收到数据转载 2013-08-20 22:28:26 · 885 阅读 · 0 评论 -
内核处理time_wait状态详解
这次来详细看内核的time_wait状态的实现,在前面介绍定时器的时候,time_wait就简单的介绍了下。这里我们会先介绍tw状态的实现,然后来介绍内核协议栈如何处理tw状态。 首先我们要知道在linux内核中time_wait的处理是由tcp_time_wait这个函数来做得,比如我们在closing状态收到一个fin,就会调用tcp_time_wait.而内核为time_wait状态转载 2013-08-20 22:28:57 · 3295 阅读 · 0 评论 -
内核tcp的ack的处理
我们来看tcp输入对于ack,段的处理。 先是ack的处理,在内核中,处理ack段是通过tcp_ack来进行的。 这个函数主要功能是: 1 update重传队列,并基于sack来设置skb的相关buf。 2 update发送窗口。 3 基于sack的信息或者重复ack来决定是否进入拥塞模式。 在看之前我们要知道tcp是累积确认的。为了解决带来的缺转载 2013-08-20 22:29:37 · 2887 阅读 · 0 评论 -
linux 内核tcp拥塞处理(一)
这次我们来分析tcp的拥塞控制,我们要知道协议栈都是很保守的,也就是说只要有一个段被判断丢失,它就会认为发生了拥塞.而现在还有另一种,也就是路由器来通知我们发生了拥塞,这里ip头还会有一个ECN的位(准确的说是两位),来表示已经发送拥塞,不过这里要注意首先收到ECN的是接受方,可是真正需要被通知的却是发送方,因此当接受方收到ECN之后,用下一个ack来通知发送方有拥塞发生了,然后发送方才会做出响应转载 2013-08-20 22:30:02 · 1589 阅读 · 0 评论 -
linux内核tcp的定时器管理(一)
在内核中tcp协议栈有6种类型的定时器: 1 重传定时器。 2 delayed ack定时器 3 零窗口探测定时器 上面三种定时器都是作为tcp状态机的一部分来实现的。 4 keep-alive 定时器 主要是管理established状态的连接。 5 time_wait定时器 主要是用来客户端关闭时的time_wait状态用到。转载 2013-08-20 22:26:52 · 2847 阅读 · 0 评论 -
linux的netlink机制
netlink作为一种用户空间和内核空间通信的机制已经有一定年头了,它不光为了内核和用户通信,还可以作为IPC机制进行进程间通信。其实netlink定义了一个框架,人们可以基于这个框架用它来做可以做的任何事情,linux中不乏这些类似的好的框架。它们的共同点就是内核并不管它们能做什么,然而它们真的很强大,往往可以做到的事情很多,这就是内核不问策略只管实现机制,所有策略让用户实现,netlink框架转载 2013-10-09 22:19:19 · 878 阅读 · 0 评论