socket数据发送过程zz

socket数据发送过程zz

ID:30363044

大小:86.89 KB

页数:14页

时间:2018-12-29

socket数据发送过程zz_第1页
socket数据发送过程zz_第2页
socket数据发送过程zz_第3页
socket数据发送过程zz_第4页
socket数据发送过程zz_第5页
资源描述:

《socket数据发送过程zz》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、socket数据发送过程zz本文在基于以下三个条件所写的:1)OSI七层网络通信模型。2)所阐述的函数是基于Linux2.6.1内核。3)在面向连接的通信协议TCP/IPV4的基础上。由于七层模型应用层,表示层,会话层,传输层,网络层,数据链路层,物理层可以简化为以下五层结构应用层(ApplicationLayer),传输层(TransportLayer),网络层(NetworkLayer),数据链路层(DataLinkLayer),物理层(PhysicalLayer).其中七层模型中的前三层都归结为五层结构中的应用层。为

2、了简化讨论,本文主要从这五层结构来探讨。Layer5:应用层ApplicationLayer在TCP协议上,当通过三方握手建立了连接之后,就进入数据包的实质发送阶段,在本文中以send命令来阐述。当通过send将数据包发送之后,glibc函数库会启用另外一个其定义的别用名函数__libc_sendto(),该函数最后会间接执行到sendto系统调用:inline_syscall##nr(name,args);//##nr说明是该系统调用带有nr个args参数sendto系统调用的参数值是6,而name就是sendto从上面

3、的分析可以看出glibc将要执行的下面一条语句是inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6)在该函数中一段主要功能实现代码如下:__asm____volatile__("callsys#%0%1=%2%3%4%5%6%7%8":inline_syscall_r0_out_constraint(_sc_0),"=r"(_sc_19),"=r"(_sc_16),"=r"(_sc_17),"=r"(_sc_18),"=r"(_sc_20),"=r"(_sc_21)

4、:"0"(_sc_0),"2"(_sc_16),"3"(_sc_17),"4"(_sc_18),"1"(_sc_19),"5"(_sc_20),"6"(_sc_21):inline_syscall_clobbers);_sc_ret=_sc_0,_sc_err=_sc_19;该代码采用了嵌入汇编详细介绍查阅嵌入汇编相关书籍,其中:_sc_0=sendto;_sc_19--_sc_21分别是arg1-arg6;inline_syscall_r0_out_constraint:功能相当于"=r",选用一个寄存器来存储输

5、出变量。"0"--"6"分别是%0--%6,代表_sc_0--_sc_21接下来函数最终通过Linux中顶顶有名的INT0X80陷入系统核心。具体的过程可以参考内核相关书籍。下面是一个兄弟对INT0X80的简要介绍:在陷入系统内核以后,最终会调用系统所提供的系统调用函数sys_sendto(),该函数直接调用了__sock_sendmsg(),该函数对进程做一个简单的权限检查之后就触发套接字(socket)中定义的虚拟sendmsg的函数,进而进入到下一层传输层处理。Layer4:传输层(TransportLayer)由上

6、层的讨论可知,系统触发了sendmsg虚拟接口函数,其实就是传输层中的tcp_sendmsg或是udp_sendmsg,看你所使用的协议而定。本文介绍tcp_sendmsg().该函数需要做如下工作:1)为sk_buff(后面简称skb)分配空间,该函数首先尝试在套接字缓冲队列中寻找空闲空间,如果找不到就使用tcp_alloc_pskb()为其重新分配空间。2)下面这步就会tcp_sendmsg函数的主要部分了,将数据拷贝到缓冲区。它分为如下两种情况:2.1)如果skb还有剩余空间的话,就使用skb_add_data()来

7、向skb尾部添加数据包。代码如下:if(skb_tailroom(skb)0){/*Wehavesomespaceinskbhead.Superb!*/if(copyskb_tailroom(skb))copy=skb_tailroom(skb);if((err=skb_add_data(skb,from,copy))!=0gotodo_fault;}2.2)如果skb没有了可用空间,内核会使用TCP_PAGE宏来为发送的数据包分配一个高速缓存页空间,当该页被正确地分配后就调用Copy_from_user(to(page地

8、址),from(usr空间),n)将用户空间数据包复制到page所在的地址空间。但是我们都知道数据包在协议层之间的传输是通过skb的,难道将数据包复制到这个新分配的page中,内核就可以去睡大觉了吗?当然不是!接下来内核就要来处理这个问题了,那么怎样来处理呢?此时就需要使用到skb中的另外一个数据区st

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。