Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157306
  • 博文数量: 35
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 345
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 21:36
文章存档

2010年(10)

2009年(25)

我的朋友

分类: 系统运维

2009-03-15 09:58:58

对honeyd的tcp协议处理机制继续深入,今天看到了tcp_send()函数,其中有一段处理tcp的option字段的代码,有些不解,决定再复习一下tcp协议。

TCP 传输控制协议概述

       TCP是一种基于IP协议的,提供面向连接的,可靠的,全双工的字节流服务的传输层协议。

       TCP面向连接的概念可以理解为与2层相似的一种虚电路的概念,即在开始使用TCP传输数据之前,必须先建立一个连接(虚电路),在连接建立好之后,双方,也只能是连接的两端两个“端”才能开始进行数据交换。因此,广播和多播是不能应用于TCP的。

TCP的主要特点

       TCP自己组织需要发送的数据块的大小。这一点可能让很多开发者感觉不爽,也是造成很多bug的原因。当应用开发人员使用write或者send发送数据后,其实是将数据拷贝到了kernelTCP的发送缓存中,这之后的事情就完全由TCP来决定了,TCP会把数据划分成它认为最合适的数据块。这个思想是和UDP完全不同的。

       TCP发送一块数据后,它会启动一个定时器timer,等待接收方的确认,如果在timer规定的时间内接收不到确认数据,则重新发送刚才的数据块。

       TCP收到来自另外一端的数据后,它会发送一个针对接受到的数据的确认,通常这个确认会推迟一段时间(非常短的时间)发送出去。

       TCP会始终保持一个整个TCP报文段(包括headerdata)的校验和,用于检测在数据传输中是否出现错误。如果有则丢弃当前收到的这个数据段。

       TCP必须对到达的数据进行排序。

       TCP必须能够丢掉重复的数据段。

       TCP的另外一个非常重要的功能是它可用提供流量控制。它的两端都有一定的固定大小的buffer空间。接手段必须告诉发送端自己所能接收的最大数据,而发送端发送的数据不能超过接收端buffer的大小。

       TCP不对它所传送的字节流做任何解释,它不知道所传送的字节流是二进制还是ASCII字符,这个问题是应用层应该考虑的问题。

TCPHeader主要内容

       首先16位的src port16位的dst port用来区分应用程序。

       TCP Header中两个32位是一个序号与一个确认序号,这两个东西比较难理解。首先序号用来标识从发送端向接收端发送的数据字节流,它表示这个数据段中的第一个数据字节。其实序号就是一个发送端发送数据的计数器,发送端发送的第二个TCP包的序号减去第一个TCP包的序号就可以得出第一个TCP包发送的数据块的大小。序号是一个32位的无符号证书,达到232次方减1后又从0开始。

       需要注意的是,当建立一个TCP连接时,SYN标志变为1,此时序号字段包含了发送方主机选择的出示序号ISN,但是一般情况下这个ISN0,改发送方要发送的数据的第一个字节序号为这个ISN1,因此在建立TCP连接的第一个TCP包中,序号为0,因为ISN0,而建立TCP连接又没有要发送的数据,所以序号为0

       确认序号标识接收方(即发送确认的一方)所期望接收到的下一个序号,也就是它接收到的TCP包的序号加1,并且只有ACK位为1时此确认序号才生效。但是通常情况下这种情况总是正确的,因为一个TCP连接一旦建立,之后的报文中ACK位总会被设置。

       需要注意的是,序号和确认序号是有方向的,因为TCP提供的是全双工的服务,所以在每一个方向上的序号和确认序号都是不同的。

       确认序号其实就是表示已经收到了发送端发送的一些数据,但是当前确认序号所标识的数据还没有收到,这个确认序号可以被发送方用来判断是否需要重发。

       4位的Header长度标识当前TCP包的header长度,最长是60个字节,而正常的TCPheader长度是20字节。

       6位的标志位。URG:紧急指针有效;ACK:确认序号有效;PSH:接收方应该立刻将此包发给应用层;RST:复位一个连接;SYN:发起一个TCP连接;FIN:结束一个连接。

       16位的窗口大小。TCP的流量控制由连接每一端通过声明窗口大小来提供。窗口大小为字节数,从确认序号的值开始。比如一端声明窗口大小为4096,当前的确认序号为10000,则表明这一端当前能接收的最大字节数为4096,而它希望接收从序号10000开始的数据。

       16位的校验和。这个校验和覆盖整个TCP报文。它一定是由发送端来计算和填充的。而且必须由接收端进行验证。

       16位的紧急数据指针,只有当URG标志位为1时才有效。它是一个偏移量,标识从序号开始的直到指针所指的数据,这一段数据被发送端设置为紧急数据。

       TCP Header中还有一些options字段,最常用的是MSS字段,通常是SYN报文中携带这个字段,表明本端所能接收的最大长度的报文段。

       另外需要表明的是,TCP可以不携带任何数据,而且这种报文还很有用,可用用来确认数据,也可以用来处理超时。

 

下面是option字段值的列表


Kind   Meaning                               Reference
----   -------------------------------   ---------
  0       End of Option List                 [RFC793]
  1       No-Operation                       [RFC793]
  2       Maximum Segment Size               [RFC793]
  3       WSOPT - Window Scale              [RFC1323]
  4       SACK Permitted                    [RFC2018]
  5       SACK                              [RFC2018]
  6       Echo (obsoleted by option 8)      [RFC1072]
  7       Echo Reply (obsoleted by option 8)[RFC1072]
  8       TSOPT - Time Stamp Option         [RFC1323]
  9       Partial Order Connection Permitted[RFC1693]
 10       Partial Order Service Profile     [RFC1693]
 11       CC                                [RFC1644]
 12       CC.NEW                            [RFC1644]
 13       CC.ECHO                           [RFC1644]
 14       TCP Alternate Checksum Request    [RFC1146]
 15       TCP Alternate Checksum Data       [RFC1146]
 16       Skeeter                           [Knowles]
 17       Bubba                             [Knowles]
 18       Trailer Checksum Option    [Subbu & Monroe]
 19       MD5 Signature Option              [RFC2385]
 20       SCPS Capabilities                   [Scott]
 21       Selective Negative Acknowledgements [Scott]
 22       Record Boundaries                   [Scott]
 23       Corruption experienced              [Scott]
 24       SNAP                             [Sukonnik]
 25       Unassigned (released 12/18/00)
 26       TCP Compression Filter           [Bellovin]

阅读(8973) | 评论(0) | 转发(0) |
0

上一篇:tcp三次握手

下一篇:最近-李圣杰

给主人留下些什么吧!~~