TCP/IP在linux下的具体实现(初稿,未整理)目录TCP/IP在linux下的具体实现(初稿,未整理)................................................................................1目录...........................................................................................................................................11通用TCP/IP逻辑结构;........................................................................................................12.TCP/IP协议栈在linux下的层次........................................................................................22.2跟实现tcp/ip有关的linux基础知识:......................................................................22.3各层之间的关系;.......................................................................................................53基本数据结构........................................................................................................................63.1msghdr结构................................................................................................................63.2.sk_buff_head{}结构...................................................................................................63.3socket{}类型;..............................................................................................................93.4.INETSocket:sock{}.................................................................................................103.5以上个结构的跳转及函数指针集合.......................................................................143.6structnet_device{.....................................................................................................144实例:收发数据包流程图.....................................................................................................144.2数据接收过程:以下以图表说明(大致原理类似接受过程):...............................161通用TCP/IP逻辑结构;与ISO提出的OSI定义网络层次(7层)不同,tcp/ip就定义了五层.应用层传输层网络层数据链路层物理层应用层BSDSocketInetsocket(tcp/udp)IP层数据链路层物理层各层的主要功能及对应的硬件:物理层:定义传输的电平及硬件接口标准..数据链路层:对应的是网卡芯片内部程序,用于在ip包前加上相应的frame信息.可想想成在网卡芯片里有一个进程在干这件事情.直接跟网卡驱动打交道.网络层:用来路由,数据包分片,负责把一个包发到指定的网络号.;传输层:把收到的包传给具体的进程(根据端口号)等,及数据包传输控制,重发,检测功能;应用层:把有用的数据进行重新组装,定义要传输的端口等等;2.TCP/IP协议栈在linux下的层次LINUX下tcp/ip协议栈是以4.4BSD为模板,估计目前大多数操作系统以此为模板,稍加改动,支持BSDSocket编程模型;在服务器端:1.调用socket()创建一个socket;2.bind()3.listen()4.accept();5.read/write()在客户端1socket();2connect();3read/write();2.2跟实现tcp/ip有关的linux基础知识:在linux下,所有的设备都当作文件节点来管理,网络设备也不例外,即对一个进程中的socket进行读写就相当于对进程中的已打开的文件读写,具体的不同体现在读写函数的不同;一下简单介绍一下看看进程,文件系统及socket之间的关系;进程数据结构://只关心跟文件有关的那部分structtask_struct{…..//省略大部分内容/*filesysteminformation*///跟进程有关的文件;structfs_struct*fs;/*openfileinformation*/structfiles_struct*files;};省略了很多很多结构,跟文件有关就fs_struct*fs跟files_struct*files两个结构;前者是关于文件信息的,后者关于已打开文件的信息;主要关注一下fisle_struct结构如下定义:structfiles_struct{atomic_tcount;rwlock_tfile_lock;/*Protectsallthebelowmembers.Nestsinsidetsk-alloc_lock*/intmax_fds;intmax_fdset;intnext_fd;structfile**fd;/*currentfdarray*/fd_set*close_on_exec;fd_set*open_fds;fd_setclose_on_exec_init;fd_setopen_fds_init;structfile*fd_array[NR_OPEN_DEFAULT];};fd_array[]数组为改进程打开的文件列表.file对应的为每个具体的文件,file中有个inode结构体,对应着具体的文件系统类型(如常见的文件系统类型:ext2,ntfs,msdos,qnx4,socket_t),这个创建的socket对应的文件系统类型就属于socket_t类型;各结构之间的应用关系如下图示”上面仅是稍微介绍一下tcp/ip实现有关的文件系统.大体上可以这么理解的:进程结构文件该文件读写函数一个进程创建了一个socket进行网络传输,相当于打开了一个文件,文件类型是socket_t,在编程人员看来相当于是打开了一个普通文件,而后对该socket进行读写时就相当于对普通文件读写一样可以调用read/write了.至于socket的read/write(不同的文件系统实现都不一样,如fat32跟ext2,ntfs之间都不一样)函数怎样实现属于操作系统的事情;这正是以下要讨论的;在file结构里有个structfile_oprations;用于指向文件的操作函数指针集合,典型定义如下:不同文件系统对应到的具体函数不一样.如对socket操作时相应的函数集合为(应用层时):staticstructfile_operationsocket_file_ops={llseek:sock_lseek;//函数read:sock_read,write:sock_write;open:sock_no_open;//没有这个函数,网卡为特殊设备,通过系统调用socket()来打开.Realse:sock_release;……….}以上介绍的是跟实现tcp/ip有关的一些linux基础知识,继续回到层次关系;Linux网络系统基本可分为硬件层/数据链路层,Ip(tcp,ip,arp等)层,INETSocket层,BSDSocket层和应用层五部分;其中linux内核中包含了前四部分,应用层和BSDSOCKET层之间的应用程序接口以4.4BSD为模板.Inetsocket层在ip协议层上一层,对ip分组排序,控制网络效率等;Ip层即tcp/ip协议栈的互联网层实现部分,整个协议栈的核心部分;硬件层跟数据链路层对应着网卡及其内部程序,网卡驱动程序界于链路层跟ip层之间.2.3各层之间的关系;讨论的核心是图中的内核层及硬件设备层,主要关注在这些不同的逻辑层次上是通过什么样办法把数据包一层一层往下传递或上传的以及各层之间的接口,对于具体的tcp/ip传输控制信息简略介绍以下;先简单介绍一个各层的关系:应用层中操作的对象是socket的文件描述符,通过文件系统定义的通用接口,使用系统调网卡驱动应用程序()内核硬件设备调制解调器驱动用从用户空间切换到内核空间,控制socket文件描述府对应的就是对BSDSOCKET的操作,从而进入到bsdsocket层的操作,在BSDsocket层中,操作的socket{}结构,每一个这样的结构对应的是一个网络连接,通过网络地址族的不同来区分不同的操作方法,判断是否该进入到INETsocket层,这一层数据存放在msghdr{}结构中,在INETsocket层,分成udp跟tcp两种连接.这一层操作的对象是sock{}类型的数据.数据存放在sk_buff{}结构中.从INETSocket层到IP层,主要是路由过程,发送时确定发送的下一个机器地址,接受时判断是转发该包还是传给INETsocket层,ip层是整个网络协议的核心,基本上整个网络安全都是在这里实现的(在这一层,基于2.4版的内核,提供了五个钩子函数可用于防火墙的实现,基于linux的防火墙软件设计都是在这一层下的五个钩子函数里添加自己的防火墙策略(详细可参考:国防科大出版社编的基于linux的防火墙设计与实现).从ip层到硬件层,即调用网卡驱动程序.下面介绍一下整个协议栈核心的数据结构3基本数据结构整个网络实现中,数据包(在有效数据前加上包头及一些控制信息)是最重要的部分,影响网络速率和效率的关键就在于在内存中对数据包的管理.在内核中,分不同的层次,使用两种数据结构来保存数据.在BSDSocket层内用msghdr{}结构保存数据,在INETSocket层以下用sk_buff{}保存数据.前者是为了跟BSD4.4兼容而定义的.sk_buff{}是INETSocket及以下层次中存放数据的结构,在不同层次进行数据包传递,就是通过它进行的(有效数据是通过指针指向的,在不同层次间传递包仅需添加改层次上的相应信息到skb_buff{}里)3.1msghdr结构structmsghdr{//在bsdsocket层使用此数据结构void*msg_name;/*Socketname*/intmsg_namelen;/*Lengthofname*/structiovec*msg_iov;/*Datablocks*///从应用层传下来的数据,通过指针指向,不是把数据拷贝过来,__ker