版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、TCP/IP在linux下的具體實(shí)現(xiàn)(初稿,未整理)目錄TCP/IP在linux下的具體實(shí)現(xiàn)(初稿,未整理)1目錄11 通用TCP/IP邏輯結(jié)構(gòu);12 .TCP/IP協(xié)議棧在linux下的層次22.2跟實(shí)現(xiàn)tcp/ip有關(guān)的linux基礎(chǔ)知識(shí):22.3 各層之間的關(guān)系;53基本數(shù)據(jù)結(jié)構(gòu)63.1 msghdr結(jié)構(gòu)63.2.sk_buff_head結(jié)構(gòu)63 .3socket類型;93.4.INET Socket: sock103.5以上個(gè)結(jié)構(gòu)的跳轉(zhuǎn)及函數(shù)指針集合.143.6 struct net_device144實(shí)例:收發(fā)數(shù)據(jù)包流程圖144.2數(shù)據(jù)接收過(guò)程:以下以圖表說(shuō)明(大致原理類似接受過(guò)程)
2、:161 通用TCP/IP邏輯結(jié)構(gòu);與ISO提出的OSI定義網(wǎng)絡(luò)層次(7層)不同,tcp/ip就定義了五層.應(yīng)用層傳輸層網(wǎng)絡(luò)層數(shù)據(jù)鏈路層物理層應(yīng)用層BSD SocketInet socket(tcp/udp)IP 層數(shù)據(jù)鏈路層物理層各層的主要功能及對(duì)應(yīng)的硬件:物理層:定義傳輸?shù)碾娖郊坝布涌跇?biāo)準(zhǔn).數(shù)據(jù)鏈路層:對(duì)應(yīng)的是網(wǎng)卡芯片內(nèi)部程序,用于在ip包前加上相應(yīng)的frame信息.可想想成在網(wǎng)卡芯片里有一個(gè)進(jìn)程在干這件事情.直接跟網(wǎng)卡驅(qū)動(dòng)打交道.網(wǎng)絡(luò)層:用來(lái)路由,數(shù)據(jù)包分片,負(fù)責(zé)把一個(gè)包發(fā)到指定的網(wǎng)絡(luò)號(hào).;傳輸層:把收到的包傳給具體的進(jìn)程(根據(jù)端口號(hào))等,及數(shù)據(jù)包傳輸控制,重發(fā),檢測(cè)功能;應(yīng)用層:把有
3、用的數(shù)據(jù)進(jìn)行重新組裝,定義要傳輸?shù)亩丝诘鹊?2 .TCP/IP協(xié)議棧在linux下的層次LINUX下tcp/ip協(xié)議棧是以4.4 BSD為模板,估計(jì)目前大多數(shù)操作系統(tǒng)以此為模板,稍加改動(dòng),支持BSD Socket 編程模型;在服務(wù)器端:1. 調(diào)用socket()創(chuàng)建一個(gè)socket;2. bind()3. listen()4. accept();5. read/write()在客戶端1 socket();2 connect();3 read/write();2.2跟實(shí)現(xiàn)tcp/ip有關(guān)的linux基礎(chǔ)知識(shí):在linux下,所有的設(shè)備都當(dāng)作文件節(jié)點(diǎn)來(lái)管理,網(wǎng)絡(luò)設(shè)備也不例外,即對(duì)一個(gè)進(jìn)程中的soc
4、ket進(jìn)行讀寫就相當(dāng)于對(duì)進(jìn)程中的已打開(kāi)的文件讀寫,具體的不同體現(xiàn)在讀寫函數(shù)的不同;一下簡(jiǎn)單介紹一下看看進(jìn)程,文件系統(tǒng)及socket之間的關(guān)系;進(jìn)程數(shù)據(jù)結(jié)構(gòu):/只關(guān)心跟文件有關(guān)的那部分struct task_struct ./省略大部分內(nèi)容/* filesystem information */跟進(jìn)程有關(guān)的文件;struct fs_struct *fs;/* open file information */struct files_struct *files;省略了很多很多結(jié)構(gòu),跟文件有關(guān)就fs_struct *fs 跟files_struct *files兩個(gè)結(jié)構(gòu);前者是關(guān)于文件信息的,后者關(guān)
5、于已打開(kāi)文件的信息;主要關(guān)注一下fisle_struct 結(jié)構(gòu)如下定義:struct files_struct atomic_t count;rwlock_t file_lock;/* Protects all the below members. Nests inside tsk-alloc_lock */int max_fds;int max_fdset;int next_fd;struct file * fd;/* current fd array */fd_set *close_on_exec;fd_set *open_fds;fd_set close_on_exec_init;fd_
6、set open_fds_init;struct file * fd_arrayNR_OPEN_DEFAULT;fd_array數(shù)組為改進(jìn)程打開(kāi)的文件列表.file 對(duì)應(yīng)的為每個(gè)具體的文件,file中有個(gè)inode結(jié)構(gòu)體,對(duì)應(yīng)著具體的文件系統(tǒng)類型(如常見(jiàn)的文件系統(tǒng)類型:ext2,ntfs,msdos,qnx4,socket_t),這個(gè)創(chuàng)建的socket對(duì)應(yīng)的文件系統(tǒng)類型就屬于socket_t類型;各結(jié)構(gòu)之間的應(yīng)用關(guān)系如下圖示”該文件讀寫函數(shù)文件 進(jìn)程結(jié)構(gòu)上面僅是稍微介紹一下tcp/ip實(shí)現(xiàn)有關(guān)的文件系統(tǒng).大體上可以這么理解的:一個(gè)進(jìn)程創(chuàng)建了一個(gè)socket進(jìn)行網(wǎng)絡(luò)傳輸,相當(dāng)于打開(kāi)了一個(gè)文件,文
7、件類型是socket_t,在編程人員看來(lái)相當(dāng)于是打開(kāi)了一個(gè)普通文件,而后對(duì)該socket進(jìn)行讀寫時(shí)就相當(dāng)于對(duì)普通文件讀寫一樣可以調(diào)用read/write了.至于socket的read/write(不同的文件系統(tǒng)實(shí)現(xiàn)都不一樣,如fat32 跟ext2,ntfs之間都不一樣)函數(shù)怎樣實(shí)現(xiàn)屬于操作系統(tǒng)的事情;這正是以下要討論的;在file結(jié)構(gòu)里有個(gè)struct file_oprations;用于指向文件的操作函數(shù)指針集合,典型定義如下:不同文件系統(tǒng)對(duì)應(yīng)到的具體函數(shù)不一樣.如對(duì)socket操作時(shí)相應(yīng)的函數(shù)集合為(應(yīng)用層時(shí)):static struct file_operation socket_fil
8、e_ops=llseek:sock_lseek;/函數(shù)read:sock_read,write:sock_write;open:sock_no_open;/沒(méi)有這個(gè)函數(shù),網(wǎng)卡為特殊設(shè)備,通過(guò)系統(tǒng)調(diào)用socket() 來(lái)打開(kāi).Realse:sock_release;.以上介紹的是跟實(shí)現(xiàn)tcp/ip有關(guān)的一些linux基礎(chǔ)知識(shí),繼續(xù)回到層次關(guān)系; Linux網(wǎng)絡(luò)系統(tǒng)基本可分為 硬件層/數(shù)據(jù)鏈路層,Ip(tcp,ip,arp等)層,INET Socket層,BSD Socket層 和應(yīng)用層五部分;其中l(wèi)inux內(nèi)核中包含了前四部分,應(yīng)用層和BSD SOCKET層之間的應(yīng)用程序接口以4.4 BSD為模
9、板.Inet socket層在ip協(xié)議層上一層,對(duì)ip分組排序,控制網(wǎng)絡(luò)效率等;Ip層即tcp/ip協(xié)議棧的互聯(lián)網(wǎng)層實(shí)現(xiàn)部分,整個(gè)協(xié)議棧的核心部分;硬件層跟數(shù)據(jù)鏈路層對(duì)應(yīng)著網(wǎng)卡及其內(nèi)部程序,網(wǎng)卡驅(qū)動(dòng)程序界于鏈路層跟ip層之間.2.3 各層之間的關(guān)系;網(wǎng)卡驅(qū)動(dòng)調(diào)制解調(diào)器驅(qū)動(dòng)硬件設(shè)備內(nèi)核應(yīng)用程序()討論的核心是圖中的內(nèi)核層及硬件設(shè)備層,主要關(guān)注在這些不同的邏輯層次上是通過(guò)什么樣辦法把數(shù)據(jù)包一層一層往下傳遞或上傳的以及各層之間的接口,對(duì)于具體的tcp/ip傳輸控制信息簡(jiǎn)略介紹以下;先簡(jiǎn)單介紹一個(gè)各層的關(guān)系:應(yīng)用層中操作的對(duì)象是socket的文件描述符,通過(guò)文件系統(tǒng)定義的通用接口,使用系統(tǒng)調(diào)用從用戶空
10、間切換到內(nèi)核空間,控制socket文件描述府對(duì)應(yīng)的就是對(duì)BSD SOCKET的操作,從而進(jìn)入到bsd socket層的操作,在BSD socket層中,操作的socket結(jié)構(gòu),每一個(gè)這樣的結(jié)構(gòu)對(duì)應(yīng)的是一個(gè)網(wǎng)絡(luò)連接,通過(guò)網(wǎng)絡(luò)地址族的不同來(lái)區(qū)分不同的操作方法,判斷是否該進(jìn)入到INET socket層,這一層數(shù)據(jù)存放在msghdr結(jié)構(gòu)中,在INET socket層,分成udp跟tcp兩種連接.這一層操作的對(duì)象是sock類型的數(shù)據(jù).數(shù)據(jù)存放在sk_buff結(jié)構(gòu)中.從INET Socket層到IP層,主要是路由過(guò)程,發(fā)送時(shí)確定發(fā)送的下一個(gè)機(jī)器地址,接受時(shí)判斷是轉(zhuǎn)發(fā)該包還是傳給INET socket層,i
11、p層是整個(gè)網(wǎng)絡(luò)協(xié)議的核心,基本上整個(gè)網(wǎng)絡(luò)安全都是在這里實(shí)現(xiàn)的(在這一層,基于2.4版的內(nèi)核,提供了五個(gè)鉤子函數(shù)可用于防火墻的實(shí)現(xiàn),基于linux的防火墻軟件設(shè)計(jì)都是在這一層下的五個(gè)鉤子函數(shù)里添加自己的防火墻策略(詳細(xì)可參考:國(guó)防科大出版社編的).從ip層到硬件層,即調(diào)用網(wǎng)卡驅(qū)動(dòng)程序.下面介紹一下整個(gè)協(xié)議棧核心的數(shù)據(jù)結(jié)構(gòu)3基本數(shù)據(jù)結(jié)構(gòu)整個(gè)網(wǎng)絡(luò)實(shí)現(xiàn)中,數(shù)據(jù)包(在有效數(shù)據(jù)前加上包頭及一些控制信息)是最重要的部分,影響網(wǎng)絡(luò)速率和效率的關(guān)鍵就在于在內(nèi)存中對(duì)數(shù)據(jù)包的管理.在內(nèi)核中,分不同的層次,使用兩種數(shù)據(jù)結(jié)構(gòu)來(lái)保存數(shù)據(jù).在BSD Socket層內(nèi)用msghdr結(jié)構(gòu)保存數(shù)據(jù),在INET Socket層以下
12、用sk_buff保存數(shù)據(jù).前者是為了跟BSD 4.4兼容而定義的.sk_buff是INET Socket及以下層次中存放數(shù)據(jù)的結(jié)構(gòu),在不同層次進(jìn)行數(shù)據(jù)包傳遞,就是通過(guò)它進(jìn)行的(有效數(shù)據(jù)是通過(guò)指針指向的,在不同層次間傳遞包僅需添加改層次上的相應(yīng)信息到skb_buff里)3.1 msghdr結(jié)構(gòu)struct msghdr /在bsd socket層使用此數(shù)據(jù)結(jié)構(gòu)void*msg_name;/* Socket name*/intmsg_namelen;/* Length of name*/struct iovec *msg_iov;/* Data blocks*/從應(yīng)用層傳下來(lái)的數(shù)據(jù),通過(guò)指針指向,
13、不是把數(shù)據(jù)拷貝過(guò)來(lái),_kernel_size_tmsg_iovlen;/* Number of blocks*/從應(yīng)用層傳下的數(shù)據(jù)包個(gè)數(shù)void *msg_control;/* Per protocol magic (eg BSD file descriptor passing) */_kernel_size_tmsg_controllen;/* Length of cmsg list */unsignedmsg_flags;3.2.sk_buff_head結(jié)構(gòu)此數(shù)據(jù)結(jié)構(gòu)很重要,在整個(gè)tcp/ip實(shí)現(xiàn)中,都圍繞著它.刪除了一些不重要的元素struct sk_buff /* These two
14、members must be first. */struct sk_buff* next;/* Next buffer in list */struct sk_buff* prev;/* Previous buffer in list */struct sk_buff_head * list;/* List we are on*/struct sock*sk;/* Socket we are owned by 跟一個(gè)讀寫此包的sock關(guān)聯(lián)*/struct timevalstamp;/* Time we arrived*/struct net_device*dev;/* Device we a
15、rrived on/are leaving by該包即將要通過(guò)網(wǎng)卡設(shè)備或已通過(guò)的網(wǎng)卡設(shè)備*/* Transport layer header */unionstruct tcphdr*th;struct udphdr*uh;struct icmphdr*icmph;struct igmphdr*igmph;struct iphdr*ipiph;struct spxhdr*spxh;unsigned char*raw; h;/tcp/udp層的協(xié)議頭,在INET Socket層時(shí)會(huì)填充;/* Network layer header */unionstruct iphdr*iph;struct
16、ipv6hdr*ipv6h;struct arphdr*arph;struct ipxhdr*ipxh;unsigned char*raw; nh/ip層協(xié)議頭,在ip層時(shí)填充; /* Link layer header */union struct ethhdr*ethernet; unsigned char *raw; mac/鏈路層協(xié)議頭,在鏈路層填充;struct dst_entry *dst;/路由信息表,下一個(gè)要到達(dá)機(jī)器地址,此結(jié)構(gòu)里有個(gè)output函數(shù),在發(fā)包時(shí)調(diào)用此output把包傳給硬件層.整個(gè)網(wǎng)絡(luò)路由表初始化過(guò)程不討論了,/* * This is the control b
17、uffer. It is free to use for every * layer. Please put your private variables there. If you * want to keep them across layers you have to do a skb_clone() * first. This is owned by whoever has the skb queued ATM. */ charcb48; /存放控制命令與控制數(shù)據(jù),每層都可自由使用.unsigned int len;/* Length of actual data實(shí)際數(shù)據(jù)長(zhǎng)度,即tia
18、l-data*/ unsigned int data_len;unsigned intcsum;/* Checksum */unsigned char _unused,/* Dead field, may be reused*/cloned, /* head may be cloned (check refcnt to be sure). */ pkt_type,/* Packet class*/ ip_summed;/* Driver fed us an IP checksum*/_u32priority;/* Packet queueing priority*/atomic_tusers;
19、/* User count - see datagram.c,tcp.c */unsigned shortprotocol;/* Packet protocol from driver. 以太網(wǎng)協(xié)議*/常見(jiàn)的有x.25,arp,以太網(wǎng)ipunsigned shortsecurity;/* Security level of packet包優(yōu)先級(jí)*/unsigned inttruesize;/* Buffer size 緩沖區(qū)長(zhǎng)度,不是)*/unsigned char*head;/* Head of buffer */unsigned char*data;/* Data head pointer
20、*/unsigned char*tail;/* Tail pointer*/unsigned char *end;/* End pointer*/指向?qū)嶋H有效數(shù)據(jù)(從應(yīng)用層傳下來(lái)的數(shù)據(jù))的指針void (*destructor)(struct sk_buff *);/* Destruct function*/#ifdef CONFIG_NETFILTER/* Can be used for communication between hooks. */ unsigned longnfmark;/* Cache info */_u32nfcache;/* Associated connectio
21、n, if any */struct nf_ct_info *nfct;#ifdef CONFIG_NETFILTER_DEBUG unsigned int nf_debug;#endif#endif /*CONFIG_NETFILTER*/#if defined(CONFIG_HIPPI)union_u32ifield; private;#endif#ifdef CONFIG_NET_SCHED _u32 tc_index; /* traffic control index */#endif;從這個(gè)結(jié)構(gòu)可以看出,skb_buff主要工作在INET Socket層,ip層和硬件層.內(nèi)核中有很多
22、對(duì)此結(jié)構(gòu)操作的函數(shù),由于篇幅有限,不作進(jìn)一步討論.3 .3 socket類型;struct socketsocket_statestate;/連接狀態(tài),如SS_CONNECTTED和SS_UNCONNECTED兩種,unsigned longflags;struct proto_ops*ops;/指向不同地址族的操作函數(shù)集合,對(duì)INET 地址族值為inet_proto_ops.為一系列函數(shù)指針集合.如下示/*static struct file_operation socket_file_ops=/在應(yīng)用層時(shí),即文件系統(tǒng)socket_I對(duì)應(yīng)的方法llseek:sock_lseek;/函數(shù)rea
23、d:sock_read,write:sock_write;open:sock_no_open;/沒(méi)有這個(gè)函數(shù),網(wǎng)卡為特殊設(shè)備,通過(guò)系統(tǒng)調(diào)用socket() 來(lái)打開(kāi).Realse:sock_release;以后在此socket上read/write系統(tǒng)調(diào)用都會(huì)轉(zhuǎn)到sock_read/sock_write函數(shù)上;*/ 在BSD SOCKET層時(shí),以連接方式SOCK_STREAM為例此時(shí)ops初始化為inet_dgram_ops,此結(jié)構(gòu)下的具體函數(shù)指針集合如下:/*PF_INET;Inet_release(),inet_bind,inet_stram_connect(),sock_no_sockpa
24、ir(),inet_accept(),inet_getname(),Tcp_poll(),inet_ioctl(),inet_listen(),inet_shutdown(),inet_setsockopt,inet_sendmsg(),inet_recvmsg();*/linux支持的地址族類型:UNIX:用于本機(jī)進(jìn)程間通訊的,類似與共享內(nèi)存及消息隊(duì)列INET:INET套接字,建立在TCP/IP實(shí)現(xiàn)上的.是這次要討論的AX.25:/以下幾種屬于別的網(wǎng)絡(luò)通訊協(xié)議Nowell IPX:AppkeTalk:DDP:struct inode*inode;/文件節(jié)點(diǎn),inode.socket_I成員指
25、向?qū)?yīng)的socket結(jié)構(gòu)指針struct fasync_struct*fasync_list;/* Asynchronous wake up list*/struct file*file;/* File back pointer for gc*/struct sock*sk;/很重要的一個(gè)數(shù)據(jù)結(jié)構(gòu),在INET Socket層中用到,二者互相指向.wait_queue_head_twait;shorttype;unsigned charpasscred;代表BSD Socket層中的socket控制結(jié)構(gòu).注意在應(yīng)用層socket()是個(gè)函數(shù),用于創(chuàng)建一個(gè)socket結(jié)構(gòu).3.4.INET Soc
26、ket: sock在INET Socket數(shù)據(jù)結(jié)構(gòu)中,管理數(shù)據(jù)包存放和調(diào)度的數(shù)據(jù)結(jié)構(gòu)示sock,在INET Socket層以下都使用sock定義如下:/刪除了一些次要的元素struct sock /* Socket demultiplex comparisons on incoming packets. */_u32daddr;/* Foreign IPv4 addr*/_u32rcv_saddr;/* Bound local IPv4 addr*/_u16dport;/* Destination port*/unsigned shortnum;/* Local port*/intbound_
27、dev_if;/* Bound device index if != 0*/* Main hash linkage for various protocol lookup tables. */struct sock*next;struct sock*pprev;struct sock*bind_next;struct sock*bind_pprev;volatile unsigned charstate,/* Connection state*/zapped;/* In ax25 & ipx means not linked*/_u16sport;/* Source port*/unsigne
28、d shortfamily;/* Address family*/unsigned charreuse;/* SO_REUSEADDR setting*/unsigned charshutdown;atomic_trefcnt;/* Reference count*/socket_lock_tlock;/* Synchronizer.*/intrcvbuf;/* Size of receive buffer in bytes最大接受緩沖區(qū)大小*/wait_queue_head_t*sleep;/* Sock wait queue*/struct dst_entry*dst_cache;/* D
29、estination cache*/rwlock_tdst_lock;atomic_trmem_alloc;/* Receive queue bytes committed已用的收緩沖區(qū)*/struct sk_buff_headreceive_queue;/* Incoming packets收到的包放在此隊(duì)里*/atomic_twmem_alloc;/* Transmit queue bytes committed已用的寫緩沖區(qū)*/struct sk_buff_headwrite_queue;/* Packet sending queue*/atomic_tomem_alloc;/* o i
30、s option or other */intwmem_queued;/* Persistent queue size */intforward_alloc;/* Space allocated forward. */_u32saddr;/* Sending source*/unsigned intallocation;/* Allocation mode*/intsndbuf;/* Size of send buffer in bytes最大發(fā)送緩沖區(qū)大小*/*/struct sock*prev;/* Not all are volatile, but some are, so we mig
31、ht as well say they all are. * XXX Make this a flag word -DaveM */volatile chardead,done,urginline,keepopen,linger,destroy,no_check,broadcast,bsdism;unsigned chardebug;unsigned charrcvtstamp;unsigned charuse_write_queue;unsigned charuserlocks;/* Hole of 3 bytes. Try to pack. */introute_caps;intproc;
32、unsigned long lingertime;inthashent;struct sock*pair;/* The backlog queue is special, it is always used with * the per-socket spinlock held and requires low latency * access. Therefore we special case its implementation. */struct struct sk_buff *head;struct sk_buff *tail; backlog;/在此sock在讀寫時(shí),如有數(shù)據(jù)到達(dá),
33、新的數(shù)據(jù)包保存在此結(jié)構(gòu)中,讀包時(shí)如果receive_queue;沒(méi)有數(shù)據(jù),在看此結(jié)構(gòu)中有無(wú).rwlock_tcallback_lock;/* Error queue, rarely used. */struct sk_buff_headerror_queue;struct proto*prot;#if defined(CONFIG_IPV6) | defined (CONFIG_IPV6_MODULE)union struct ipv6_pinfoaf_inet6; net_pinfo;#endifunion struct tcp_optaf_tcp;#if defined(CONFIG_IN
34、ET) | defined (CONFIG_INET_MODULE)struct raw_opttp_raw4;#endif#if defined(CONFIG_IPV6) | defined (CONFIG_IPV6_MODULE)struct raw6_opttp_raw;#endif /* CONFIG_IPV6 */#if defined(CONFIG_SPX) | defined (CONFIG_SPX_MODULE)struct spx_optaf_spx;#endif /* CONFIG_SPX */ tp_pinfo;interr, err_soft;/* Soft holds
35、 errors that dont cause failure but are the cause of a persistent failure not just timed out */unsigned shortack_backlog;unsigned shortmax_ack_backlog;_u32priority;unsigned shorttype;unsigned charlocalroute;/* Route locally only */unsigned charprotocol;struct ucredpeercred;intrcvlowat;longrcvtimeo;l
36、ongsndtimeo;#ifdef CONFIG_FILTER/* Socket Filtering Instructions */struct sk_filter *filter;#endif /* CONFIG_FILTER */* This is where all the private (optional) areas that dont * overlap will eventually live. */union 除了tcp/ip/udp之外的一些協(xié)議的私有數(shù)據(jù), protinfo; /* This part is used for the timeout functions.
37、 */struct timer_listtimer;/* This is the sock cleanup timer. */struct timevalstamp;/時(shí)間信息./* Identd and reporting IO signals */struct socket*socket;/* RPC and TUX layer private data */void*user_data; /* Callbacks */void(*state_change)(struct sock *sk);void(*data_ready)(struct sock *sk,int bytes);void
38、(*write_space)(struct sock *sk);void(*error_report)(struct sock *sk); int(*backlog_rcv) (struct sock *sk,struct sk_buff *skb); void(*create_child)(struct sock *sk, struct sock *newsk);void (*destruct)(struct sock *sk);3.5以上個(gè)結(jié)構(gòu)的跳轉(zhuǎn)及函數(shù)指針集合.BSD Socket:proto_opsINET Socket:proto,通過(guò)BSD Socket的proto_ops結(jié)構(gòu)將
39、操作對(duì)象從socket切換到sock;INET Socket的proto函數(shù)指針集合成員如下(以tcp為例,udp也類似)TCP,tcp_close,tcp_v4_connect,tcp_disconnect,tcp_accept,tcp_ioctl,tcp_v4_init_sockTcp_sendmsg,tcp_recvmsg,tcp_v4_do_rcv,./相當(dāng)于對(duì)tcp協(xié)議的實(shí)現(xiàn)就是對(duì)這些函數(shù)的實(shí)現(xiàn),考慮到這四個(gè)結(jié)構(gòu)的重要性及相互引用的復(fù)雜性,歸納一下這四個(gè)結(jié)構(gòu)之間的關(guān)系及應(yīng)用的層次:msghdr及socket結(jié)構(gòu)在bsd socket層用到,往下轉(zhuǎn)到inet socket及以下層時(shí)就改
40、用sock跟skb_buff結(jié)構(gòu).在socket中有一個(gè)指向sock及inode的指針,但是沒(méi)有指向msghdr的指針,msghdr中沒(méi)有任何指向剩下三個(gè)的指針.在bsd socket層會(huì)把buf數(shù)據(jù)的指針付給msghd-iov;注意僅僅是指針賦值,不涉及數(shù)據(jù)拷貝.讓iov與buf指向同一數(shù)據(jù)區(qū).3.6 struct net_device/省略大部分內(nèi)容void *priv;初始化時(shí)指向pci-dev;用于讀取一些端口資源。Unsigned char dev_addrlen /mac地址。Int MTU;/相應(yīng)的函數(shù)操作。4實(shí)例:收發(fā)數(shù)據(jù)包流程圖不分析建立socket()過(guò)程了,假設(shè)已調(diào)用成功
41、了socket(),connect()(服務(wù)器端:socket,bind,listen,accept)函數(shù),相應(yīng)的socket結(jié)構(gòu)已與進(jìn)程聯(lián)系在一塊了發(fā)送數(shù)據(jù)Send或sendmsg()都類似Write(fd,*buff,len),系統(tǒng)調(diào)用,應(yīng)用層有個(gè)防火墻鉤子函數(shù),針對(duì)dev做一些檢查,判斷是否發(fā)這個(gè)包.Ip_finish_output2 skb_buff *skb)如果沒(méi)有定義NAT功能(網(wǎng)絡(luò)地址轉(zhuǎn)換,可直接修改源目的地址),直接到ip_finish_ouput().Ip_finish_output(skb_buff *skb )Ip_output(skb_buff *skb)Ip_que
42、ue_xmit2(struct sk_buff *skb)Tp-af_specific-queue_xmit()(tcp頭部)此處有個(gè)防火墻鉤子函數(shù).負(fù)責(zé)路由過(guò)程,加上ip頭,打包后給下一層函數(shù).結(jié)束skb中以包含tcp,ip頭及數(shù)據(jù)指針.Ip_queue_xmit(struct sk_buff *skb)Socket結(jié)構(gòu)在這個(gè)函數(shù)中結(jié)束,往下改用它指向的sock結(jié)構(gòu)Sock_write(file*file,*buf,len,)Sys_write(int fd,char *buf,size len) /fd 為socket描述府,buf為要發(fā)送的數(shù)據(jù)區(qū).以下內(nèi)核空間(操作系統(tǒng)接管)用戶空間BS
43、D SOCKET層根據(jù)得到fd得到文件fileFile-file_operation的write()調(diào)用socket結(jié)構(gòu)中對(duì)應(yīng)的proto_ops集合的sendmsg(),對(duì)于inet此處為inet_sendmsg此函數(shù)中將會(huì)首先出現(xiàn)socket與msghdr結(jié)構(gòu).socket是通過(guò)inode-socket_來(lái)引用的,把buf的指針付給msghdr中的iov;Sock_sendmsg(socket *sock,msghdr &msg,size)Sock-prot-sendmsg()Inet_sendmsg(socket *sock,msghdr,size)將msghdr結(jié)構(gòu)中的數(shù)據(jù)轉(zhuǎn)換到sk_
44、buff中,至此,msghdr結(jié)束壽命,改用sk_buff存數(shù)據(jù),一直到硬件層,此結(jié)構(gòu)極復(fù)雜.Tcp_sendmsg(sock *sk,msghdr *msg,size)將待發(fā)的數(shù)據(jù)排到sock-write_queue隊(duì)列中.Tcp_send_skb(sock *sk,sk_buff *skb,)生成tcp頭存在skb數(shù)據(jù)區(qū)中,生成校驗(yàn)碼,往下轉(zhuǎn)ip層Tcp_transmit_skb(sock *sk,sk_buf *skb)INET Socket層通過(guò)sk-tcp_opt *tp-af_specific-queue_xmit轉(zhuǎn)到Ip層初始化為Ip_queue_xmit判斷空間是否夠,如果數(shù)據(jù)
45、長(zhǎng)度大于MTU,調(diào)用分包函數(shù)ip_fragment();不作考慮.,出現(xiàn)并得到netdevice結(jié)構(gòu),根據(jù)路由初始化下一個(gè)要到達(dá)機(jī)器的地址.待續(xù).Neigh_resolve_output(skb_buf *skb)rtl8139_start_xmit()會(huì)此函數(shù)涉及到Qos管理,從skb中獲取網(wǎng)卡dev指針,調(diào)用與此網(wǎng)卡對(duì)應(yīng)的驅(qū)動(dòng)程序,若網(wǎng)卡為8139網(wǎng)卡,對(duì)應(yīng)的發(fā)送驅(qū)動(dòng)程序函數(shù)為rtl8139_start_xmit(),此函數(shù)屬于硬件驅(qū)動(dòng)層;Dev_queue_xmit(skb)Skb-dst-neighbour-output函數(shù)設(shè)為neigh_resole_output(),在ip_fin
46、ish_output2()中調(diào)用傳下來(lái),此來(lái)ip層的最后一站,這里會(huì)填充硬件mac地址.調(diào)用neigh-ops-queue_xmit()進(jìn)入硬件層,將mac地址拷貝到數(shù)據(jù)包中Ip層硬件驅(qū)動(dòng)層/鏈路層至此,整個(gè)數(shù)據(jù)包的發(fā)送過(guò)程完畢.最后,skb中數(shù)據(jù)長(zhǎng)度應(yīng)該是tcp包頭+ip包頭+mac地址長(zhǎng)度;4.2數(shù)據(jù)接收過(guò)程:以下以圖表說(shuō)明(大致原理類似接受過(guò)程):1 應(yīng)用層應(yīng)用層調(diào)用函數(shù)recv()或recvform()可以接收數(shù)據(jù),或可直接針對(duì)socket 的文件描述符調(diào)用read()直接接收數(shù)據(jù),與發(fā)送數(shù)據(jù)類似;2 BSD Socket層類似發(fā)送調(diào)用sys_read();在bsd socket層類似
47、于發(fā)送過(guò)程;先看自上向下的過(guò)程(即開(kāi)始在應(yīng)用層有個(gè)read()系統(tǒng)調(diào)用,開(kāi)始讀數(shù)據(jù),如果沒(méi)有,在往下幾步就睡眠等待)應(yīng)用層Bsd socket層Recv/recvmsgTcp_v4_do_establishend()Tcp_v4_do_rcv()有數(shù)據(jù)從網(wǎng)絡(luò)協(xié)議棧中接受數(shù)據(jù),自上而下觸發(fā)的動(dòng)作到這個(gè)函數(shù)為止,出現(xiàn)了第一次等待的過(guò)程,此函數(shù)可能會(huì)被動(dòng)地等待在sk的接收數(shù)據(jù)隊(duì)列上,先判斷sk-receive_queue中里有沒(méi)有符合條件的數(shù)據(jù),如果有則調(diào)用memcpy_toiovec()Inet socket層Read(fd,buf,size)Sock_read()Sys_read()Sock_recvmsg()Inet_recvmsg(socket *sock,msghdr *msg,int size,)tcp_recvmsg(socket *sock,msghdr *msg,int size,)Socket-sock-prot-msg以下改用sock結(jié)構(gòu)Tcp_v4_rcv()接下圖從backlog中填充receive_queue隊(duì)列從skb 中copy有效到msg-iovc中,除掉各種包頭,包含tcp,ip,mac,返回,整個(gè)收
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年天津醫(yī)科大學(xué)臨床醫(yī)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(必刷)
- 2026廣東佛山順德區(qū)教育科學(xué)研究院附屬容桂中學(xué)后勤人員招聘?jìng)淇碱}庫(kù)及1套參考答案詳解
- 2025年四川長(zhǎng)江職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)帶答案解析
- 2025年海南洛桑旅游大學(xué)馬克思主義基本原理概論期末考試模擬題含答案解析(必刷)
- 2025年上海紐約大學(xué)馬克思主義基本原理概論期末考試模擬題含答案解析(必刷)
- 2024年靖邊縣幼兒園教師招教考試備考題庫(kù)帶答案解析(必刷)
- 2025年北京農(nóng)業(yè)職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析(必刷)
- 2024年渤海大學(xué)馬克思主義基本原理概論期末考試題帶答案解析(奪冠)
- 2025年濟(jì)寧職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)附答案解析
- 2025年吉林科技職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)帶答案解析
- 眼科疾病常見(jiàn)癥狀解析及護(hù)理指南
- 鉗工安全操作規(guī)程完整版
- 農(nóng)村水表改造施工方案
- 支持民辦教育發(fā)展增加教育多元化選擇
- 《2+N糖尿病逆轉(zhuǎn)治療行業(yè)規(guī)范與操作流程》
- 《電動(dòng)自行車通信協(xié)議》團(tuán)體標(biāo)準(zhǔn)征求意見(jiàn)稿
- 注射用伏欣奇拜單抗-臨床用藥解讀
- (正式版)DB21∕T 1565-2025 《預(yù)應(yīng)力混凝土管樁基礎(chǔ)技術(shù)規(guī)程》
- 壓裂裂縫檢測(cè)技術(shù)
- 防化兵課件教學(xué)課件
- 傾轉(zhuǎn)旋翼機(jī)減速器潤(rùn)滑系統(tǒng):性能深度剖析與仿真平臺(tái)創(chuàng)新構(gòu)建
評(píng)論
0/150
提交評(píng)論