TCP ADI in Linux(1): Introduction

今天开始好好研究TCP/IP的Linux实现,结合书和代码希望自己能对TCP这块更加的熟悉。读Kernel代码还是功利性强一点比较好,比如这次我是由于毕设相关才来仔细研究TCP这块的具体实现的。没有目的性的看这种大块头项目,效率比较难保障。Anyway,这个系列也是看到那块记录哪块,用以加强自己的理解。题目中的ADI分别是Architecture, Design, Implementation。书就是下面这一本了,英文的比较带劲,:)

《TCP/IP ARCHITECTURE, DESIGN, AND IMPLEMENTATION IN LINUX》 by Sameer Seth   

Introduction


读这种大块头的项目时,首先应该首先熟悉代码的框架,而不是立马dive into source code。这方面有许多优秀的工具能帮助我们了解代码的框架,这里推荐understand. 顺带吐槽一下,个人觉得这款软件远没有source insight闻名的主要原因就是这软件的名字。

Once we know how the code is distributed, it becomes  
easier to find out the relevant code in which we are interested.  

几乎所有的网络应用都是基于基础的client-server框架的,后续的优化主要是为了做到更好地安全性,负载均衡等。

在Linux中,sk_buff结构体包含一个packet的所有相关信息,把sk_buff理解为TCP packet在Linux中的表示也不为过。

1.1.1 Moving Down the Stack是一个很好了解TCP/IP栈发包过程的简要描述

1.1.2 Moving Up the Stack则是收包过程的简要描述

Linux的设计上,user-space is preemptible, kernel is non-preemptible.

关于Linux基础知识的介绍,这里就不再解释了。比如system_call, process & thread, user space & kernel space,以及各种锁。

1.7给出了一个典型的client-server程序例子,主要就是需要了解那几个重要函数的用法:socket(), bind(), listen(), accept(), connect() 以及setsockopt()和getsockopt()。这里有一个不错的资料:Linux C function参考手册

socket I/O有blocking和non-blocking之分,I/O复用有select(), poll(), epoll()之分,不熟悉的请移步Google.

TCP状态转换机制可以看TCP/IP详解的卷一中的插图,正常流程没什么好说的。关键在于一些特殊情况的分析,比如TIME_WAIT。

设置TIME_WAIT状态的原因:  
1. 如果最后一个ACK丢失了,需要接受对方重新发送的FIN包并确认;  
2. 防止两个完全一样的流overlap。  

总结

这章主要介绍一些理解与TCP相关的一些Linux机制和基础知识,读下来还是比较顺利的。OK,what’s next ?