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字节。
网友评论