美文网首页
TCP-TCP首部

TCP-TCP首部

作者: 长腿小西瓜 | 来源:发表于2018-01-27 16:36 被阅读88次

    1概述

    TCP 是面向连接的运输层协议。它是可靠的,不丢失的,不重复的,无差错并按序到达的,点对点运输的,全双工通信。

    1.1 TCP连接

    将TCP链接的端点,叫做套接字(socket),表示方法如下:

    套接字 socket = (IP地址:端口号)

    所以TCP连接未两个套接字之间的连接:

    TCP连接 ::= {socket1, socket2} = {(IP1: port1),(IP2: port2)}

    1.2 TCP首部

    报文段首部格式

    TCP首部有20个字节的固定数据,用来存放报文传输过程所需的信息。各字段的含义如下:

    1.2.1 源端口,目的端口

    各占2个字节。

    1.2.2 序号

    又叫“报文段序号”,占4个字节。因为TCP是面向字节的,尽管一次报文传输的字节数不同,但是每个数据段的字节都有对应的序号。
    比如,发送方,该字段值是1001,发送的数据为1000字节,这这段数据开始字节的序号是1001,最后一个字节的序号2000。

    1.2.3 确认号

    占4个字节,是期望发送方下一个报文第一个字节的序号值。

    例如接收方接受到发送方的报文,其中序号字段值是2001,数据区长度为2000个字节。那么接受下次接受发送发送的报文中,开始的序号值,应该是4001。所以在接收方回答上述报文时,会在确认号字段写:4001。

    所以,如果确认号是N,则表示N-1个序号的字节数据已成功接收。

    确认号占4个字节,可以对4GB的数据进行编号。

    1.2.4 数据偏移

    占4位,表示报文中除开有效数据段,报文首部的长度。所以数据偏移的最小值是20字节(固定首部)。

    注意,数据偏移的计算单位是32位字,即4字节长的字。所以对于,占4位的数据偏移字段。最大值是:15 * 4 = 60字节。

    1.2.5 保留

    占6位,目前置为0,今后使用

    1.2.6 控制位

    共有6个控制位,意义分别如下:

    1.2.6.1 紧急URG

    占1位,当URG值为1时,发送方应用程序,告诉发送方的TCP有紧急数据需要处理,TCP就将紧急数据放到数据区的最前面。紧跟其后是普通数据。

    1.2.6.2 确认ACK

    占1位,当连接建立后,ACK必须置为1,仅当ACK=1时,确认号才有效。当ACK=0,确认号是1。
    这是因为确认号是希望下次接受到的数据第一个字节序号,但是ACK=0时,连接都还没建立,不可能传送有效数据。

    1.2.6.3 推送PSH

    占1位,当PSH值为1时,发送方会立即创建一个报文段发送出去,接收方接收到PSH字段为1的值时,会立即将该报文中的数据交付接收应用程序,不用等到整个缓存填满了后再向上交付。

    1.2.6.4 复位RST

    占1位,当RST置为1时,用来拒绝一个非法的报文段和拒绝打开一个连接,RST也可称为重建位或者重置位。

    1.2.6.5 同步SYN

    占1位,用在连接建立时同步序号。当SYN置为1时,表示连接请求或连接接受报文。

    1.2.6.6 终止FIN

    当FIN=1,表示发送发的数据已发送完毕,请求释放连接。

    1.2.7 窗口

    占2个字节,作为接收方让发送方设置起发送窗口的依据,以字节为单位。

    例如,发送了一个报文段,起确认号1001(期望下一个收到的报文中,数据区第一个字节的序号是1001),窗口字段是1000。就是告诉对方:“从1001开始,我最多只能接受1000个字节的数据,你发送数据的时候考虑下这点。”

    窗口值时动态变化的。

    1.2.8 校验和

    发送方在发送报文前,会加上在前面加12字节的伪首部,计算校验和。然后写入该字段。当接收方接收到数据,同样计算校验和。

    1.2.9 紧急指针

    占2个字节。在URG=1时,表示紧急数据的长度,指出了紧急数据的末尾在报文段的位置。

    当窗口值为0时,也可以发送紧急数据。

    1.2.10 选项

    1.2.10.1 MSS

    Maximum Segement Sie, 即最大报文段,但是正确的含义,是最大的数据区长度。当不设置,默认是536字节。所以互联网中的主机,都可以接收的报文段长度是536+20(固定首部)=556字节。

    1.2.10.2 窗口扩大

    占3个字节,其中有一个字节表示移位值S。新的窗口值等于 2^(16 + S)。

    1.2.10.3 时间戳,时间戳回送回答

    • 计算RTT
      用时间戳回送回答字段,减去时间戳字段值,就能得出报文往返的时间。

    • PAWS
      防止序号绕回。即在序号重复时,利用该字段区别是新报文,还是迟到的报文。

    1.2.10.3 SACK

    Selective Acknowledgment,选择确认。

    选择确认的例子

    从上图看出,每个不连续字节块有2个边界。我们知道首部选项长度最长为40(60- 20)字节。指明一个边界需要4个字节,所以最多能指明4个不连续字节块的边界信息( 4 * 4 * 2 =32字节 )。

    这是因为,指明5个不连续字节块的边界信息,则需要 (4 * 5 * 2 = 40个字节),而头部还需要两个字节,一个用来指明SACK选项,一个用来指明SACK占用的字节数。那么总数变成40+2= 42字节,这超过了报文允许的最大选项长度40字节。

    相关文章

      网友评论

          本文标题:TCP-TCP首部

          本文链接:https://www.haomeiwen.com/subject/csrnaxtx.html