TCP首部固定长度是20字节,下面还有4字节是可选的。内容很多,但其中有一些我们比较熟悉的:源端口,目标端口。嗯?socket不是还需要IP进行定位吗?IP地址在网络层被附加了。其他的内容后面都会慢慢讲解,作为一篇总结文章,这里放出查阅表,方便复习:
头部参数 字节数 作用源端口和目的端口字段 各占两字节 socket是通过端口号和IP号来进行定义,这里表示发出消息的主机端口以及接收消息的目标主机端口
序号字段 4 字节 TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。长度4字节,所以序号的范围是【0,2^32 - 1】
确认号字段 4字节 是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移(即首部长度) 4位 指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位(以 4 字节为计算单位)
保留字段 6位 保留为今后使用,但目前应置为 0
紧急 URG 1位 当 URG =1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
确认 ACK 1位 只有当 ACK=1 时确认号字段才有效。当 ACK = 0 时,确认号无效。当收到报文需要向发送方发送确认报时设置该标志位为1。
推送 PSH 1位 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
复位 RST 1位 当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
同步 SYN 1位 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
终止 FIN 1位 用来释放一个连接。FIN = 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接
窗口字段 2字节 发送方接收缓存区剩下的字节 数,注意单位是字节。
检验和 2字节 检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。主要是检验报文是否发生了错误,如某个‘1’变成了‘0’。
紧急指针字段 2字节 指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)
选项字段 长度不定 TCP 最初只规定了一种选项,即最大报文段长度 MSS。MSS 告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。”
填充字段 不定 这是为了使整个首部长度是 4 字节的整数倍。
选项字段中包含以下其他选项:
选项 作用窗口扩大选项 占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于 TCP 首部中的窗口位数增大到 (16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小
时间戳选项 占 10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节),主要是用于计算数据报在网络中传输的往返时间。
选择确认选项 接收方收到了和前面的字节流不连续的两个字节块,需要告诉发送方目前已经接收到的数据报范围。每一个段需要两个边界,一个边界需要4字节来表示,选项字段最长是40字节,所以最多可以表示4个已接收的字段。
讲完下面内容,再回来看这些字段就熟悉了。
TCP面向字节流特性