《TCP 头部选项功能详解.docx》由会员分享,可在线阅读,更多相关《TCP 头部选项功能详解.docx(6页珍藏版)》请在三一办公上搜索。
1、TCP 头部选项功能详解TCP 头部选项功能详解 TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计的。TCP选项部分最长可以达到40byte,再加上TCP选项外的固定的20byte字节部分,TCP的最长头部可达60byte。TCP头部长度可以通过TCP头部中的“数据偏移”位来查看。 大多数的TCP选项部分出现在TCP连接建立阶段,也就是TCP的三次握手数据包中。当然有些选项也会出现在已经建立连接的 session中,不过此种情况较少出现。 TCP选项部分占有的位数必须是8bit的倍数,这也就是说,即使出现我们应用的选项部分为4bit,但也必须使用4bit的垫片。这
2、样才符合RFC的要求。 TCP选项部分实际运用的有以下几种: 最大报文传输段 窗口扩大选项 选择确认选项 时间戳选项 Nop 下面是一个实际网络中选项部分使用齐全的一个数据包,如图解码部分: 使用wireshark 做出解码的解释: MSS MSS是TCP选项中最经常出现,也是最早出现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,不包括TCP的头部。TCP在三次握手中,每一方都会通告其期望收到的MSS如果一方不接受另一方的MSS值则定位默认值536byte。 MSS值太小或太大都是不合适。太小,例如MSS值只有1byte,那么为了传输
3、这1byte数据,至少要消耗20字节IP头部+20字节TCP头部=40byte,这还不包括其二层头部所需要的开销,显然这种数据传输效率是很低的。MSS过大,导致数据包可以封装很大,那么在IP传输中分片的可能性就会增大,接受方在处理分片包所消耗的资源和处理时间都会增大,如果分片在传输中还发生了重传,那么其网络开销也会增大。因此合理的MSS是至关重要的。MSS的合理值应为保证数据包不分片的最大值。对于以太网MSS可以达到1460byte。与MSS相似的在IP层也有一个类似的概念-MTU下图可以清晰翻译MSS与MTU 的关系: MTU=MSS+TCP Header+IP Header 窗口扩大选项
4、我们知道TCP最大的窗口大小为64Kb,在早期网络这是够用的,但随着各种复杂网络的产生,特别是类似卫星通信这种时延和带宽都比较大的通信而产生,需要更大窗口来满足性能和高吞吐率,于是窗口扩大选项便产生了。 我们用下图一些图来说明为什么需要这个选项,和其主要功能: 我们假设 Host AB 是一条高速的WAN链路。通信距离较远,延时也由于距离的原因变大。A向B发送大量数据,由于有足够带宽,那么A在很短时间内就可以发送完64Kb的数据,而由于窗口过小,A只能停止发送,直到B对A发送的数据进行ACK确认。上面我们可以推算,在time 2-3 和后面的 time 5-6 之间 A-B是没有实际数据发送的
5、。而大量的时间被浪费在了等待对方回应上。 现象我们改进我们的窗口大小,使之变的更大,如下图: 现在我们把窗口扩大到256kb ,我们看到,由于窗口足够大,A可以发送大量的数据报,在其还在忙着发送报文的时间内,对A数据的ACK就已经可以返回了。这样,A-B的通信就避免了消耗大量的等待时间。对TCP的性能改善是巨大的。 Windows scaling 占3个byte,其中的一个字节表示移位值S。新的窗口值等于TCP首部的窗口位数从16增大到。这相当于把窗口值向左移动S位后获得实际的窗口大小。移位值准许使用的最大值是14,相当于窗口最大值增大到65535*214 也就是 1GB。 窗口扩大选项在TC
6、P建立之初进行协商,如果已经实现了窗口扩大,当不再需要其扩大窗口时,发送S=0选项就可以恢复到窗口大小16。 选择确认选项 我们假设TCP传输中有这种情况出现:收到的报文无差错,只是未按序列号,中间还缺少一些序列号,那么能能否只传输缺少的数据,而不重传已经正确到达的数据?这就是选择确认的技术。用下列例子来说明一下: 要传输的数据共5个,分别编号为 1,2,3,4,5。A-B Host。B作为接受者,发现数据接收是这样的 1 3 5。而中间的2和4没有到达,其他都是正确的数据报。那么如果选用SACK,A将只会重传2和4,而不是所有的报文都重传。 SACK选项在TCP建立连接时由SYN数据包中加上
7、“允许SACK”的置为来实现。SACK对原来TCP首部的确认号字段不会产生影响,只是在发生不连续传输中才会使用。 我们知道TCP的数据报文是有字块边界的,例如上面例子,怎么形容丢失的数据包2呢,我们会以1-3之间的数据包说明,也就是说丢失的数据是有左右边界的。而此边界在传输中是用TCP序列号来表示的。由于TCP首部选项部分最多只有40字节,而指明一个边界要用掉4字节,因此在选项中最多只能指明4个字节块的边界信息。这是因为4个字节快要有8个边界。另外还需要2个功能字节,一个字节用来指明使用SACK选项,另一个字节指明这个选项要占多少字节。4*+2=34byte。所以最多只能指出4个字节块边界信息
8、。 时间戳选项 时间戳选项占10个字节,其中最主要的字段时间戳字段和时间戳回送回答字段。 时间戳选项主要的功能有两个: 1 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段, 接收方在确认该报文段时把时间戳字段值复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确计算出RTT。时间戳是一个单调增长的值,接收方只需要回显收到的内容,因此是不需要关注时间戳的单元是什么,也不需要连接双发的时钟同步。 2 PAWS:防止回绕的序号。我们知道序列号只有32位,而每增加232个序列号后就会 重复使用原来用过的序列号。假设我们有一条高速网络,通信的主机双方有足够大的带
9、宽用来快速的传输数据。例如1Gb/s的速率发送报文段,则不到35秒钟数据字节的序列号就会重复。这样对TCP传输带来混乱的情况。这种情况之出现在高速链路上。而采用时间戳选项,可以很容易的分辨出相同序列号的数据报,哪个是最近发送,哪个是以前发送的。 NOP NOP,从字面意思也看出来了,这个字段实际上是没有任何意义的字段。设计该字段主要是用来提供填充垫片。TCP的头部必须是4byte的倍数,但是大多数的TCP选项不是4byte的倍数。假如出现了整个TCP选项部分不是4byte的倍数,那么就需要使用1或多个字节无意义的nop 来填充,使之符合TCP的头部构造的规定。例如,选项部分只有6byte ,2
10、个字节的nop就会用来做垫片。 NOP也会做为分割不同的选项数据,例如我们的TCP会话中同时使用了窗口扩大选项和SACK,那么TCP头部中的SACK的表示部分与窗口扩大选项中的参数之间使用nop隔离。明确不同的选项之间的分割点,因此在一个数据包中出现多个nop 是不奇怪的。 总结 TCP协议是一个设计可靠的,优越的协议,通过TCP的选项部分也可以看到其设计之精妙。TCP的选项部分做为TCP头部的补充满足了对复杂网络和苛刻传输条件的要求。TCP选项在给网络带来性能提升和高可靠的同时,也会被黑客所利用。 例如,每个操作系统都有自己独特的处理TCP选项部分的特点和排序规则。利用这种系统的特殊性结合其
11、他手段可以很容易的识别出是哪种操作系统,对了解和分析主机漏洞提供了更多的参数。 下面摘自 Nmap的一段关于扫描是何种OS的描述: Nmap发送一系列TCP和UDP报文到远程主机,检查响应中的每一个比特。 在进行一打测试如TCP ISN采样,TCP选项支持和排序,IPID采样,和初始窗口大小检查之后, Nmap把结果和数据库nmap-os-fingerprints中超过 1500个已知的操作系统的fingerprints进行比较,如果有匹配,就打印出操作系统的详细信息。此外,TCP选项中的时间戳选项,可以供黑客了解上次主机重启是在什么时候,这样对猜测TCP序列号,并进行TCP的会话劫持提供了必要的参数。 Windows TCP选项的参数可以在注册表中修改,例如我的PC 是win7 系统位置如下: Tcp1323Opts Key: TcpipParameters Value Type: REG_DWORD - number (flags) Valid Range: 0, 1, 2, 3 0 (disable RFC 1323 options) 1 (window scaling enabled only) 2 (timestamps enabled only) 3 (both options enabled)