网络协议栈大作业-TCP的输入代码分析.docx

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络协议栈大作业-TCP的输入代码分析

网络协议栈分析与实现大作业——TCP的输入代码分析姓名:班级:学号:一、概述TCP输入处理详细定义了如何根据连接的当前状态,处理不同的输入报文段。当收到的数据报的协议字段指明这是一个TCP报文段时,ipintr(通过协议转换表中的prinput函数)会调用tcpinput进行处理。tcpinput在软件中断一级执行。接下来先对TCP的整体简要介绍,然后再对输入部分的代码进行分段分析。代码介绍TCP实现代码包括7个头文件,其中定义了大量的TCP结构和常量和6个C文件,包含TCP函数的具体实现代码。如图所示。全局变量二、RST报文段的处理1.tcp_reass函数tp,指向TCP控制块的指针;ti,指向接收报文段IP和TCP首部的指针;m,指向存储接收报文段的mbuf链表的指针。前ti既可以指向由m所指向的mbuf的数据区,也可以指向一个簇。TCP收到一个对SYN的确认时,tcp_input将调用TCP_REASS,并传递一个空的ti指针。这意味着连接已建立,可以把SYN报文段中携带的数据(TCP_REASS已将其放入重组队列)提交给应用程序。连接未建立之前,不允许这样做。遍历从seg_next开始的乱序报文段双向链表,寻找序号大于接收报文段序号(ti_seq)的第一个报文段。注意,for循环体中只包含一个i f语句。如果双向链表中q指向的报文段前还存在报文段,则该报文段有可能与新报文段重复,因此,挪动指针q,令其指向q的前一个报文段,计算重复的字节数,并存储在变量i中:i = q-ti_seq + q-ti_len - ti-ti_seq;= 4 + 5 -7= 2如果i大于0,则链表中原有报文段与新报文段携带的数据间存在重复,如例子中给出的报文段。如果重复的字节数(i)大于或等于新报文段的大小,即新报文段中所有的数据都已包含在原有报文段中,新报文段是重复报文段,应予以丢弃。如果只有部分数据重复(如图2 7 - 1 8所示),m a d j丢弃新报文段起始i字节的数据,并相应更新新报文段的序号和长度。挪动q指针,指向链表中的下一个报文段。mbuf的地址m存储在TCP首部的源端口号和目的端口号中。如果还有后续报文段,则计算新报文段与下一报文段间重复的字节数,并存储在变量i中。代码最后调用insque,把新报文段插入连接的重组双向链表中。如果连接还没有收到SYN (连接处于LISTEN状态或SYN_SENT状态),不允许向应用进程提交数据,函数返回。当函数被宏TCP_REASS 调用时,返回值0被赋给宏的参数f l a g s。t i设定为链表的第一个报文段。如果链表为空,或者第一个报文段的起始序号(t i - ti_seq)不等于连接等待接收的下一序号(rcv_nxt),则函数返回0。如果第二个条件为真,说明在等待接收的下一序号与已收到的数据之间仍然存在缺失报文段。如果连接处于SYN_RCVD状态,且报文段长度非零,则函数返回0。如果两个条件均为真,说明插口在监听过程中收到了携带数据的SYN报文段。数据将保存在连接队列中,等待三次握手过程结束。循环从链表的第一个报文段开始(从前面的测试条件可知,它携带数据的次序已经正确),把数据放入插口的接收缓存,并更新rcv_nxt。当链表为空,或者链表下一报文段的序号又出现差错,即当前处理报文段与下一报文段间存在缺失报文段时,循环结束。此时,f l a g s变量(函数的返回值)等于0或者为T H_F I N,取决于放入插口接收缓存的最后一个报文段中是否带有F I N标志。在所有mbuf都放入插口的接收缓存后, s o r w a k e u p唤醒所有在插口上等待接收数据的应用进程。2.tcp_input函数函数结尾处有3个标注,处理出现差错时控制会跳转到这些地方:dropafterack、dropwithreset和drop。标注中出现的“ drop”指丢弃当前处理的报文段,而非丢弃连接。不过,当控制跳转到dropwithreset时,将发送RST,从而丢弃连接。函数仅有的另一个分支是首部预测算法后的switch语句,如果连接处于LISTEN或SYN_SENT状态时收到了一个有效的SYN报文段,它负责分别进行处理。trimthenstep6处的代码结束后,跳转到step6,继续执行正常的流程。3.预处理从mbuf中获取IP和TCP首部。参数iphlen等于I P首部长度,包括可能的I P选项。如果长度大于2 0字节,可知存在I P选项,调用ipstripoptions丢弃这些选项。TCP忽略除源选路之外的所有I P选项,源选路选项由I P特别保存,TCP能够读取其内容。如果簇中第一个mbuf的容量小于I P / TCP首部大小( 4 0字节),则调用m_pullup,试着把最初的4 0字

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档