本文为借阅书籍资料,观看他人博客总结得出,欢迎提问:
一.前期说明
TCP虽然是面向字节流的,但是在网络中的传输单元确实是报文段的格式,一个TCP报文段分为首部和数据两个部分,而协议的全部实现都在TCP报文段的首部体现出来的 。只有先理解首部各个字段的含义,才能正确的理解TCP的工作原理。
如上图,前20个字节是固定的,后面的4n是可变的,所以,TCP首部最小为20字节。
二. 各个字段含义
下面来讨论固定字节部分各个字段的含义:
源端口和目的端口:分别占2字节,写入源进程的端口号,和目的进程的端口号。TCP的分用功能就是通过端口号来实现的。
序号:占4个字节。序号的范围是[0 , 2^31 - 1 ] ,总共有2^32个序号。序号从0开始增长,并采用的是 mod 2^32 的增长方式(即到达最大值,又从零开始)。由于TCP是面向字节流的,所以 ,在一个TCP连接中传输的每一个字节流自然就按照每一个字节进行顺序编号。 首部中的序号字段是指的是本报文段要发出的第一个字节的序号。
确认号:也是占4个字节,是期待下一次发送来的报文段第一个字节的序号。如果此时确认号为N, 则代表到N-1所有序号的数据均已正确收到。
数据偏移:占4位,代表 TCP报文段到TCP报文段数据起始地址的距离。单位为4字节 , 由于 4位最大值为 15 , 而单位为4字节,易知TCP报文段的首部最大值为 60字节 ,而固定为 20字节 ,所以,选项中最大为 40字节。
保留: 占 6位 ,目前全都置零,用作以后使用。
控制位:占六个字节 。
-
URG:(URGent) 紧急:当 URG = 1 ,表示紧急指针字段有效,告诉系统这个报文段中有紧急的数据 。发送方TCP就把紧急数据放在本报文数据的最前面,紧急数据后面仍然是普通数据,配合紧急指针字段使用,表示 紧急数据到哪里结束。
-
ACK(ACKnowlegment) 确认: 仅当 ACK = 1 ,此字段才有效,TCP规定,在建立连接之后 ,所传送的数据报文ACK都要置为1 。
-
PUSH(push) 推送 :这个字段经常在进行可交互式的应用程序中使用比较多 ,在两个应用进程进行通信的时候,用户希望在键入一个命令之后,能够立即得到对方的响应。这时,发送方TCP就可将PUSH 置为 1 。发送方TCP就会立即创建一个报文段, 接收方TCP收到PUSH = 1的报文段,就尽快的交付给应用进程,不等待缓存满了在提交给应用进程 。
-
RST复位:当RST = 1时,表明TCP连接出现了严重的错误(由于主机奔溃,或其他原因),必须释放连接,然后在重新建立连接。
-
SYN(同步):在建立连接时使用来同步序号,当SYN = 1 ,而ACK = 0 时,表明这是一个请求连接报文, 如果对方同意连接,则在响应的报文段中使SYN = 1 和 ACK = 1 。
-
FIN (中止): 用来释放连接 ,当数据发送完毕之后,就将FIN = 1 ,表示要求释放连接。
窗口:占2个字节 ,窗口的值是[ 0 , 2 ^ 16 - 1] 之间的整数。这里的窗口字段指定的是发送本报文段一方的接收窗口。(不是自己的发送窗口)。告诉发送者,从此时的确认号算起,你能发送的最大数据量是多少,之所以要有这个概念,因为接受方的数据缓存空间总是有限的,总之,接受方设置的窗口值,就是作为发送方设置 自己发送窗口大小的依据。窗口一般用作 流量和拥塞控制。
这里需要捋一下概念: 每一方都有两个窗口 ,一个接受窗口,一个发送窗口, 而 发送方报文段中设置的窗口值,是设置接受方的发送窗口。 其实窗口是由 TCP 缓存大小决定的 。
窗口值指明了现在允许对方发送的数据量,窗口值是经常动态变化着的。
检验和:占2个字节 ,检验和字段检验的部分包括数据报的首部和数据部分。和UDP一样,在计算检验和时 ,需要加上12字节的伪首部,伪首部的格式和UDP一样,不过不同的是,应该把UDP伪首部的第4个字段的17改为6(由于TCP协议的版本号是6 )。 把第五个字段中的所记录的UDP长度值改为TCP长度值,接受方接受到此报文段之后,仍然需要加上伪首部进行检验。
紧急指针:占两个字节 , 只有控制字段URG = 1时,才会有意义 。标识的是在这个数据报文中紧急数据的字节数,(紧急数据后后面就是普通数据)。紧急指针指出了在紧急数据末尾的位置。当所有的紧急数据处理完成之后,TCP告诉应用程序恢复到正常操作。但是,需要注意的是,就算是窗口为零的时候,也可以发送紧急数据。
选项: 长度可变 , 最长可以达到 40 字节 , 当没有使用“选项”的时候,TCP首部的长度就是 20字节。
参考:
《计算机网络(第七版)谢希仁著》