TCP位于五层网络体系中的网络层。TCP是面向字节流的,但传送的数据单元是报文段。
一个TCP报文段分为首部和数据两部分。
TCP报文段的首部的前20个字节是固定的,后面可以根据需要来增加4n字节(n为正数)。
TCP报文段示意图:
TCP报文段的首部格式示意图:
各字段含义如下:
1.源端口:
占2个字节
2.目的端口:
占2个字节
3.序号:
- 占4个字节。
- 在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号。
- 要传送的字节流的起始序号必须在建立连接时设置。
- 首部中的序号字段值指的是本报文段所发送的数据的第一个字节的序号。
- 例如:一个报文段的序号是200,而接待的数据共有100字节。那么,本报文段的数据的第一个字节的序号是201,最后一个字节的序号是300。
4.确认号:
- 占4个字节。
- 是期待收到对方下一个报文段的第一个数据字节的序号。
- 例如:B正确收到了A发送过来的一个报文段,其序号字段值是301,而数据长度为200字节(序号为301~500),也就是说B正确收到了A发送的序号到500的数据。因此,B期望收到的A的下一条数据序号是501,于是B在发送给A的确认报文段中把确认号设置为501。
- 【注意】若确认号为N,也就是说序号到N-1的所有数据已经正确收到。
5.数据偏移:
- 占4位,32个字节
- 指出TCP报文段的数据起始处距离TCP报文段的起始处有多远
- 实际上是TCP报文段的首部长度
- 最大值是60个字节,也是TCP首部的最大长度
6.保留
- 占6位,保留为今后使用,但目前应置为0
7. 6个控制位
- URG: Urgent。
- 当URG = 1,表明紧急指针字段有效 。告诉系统此报文段中有紧急数据,应尽快传送,而不按原来的排队顺序来传送(相当于高优先级的数据)
- 例如,已经发送了很长的一个程序要在远地的主机上运行,但后来发现了一些问题,需要取消该程序的运行,因此用户从键盘发出中断命令。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。
- 发送方TCP把紧急数据插入本报文段数据的最前面,而在其后的仍是普通数据。
- ACK:Acknowlegment。
- 仅当ACK = 1有效,ACK = 0 无效
- TCP规定:在建立连接之后所有的传送的报文段都必须把 ACK 置1
- PSH:Push。
- 希望在键入一个命令立即就能收到对方的响应,发送方 TCP 将 PSH 置1,并立即创建一个报文段发送出去,接收方接收到这种设置的报文段,尽快地交付接收应用进程,不等到整个缓存填满
- RST:Reset。
- 当 RST = 1时,表明 TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接
- RST置1,还用来拒绝一个非法的报文段或拒绝打开一个连接
- SYN:Synchronization。
- 在连接建立时用来同步序号。当SYN = 1,而 ACK = 0,表明是一个连接请求报文段
- 同意建立连接,对方就在响应的报文段中:SYN = 1 和 ACK =1
- FIN:Finish。
- 用来释放一个连接。FIN = 1,表明报文段的发送方的数据已发送完毕,并要求释放运输链接
8. 窗口
- 占2个字节
- 发送本报文段的一方的接收窗口(而不是自己的发送窗口)
- 窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的
- 窗口值作为接收方让发送方设置其发送窗口的依据
- 例如,发送了一个报文段,其确认号是301,窗口字段是500.这就是告诉对方:“301算起,我(即发送方报文段的一方)的接收缓存空间还可接受500个字节数据(字节序号是301~800),你在给我发数据时,必须考虑到这一点。”
- 【注意】窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化
9.检验和
- 占2个字节
- 检验范围包括首部和数据这两部分
- 要在TCP报文段的前面加上12字节的伪首部再计算检验和
- TCP协议号为6
10.紧急指针
- 占2个字节
- 仅在URG=1时有意义
- 指出本报文段中的紧急数据的字节数
- 指出紧急数据的末尾在报文段中的位置
- 【注意】即使窗口为零,也可以发送紧急数据
11.选项
- 长度可变,最长:40字节
- 当没有使用时,TCP首部长度固定:20字节
- 可选项
- 最大报文段长度MSS(Maximum Segment Size):TCP报文段长度减去TCP首部长度
- 窗口扩大选项:
- 占3字节。其中有一个字节表示移位值S。
- 窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。
- 时间戳选项(占10字节)
- 主要的作用:计算往返时间、防止序号绕回
- 最主要的字段:时间戳字段(4字节)和时间戳回送回答字段(4字节)
- 时间戳值字段(4字节)
- 时间戳回送回答字段(4字节)
参考文章: