现在我们来看看TCP选项,以及TCP客户端发起连接请求时,发送的第一个TCP包(三次握手协议)的内容。
TCP选项紧跟在基本TCP首部后面,计入首部中的“长度”字段。其基本格式定义是8bit类型+8bit长度+nbit内容,多个选项依次排列。类型用于说明该选项的类型,在2.6.16内核的实现中,有如下的类型定义:
#define TCPOPT_NOP 1
#define TCPOPT_EOL 0
#define TCPOPT_MSS 2
#define TCPOPT_WINDOW 3
#define TCPOPT_SACK_PERM 4
#define TCPOPT_SACK 5
#define TCPOPT_TIMESTAMP 8
TCPOPT_NOP表示无操作,作填充用;TCPOPT_EOL表示选项表结束;TCPOPT_MSS用于通告最大报文段长
度;TCPOPT_WINDOW是窗口扩大因子;TCPOPT_SACK_PERM表示允许SACK(有选择的确认),TCPOPT_SACK表示禁止
SACK。TCPOPT_TIMESTAMP表示时间戳选项。
下面我们分析一下客户端发起的第一个TCP包的内容,它是一个只含有20字节TCP首部和20字节TCP选项的IP数据报,选项用于向服务端通告一些基本的设置信息,用于建立连接。我们剥去以太网首部和IP首部,只看TCP相关的部分,它总共有40字节:
数据报内容 含义
以下为基本TCP首部
80 0c 16位源端口(32780)
13 88 16位目的端口(5000)
00 00 07 bc 由协议栈随机生成的32位序号
00 00 00 00 32位确认序号
a 首部长度(10*4=40)
0 02 4位保留,syn=1表示要发起建立一个新的连接
16 d0 16位窗口大小(5840)
dd 51 16位检验和
00 00 16位紧急指针
以下为TCP选项
02 04 05 b4 最大报文段长度为1460
04 02 允许SACK
08 0a 00 0f 00 60 00 00 00 00 时间戳(时间戳为00 0f 00 60, 时间回显应答为0)
01 无操作,填充
03 03 02 窗口扩大因子为2
阅读(1121) | 评论(0) | 转发(1) |